ZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMRGVidWdIZWxwZXIuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMRGVidWdIZWxwZXIuamF2YQppbmRleCAwOWI1ODc4Li4xOGExZTczIDEwMDY0NAotLS0gYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTERlYnVnSGVscGVyLmphdmEKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xEZWJ1Z0hlbHBlci5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX0NIRUNLX1RIUkVBRCA9ICgxIDw8IDEpOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgaWYgYWxsIGNhbGxzIGFyZSBvbiB0aGUgc2FtZSB0aHJlYWQuCisgICAgICogUHJpbnQgYXJndW1lbnQgbmFtZXMgd2hlbiBsb2dnaW5nIEdMIENhbGxzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR19MT0dfQVJHVU1FTlRfTkFNRVMgPSAoMSA8PCAyKTsKIApkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xTdXJmYWNlVmlldy5qYXZhIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xTdXJmYWNlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzUzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFN1cmZhY2VWaWV3LmphdmEKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3BlbmdsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitwdWJsaWMgY2xhc3MgR0xTdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVOREVSTU9ERV9XSEVOX0RJUlRZID0gMDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSRU5ERVJNT0RFX0NPTlRVT1VTTFkgPSAxOworCisgICAgLyoqCisgICAgICogQ2hlY2sgZ2xFcnJvcigpIGFmdGVyIGV2ZXJ5IEdMIGNhbGwuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVCVUdfQ0hFQ0tfR0xfRVJST1IgPSAxOworCisgICAgLyoqCisgICAgICogTG9nIEdMIGNhbGxzIHRvIHRoZSBzeXN0ZW0gbG9nIGF0ICJ2ZXJib3NlIiBsZXZlbCB3aXRoIHRhZyAiR0xTdXJmYWNlVmlldyIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVCVUdfTE9HX0dMX0NBTExTID0gMjsKKworICAgIHB1YmxpYyBHTFN1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHB1YmxpYyBHTFN1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworICAgICAgICAvLyBJbnN0YWxsIGEgU3VyZmFjZUhvbGRlci5DYWxsYmFjayBzbyB3ZSBnZXQgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gdW5kZXJseWluZyBzdXJmYWNlIGlzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAorICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlciA9IGdldEhvbGRlcigpOworICAgICAgICBob2xkZXIuYWRkQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIGhvbGRlci5zZXRUeXBlKFN1cmZhY2VIb2xkZXIuU1VSRkFDRV9UWVBFX0dQVSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbFdyYXBwZXIgdG8gYSBuZXcgdmFsdWUuIFRoZSBjdXJyZW50IGdsV3JhcHBlciBpcyB1c2VkCisgICAgICogd2hlbmV2ZXIgYSBzdXJmYWNlIGlzIGNyZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuCisgICAgICogQHBhcmFtIGdsV3JhcHBlciB0aGUgbmV3IEdMV3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdMV3JhcHBlcihHTFdyYXBwZXIgZ2xXcmFwcGVyKSB7CisgICAgICAgIG1HTFdyYXBwZXIgPSBnbFdyYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1ZyBmbGFncyB0byBhIG5ldyB2YWx1ZS4gVGhlIGRlYnVnIGZsYWdzIHRha2UgZWZmZWN0CisgICAgICogd2hlbmV2ZXIgYSBzdXJmYWNlIGlzIGNyZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHplcm8uCisgICAgICogQHBhcmFtIGRlYnVnRmxhZ3MgdGhlIG5ldyBkZWJ1ZyBmbGFncworICAgICAqIEBzZWUgI0RFQlVHX0NIRUNLX0dMX0VSUk9SCisgICAgICogQHNlZSAjREVCVUdfTE9HX0dMX0NBTExTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdGbGFncyhpbnQgZGVidWdGbGFncykgeworICAgICAgICBtRGVidWdGbGFncyA9IGRlYnVnRmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWJ1Z0ZsYWdzKCkgeworICAgICAgICByZXR1cm4gbURlYnVnRmxhZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZW5kZXJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWV3LiBDYW4gb25seSBiZSBjYWxsZWQgb25jZS4KKyAgICAgKiBAcGFyYW0gcmVuZGVyZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihSZW5kZXJlciByZW5kZXJlcikgeworICAgICAgICBpZiAobUdMVGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldFJlbmRlcmVyIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgICAgIG1HTFRocmVhZCA9IG5ldyBHTFRocmVhZChyZW5kZXJlcik7CisgICAgICAgIG1HTFRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVuZGVyaW5nIG1vZGUuIFdoZW4gdGhlIHJlbmRlck1vZGUgaXMKKyAgICAgKiBSRU5ERVJNT0RFX0NPTlRJTlVPVVNMWSwgdGhlIHJlbmRlcmVyIGlzIGNhbGxlZAorICAgICAqIHJlcGVhdGVkbHkgdG8gcmUtcmVuZGVyIHRoZSBzY2VuZS4gV2hlbiB0aGUgcmVuZGVybW9kZQorICAgICAqIGlzIFJFTkRFUk1PREVfV0hFTl9ESVJUWSwgdGhlIHJlbmRlcmVyIG9ubHkgcmVuZGVyZWQgd2hlbiB0aGUgc3VyZmFjZQorICAgICAqIGlzIGNyZWF0ZWQsIG9yIHdoZW4gcmVxdWVzdFJlbmRlciBpcyBjYWxsZWQuIERlZmF1bHRzIHRvIFJFTkRFUk1PREVfQ09OVElOVU9VU0xZLgorICAgICAqIEBwYXJhbSByZW5kZXJNb2RlIG9uZSBvZiB0aGUgUkVOREVSTU9ERV9YIGNvbnN0YW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbmRlck1vZGUoaW50IHJlbmRlck1vZGUpIHsKKyAgICAgICAgbUdMVGhyZWFkLnNldFJlbmRlck1vZGUocmVuZGVyTW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJlbmRlcmluZyBtb2RlLiBNYXkgYmUgY2FsbGVkCisgICAgICogZnJvbSBhbnkgdGhyZWFkLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIGEgcmVuZGVyZXIgaGFzIGJlZW4gc2V0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVuZGVyZXIgd2lsbCByZW5kZXIgY29udGludW91c2x5LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVuZGVyTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1HTFRocmVhZC5nZXRSZW5kZXJNb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCB0aGF0IHRoZSByZW5kZXJlciByZW5kZXIgYSBmcmFtZS4gTWF5IGJlIGNhbGxlZAorICAgICAqIGZyb20gYW55IHRocmVhZC4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBhIHJlbmRlcmVyIGhhcyBiZWVuIHNldC4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByZW5kZXIgbW9kZSBoYXMgYmVlbiBzZXQgdG8KKyAgICAgKiBmYWxzZSwgc28gdGhhdCBmcmFtZXMgYXJlIG9ubHkgcmVuZGVyZWQgb24gZGVtYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RSZW5kZXIoKSB7CisgICAgICAgIG1HTFRocmVhZC5yZXF1ZXN0UmVuZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgbUdMVGhyZWFkLnN1cmZhY2VDcmVhdGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAvLyBTdXJmYWNlIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gd2UgcmV0dXJuCisgICAgICAgIG1HTFRocmVhZC5zdXJmYWNlRGVzdHJveWVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBtR0xUaHJlYWQub25XaW5kb3dSZXNpemUodywgaCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoZSB2aWV3IHRoYXQgdGhlIGFjdGl2aXR5IGlzIHBhdXNlZC4gVGhlIG93bmVyIG9mIHRoaXMgdmlldyBtdXN0CisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBwYXVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgbUdMVGhyZWFkLm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm0gdGhlIHZpZXcgdGhhdCB0aGUgYWN0aXZpdHkgaXMgcmVzdW1lZC4gVGhlIG93bmVyIG9mIHRoaXMgdmlldyBtdXN0CisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyByZXN1bWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBtR0xUaHJlYWQub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBhbiAiZXZlbnQiIHRvIGJlIHJ1biBvbiB0aGUgR0wgcmVuZGVyaW5nIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gciB0aGUgcnVubmFibGUgdG8gYmUgcnVuIG9uIHRoZSBHTCByZW5kZXJpbmcgdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHF1ZXVlRXZlbnQoUnVubmFibGUgcikgeworICAgICAgICBtR0xUaHJlYWQucXVldWVFdmVudChyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgbUdMVGhyZWFkLnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgR0xXcmFwcGVyIHsKKyAgICAgIEdMIHdyYXAoR0wgZ2wpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEEgZ2VuZXJpYyByZW5kZXJlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBFR0wgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGRlc2lyZWQgYnkgdGhlIHJlbmRlcmVyLgorICAgICAgICAgKi8KKyAgICAgICAgaW50W10gZ2V0Q29uZmlnU3BlYygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdXJmYWNlIGNyZWF0ZWQuCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXJmYWNlIGlzIGNyZWF0ZWQuIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgKiBzdGFydHMsIGFuZCB3aGVuZXZlciB0aGUgR1BVIGlzIHJlaW5pdGlhbGl6ZWQuIFRoaXMgd2lsbAorICAgICAgICAgKiB0eXBpY2FsbHkgaGFwcGVuIHdoZW4gdGhlIGRldmljZSBhd2FrZXMgYWZ0ZXIgZ29pbmcgdG8gc2xlZXAuCisgICAgICAgICAqIFNldCB5b3VyIHRleHR1cmVzIGhlcmUuCisgICAgICAgICAqIEBwYXJhbSBnbCB0aGUgR0wgaW50ZXJmYWNlLiBVc2UgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gdG8KKyAgICAgICAgICogdGVzdCBpZiB0aGUgaW50ZXJmYWNlIHN1cHBvcnRzIEdMMTEgb3IgaGlnaGVyIGludGVyZmFjZXMuCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgdGhlIEVHTENvbmZpZyBvZiB0aGUgY3JlYXRlZCBzdXJmYWNlLiBDYW4gYmUgdXNlZAorICAgICAgICAgKiB0byBjcmVhdGUgbWF0Y2hpbmcgcGJ1ZmZlcnMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZyk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTdXJmYWNlIGNoYW5nZWQgc2l6ZS4KKyAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBzdXJmYWNlIGlzIGNyZWF0ZWQgYW5kIHdoZW5ldmVyCisgICAgICAgICAqIHRoZSBPcGVuR0wgRVMgc3VyZmFjZSBzaXplIGNoYW5nZXMuIFNldCB5b3VyIHZpZXdwb3J0IGhlcmUuCisgICAgICAgICAqIEBwYXJhbSBnbCB0aGUgR0wgaW50ZXJmYWNlLiBVc2UgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gdG8KKyAgICAgICAgICogdGVzdCBpZiB0aGUgaW50ZXJmYWNlIHN1cHBvcnRzIEdMMTEgb3IgaGlnaGVyIGludGVyZmFjZXMuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERyYXcgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgICAgICAqIEBwYXJhbSBnbCB0aGUgR0wgaW50ZXJmYWNlLiBVc2UgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gdG8KKyAgICAgICAgICogdGVzdCBpZiB0aGUgaW50ZXJmYWNlIHN1cHBvcnRzIEdMMTEgb3IgaGlnaGVyIGludGVyZmFjZXMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIEVHTCBoZWxwZXIgY2xhc3MuCisgICAgICovCisKKyAgICBwcml2YXRlIGNsYXNzIEVnbEhlbHBlciB7CisgICAgICAgIHB1YmxpYyBFZ2xIZWxwZXIoKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIEVHTCBmb3IgYSBnaXZlbiBjb25maWd1cmF0aW9uIHNwZWMuCisgICAgICAgICAqIEBwYXJhbSBjb25maWdTcGVjCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydChpbnRbXSBjb25maWdTcGVjKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBHZXQgYW4gRUdMIGluc3RhbmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1FZ2wgPSAoRUdMMTApIEVHTENvbnRleHQuZ2V0RUdMKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbERpc3BsYXkgPSBtRWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBtRWdsLmVnbEluaXRpYWxpemUobUVnbERpc3BsYXksIHZlcnNpb24pOworCisgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKKyAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgbUVnbC5lZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGNvbmZpZ1NwZWMsIGNvbmZpZ3MsIDEsCisgICAgICAgICAgICAgICAgICAgIG51bV9jb25maWcpOworICAgICAgICAgICAgbUVnbENvbmZpZyA9IGNvbmZpZ3NbMF07CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBPcGVuR0wgRVMgY29udGV4dC4gVGhpcyBtdXN0IGJlIGRvbmUgb25seSBvbmNlLCBhbgorICAgICAgICAgICAgKiBPcGVuR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBtRWdsQ29udGV4dCA9IG1FZ2wuZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQsIG51bGwpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZWFjdCB0byB0aGUgY3JlYXRpb24gb2YgYSBuZXcgc3VyZmFjZSBieSBjcmVhdGluZyBhbmQgcmV0dXJuaW5nIGFuCisgICAgICAgICAqIE9wZW5HTCBpbnRlcmZhY2UgdGhhdCByZW5kZXJzIHRvIHRoYXQgc3VyZmFjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBHTCBjcmVhdGVTdXJmYWNlKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIFRoZSB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcKKyAgICAgICAgICAgICAqICBzdXJmYWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBVbmJpbmQgYW5kIGRlc3Ryb3kgdGhlIG9sZCBFR0wgc3VyZmFjZSwgaWYKKyAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgc3VyZmFjZSB3ZSBjYW4gcmVuZGVyIGludG8uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gbUVnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICBtRWdsQ29uZmlnLCBob2xkZXIsIG51bGwpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBtRWdsQ29udGV4dCk7CisKKworICAgICAgICAgICAgR0wgZ2wgPSBtRWdsQ29udGV4dC5nZXRHTCgpOworICAgICAgICAgICAgaWYgKG1HTFdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdsID0gbUdMV3JhcHBlci53cmFwKGdsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtRGVidWdGbGFncyAmIChERUJVR19DSEVDS19HTF9FUlJPUiB8IERFQlVHX0xPR19HTF9DQUxMUykpIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb25maWdGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgV3JpdGVyIGxvZyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKChtRGVidWdGbGFncyAmIERFQlVHX0NIRUNLX0dMX0VSUk9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZsYWdzIHw9IEdMRGVidWdIZWxwZXIuQ09ORklHX0NIRUNLX0dMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG1EZWJ1Z0ZsYWdzICYgREVCVUdfTE9HX0dMX0NBTExTKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyA9IG5ldyBMb2dXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2wgPSBHTERlYnVnSGVscGVyLndyYXAoZ2wsIGNvbmZpZ0ZsYWdzLCBsb2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc3BsYXkgdGhlIGN1cnJlbnQgcmVuZGVyIHN1cmZhY2UuCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGNvbnRleHQgaGFzIGJlZW4gbG9zdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN3YXAoKSB7CisgICAgICAgICAgICBtRWdsLmVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBbHdheXMgY2hlY2sgZm9yIEVHTF9DT05URVhUX0xPU1QsIHdoaWNoIG1lYW5zIHRoZSBjb250ZXh0CisgICAgICAgICAgICAgKiBhbmQgYWxsIGFzc29jaWF0ZWQgZGF0YSB3ZXJlIGxvc3QgKEZvciBpbnN0YW5jZSBiZWNhdXNlCisgICAgICAgICAgICAgKiB0aGUgZGV2aWNlIHdlbnQgdG8gc2xlZXApLiBXZSBuZWVkIHRvIHNsZWVwIHVudGlsIHdlCisgICAgICAgICAgICAgKiBnZXQgYSBuZXcgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIG1FZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVnbENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVnbERpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FZ2wuZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKKyAgICAgICAgICAgICAgICBtRWdsRGlzcGxheSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFR0wxMCBtRWdsOworICAgICAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OworICAgICAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOworICAgICAgICBFR0xDb25maWcgbUVnbENvbmZpZzsKKyAgICAgICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGdlbmVyaWMgR0wgVGhyZWFkLiBUYWtlcyBjYXJlIG9mIGluaXRpYWxpemluZyBFR0wgYW5kIEdMLiBEZWxlZ2F0ZXMKKyAgICAgKiB0byBhIFJlbmRlcmVyIGluc3RhbmNlIHRvIGRvIHRoZSBhY3R1YWwgZHJhd2luZy4gQ2FuIGJlIGNvbmZpZ3VyZWQgdG8KKyAgICAgKiByZW5kZXIgY29udGludW91c2x5IG9yIG9uIHJlcXVlc3QuCisgICAgICoKKyAgICAgKi8KKyAgICBjbGFzcyBHTFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIEdMVGhyZWFkKFJlbmRlcmVyIHJlbmRlcmVyKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XaWR0aCA9IDA7CisgICAgICAgICAgICBtSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIG1SZXF1ZXN0UmVuZGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIG1SZW5kZXJNb2RlID0gUkVOREVSTU9ERV9DT05UVU9VU0xZOworICAgICAgICAgICAgbVJlbmRlcmVyID0gcmVuZGVyZXI7CisgICAgICAgICAgICBzZXROYW1lKCJHTFRocmVhZCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXaGVuIHRoZSBhbmRyb2lkIGZyYW1ld29yayBsYXVuY2hlcyBhIHNlY29uZCBpbnN0YW5jZSBvZgorICAgICAgICAgICAgICogYW4gYWN0aXZpdHksIHRoZSBuZXcgaW5zdGFuY2UncyBvbkNyZWF0ZSgpIG1ldGhvZCBtYXkgYmUKKyAgICAgICAgICAgICAqIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGluc3RhbmNlIHJldHVybnMgZnJvbSBvbkRlc3Ryb3koKS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIHNlbWFwaG9yZSBlbnN1cmVzIHRoYXQgb25seSBvbmUgaW5zdGFuY2UgYXQgYSB0aW1lCisgICAgICAgICAgICAgKiBhY2Nlc3NlcyBFR0wuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzRWdsU2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ3VhcmRlZFJ1bigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhydSBhbmQgZXhpdCBub3JtYWxseQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzRWdsU2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBndWFyZGVkUnVuKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1FZ2xIZWxwZXIgPSBuZXcgRWdsSGVscGVyKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBvcGVuZ2wgc2Vzc2lvbgorICAgICAgICAgICAgICogYW5kIGdyYWIgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzIGlzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludFtdIGNvbmZpZ1NwZWMgPSBtUmVuZGVyZXIuZ2V0Q29uZmlnU3BlYygpOworICAgICAgICAgICAgbUVnbEhlbHBlci5zdGFydChjb25maWdTcGVjKTsKKworICAgICAgICAgICAgR0wxMCBnbCA9IG51bGw7CisgICAgICAgICAgICBib29sZWFuIHRlbGxSZW5kZXJlclN1cmZhY2VDcmVhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdGVsbFJlbmRlcmVyU3VyZmFjZUNoYW5nZWQgPSB0cnVlOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBpcyBvdXIgbWFpbiBhY3Rpdml0eSB0aHJlYWQncyBsb29wLCB3ZSBnbyB1bnRpbAorICAgICAgICAgICAgICogYXNrZWQgdG8gcXVpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd2hpbGUgKCFtRG9uZSkgeworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgVXBkYXRlIHRoZSBhc3luY2hyb25vdXMgc3RhdGUgKHdpbmRvdyBzaXplKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCB3LCBoOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZDsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRTdGFydCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSByOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHIgPSBnZXRFdmVudCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByLnJ1bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRWdsSGVscGVyLmZpbmlzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmVlZFRvV2FpdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gbVNpemVDaGFuZ2VkOworICAgICAgICAgICAgICAgICAgICB3ID0gbVdpZHRoOworICAgICAgICAgICAgICAgICAgICBoID0gbUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbVNpemVDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0UmVuZGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZWVkU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVnbEhlbHBlci5zdGFydChjb25maWdTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgdGVsbFJlbmRlcmVyU3VyZmFjZUNyZWF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2wgPSAoR0wxMCkgbUVnbEhlbHBlci5jcmVhdGVTdXJmYWNlKGdldEhvbGRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVsbFJlbmRlcmVyU3VyZmFjZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGVsbFJlbmRlcmVyU3VyZmFjZUNyZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLm9uU3VyZmFjZUNyZWF0ZWQoZ2wsIG1FZ2xIZWxwZXIubUVnbENvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIHRlbGxSZW5kZXJlclN1cmZhY2VDcmVhdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0ZWxsUmVuZGVyZXJTdXJmYWNlQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXIub25TdXJmYWNlQ2hhbmdlZChnbCwgdywgaCk7CisgICAgICAgICAgICAgICAgICAgIHRlbGxSZW5kZXJlclN1cmZhY2VDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodyA+IDApICYmIChoID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZHJhdyBhIGZyYW1lIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLm9uRHJhd0ZyYW1lKGdsKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBPbmNlIHdlJ3JlIGRvbmUgd2l0aCBHTCwgd2UgbmVlZCB0byBjYWxsIHN3YXBCdWZmZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICogdG8gaW5zdHJ1Y3QgdGhlIHN5c3RlbSB0byBkaXNwbGF5IHRoZSByZW5kZXJlZCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbUVnbEhlbHBlci5zd2FwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGNsZWFuLXVwIGV2ZXJ5dGhpbmcuLi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbEhlbHBlci5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9XYWl0KCkgeworICAgICAgICAgICAgaWYgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVBhdXNlZCB8fCAoISBtSGFzU3VyZmFjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtV2lkdGggPiAwKSAmJiAobUhlaWdodCA+IDApICYmIChtUmVxdWVzdFJlbmRlciB8fCAobVJlbmRlck1vZGUgPT0gUkVOREVSTU9ERV9DT05UVU9VU0xZKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVuZGVyTW9kZShpbnQgcmVuZGVyTW9kZSkgeworICAgICAgICAgICAgaWYgKCAhKChSRU5ERVJNT0RFX1dIRU5fRElSVFkgPD0gcmVuZGVyTW9kZSkgJiYgKHJlbmRlck1vZGUgPD0gUkVOREVSTU9ERV9DT05UVU9VU0xZKSkgKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVuZGVyTW9kZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyTW9kZSA9IHJlbmRlck1vZGU7CisgICAgICAgICAgICAgICAgaWYgKHJlbmRlck1vZGUgPT0gUkVOREVSTU9ERV9DT05UVU9VU0xZKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVuZGVyTW9kZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1SZW5kZXJNb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFJlbmRlcigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RSZW5kZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1IYXNTdXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1IYXNTdXJmYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uV2luZG93UmVzaXplKGludCB3LCBpbnQgaCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gaDsKKyAgICAgICAgICAgICAgICBtU2l6ZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdEV4aXRBbmRXYWl0KCkgeworICAgICAgICAgICAgLy8gZG9uJ3QgY2FsbCB0aGlzIGZyb20gR0xUaHJlYWQgdGhyZWFkIG9yIGl0IGlzIGEgZ3VhcmFudGVlZAorICAgICAgICAgICAgLy8gZGVhZGxvY2shCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgam9pbigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXVlIGFuICJldmVudCIgdG8gYmUgcnVuIG9uIHRoZSBHTCByZW5kZXJpbmcgdGhyZWFkLgorICAgICAgICAgKiBAcGFyYW0gciB0aGUgcnVubmFibGUgdG8gYmUgcnVuIG9uIHRoZSBHTCByZW5kZXJpbmcgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcXVldWVFdmVudChSdW5uYWJsZSByKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1FdmVudFF1ZXVlLmFkZChyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUnVubmFibGUgZ2V0RXZlbnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRXZlbnRRdWV1ZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRG9uZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1QYXVzZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzU3VyZmFjZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgICAgICBwcml2YXRlIGludCBtUmVuZGVyTW9kZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1ZXN0UmVuZGVyOworICAgICAgICBwcml2YXRlIFJlbmRlcmVyIG1SZW5kZXJlcjsKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8UnVubmFibGU+IG1FdmVudFF1ZXVlID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKKyAgICAgICAgcHJpdmF0ZSBFZ2xIZWxwZXIgbUVnbEhlbHBlcjsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTG9nV3JpdGVyIGV4dGVuZHMgV3JpdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBmbHVzaEJ1aWxkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgICAgIGZsdXNoQnVpbGRlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBjb3VudCkgeworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBidWZbb2Zmc2V0ICsgaV07CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZsdXNoQnVpbGRlcigpIHsKKyAgICAgICAgICAgIGlmIChtQnVpbGRlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBMb2cudigiR0xTdXJmYWNlVmlldyIsIG1CdWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1CdWlsZGVyLmRlbGV0ZSgwLCBtQnVpbGRlci5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlbWFwaG9yZSBzRWdsU2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNpemVDaGFuZ2VkID0gdHJ1ZTsKKworICAgIHByaXZhdGUgR0xUaHJlYWQgbUdMVGhyZWFkOworICAgIHByaXZhdGUgR0xXcmFwcGVyIG1HTFdyYXBwZXI7CisgICAgcHJpdmF0ZSBpbnQgbURlYnVnRmxhZ3M7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFUuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMVS5qYXZhCmluZGV4IGZmMjc0MWEuLjAxNTJmNDIgMTAwNjQ0Ci0tLSBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMVS5qYXZhCisrKyBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMVS5qYXZhCkBAIC04NSwxOCArODUsMTcgQEAKICAgICAgICAgZnkgKj0gcmxmOwogICAgICAgICBmeiAqPSBybGY7CiAKLSAgICAgICAgLy8gTm9ybWFsaXplIHVwCi0gICAgICAgIGZsb2F0IHJsdXAgPSAxLjBmIC8gTWF0cml4Lmxlbmd0aCh1cFgsIHVwWSwgdXBaKTsKLSAgICAgICAgdXBYICo9IHJsdXA7Ci0gICAgICAgIHVwWSAqPSBybHVwOwotICAgICAgICB1cFogKj0gcmx1cDsKLQogICAgICAgICAvLyBjb21wdXRlIHMgPSBmIHggdXAgKHggbWVhbnMgImNyb3NzIHByb2R1Y3QiKQotCiAgICAgICAgIGZsb2F0IHN4ID0gZnkgKiB1cFogLSBmeiAqIHVwWTsKICAgICAgICAgZmxvYXQgc3kgPSBmeiAqIHVwWCAtIGZ4ICogdXBaOwogICAgICAgICBmbG9hdCBzeiA9IGZ4ICogdXBZIC0gZnkgKiB1cFg7Ci0KKyAgICAgICAgCisgICAgICAgIC8vIGFuZCBub3JtYWxpemUgcworICAgICAgICBmbG9hdCBybHMgPSAxLjBmIC8gTWF0cml4Lmxlbmd0aChzeCwgc3ksIHN6KTsKKyAgICAgICAgc3ggKj0gcmxzOworICAgICAgICBzeSAqPSBybHM7CisgICAgICAgIHN6ICo9IHJsczsKKyAgICAgICAgCiAgICAgICAgIC8vIGNvbXB1dGUgdSA9IHMgeCBmCiAgICAgICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7CiAgICAgICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliR0xFU19DTS9nbF93cmFwcGVyLmNwcCBiL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwCmluZGV4IDVkYTRmOWEuLjNiN2Y0NWUgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwCisrKyBiL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwCkBAIC0zNzMsNiArMzczLDcgQEAKIAogc3RhdGljIHNwPEdQVVJldm9rZVJlcXVlc3Rlcj4gZ1Jldm9rZXJDYWxsYmFjazsKIAorCiBzdGF0aWMgcmVxdWVzdF9ncHVfdCogZ3B1X2FjcXVpcmUodm9pZCogdXNlcikKIHsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZXJ2ZXIoIGdldFN1cmZhY2VGbGluZ2VyKCkgKTsKQEAgLTM4Myw3ICszODQsMTAgQEAKICAgICB9CiAgICAgCiAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCBpbmZvOwotICAgIGdSZXZva2VyQ2FsbGJhY2sgPSBuZXcgR1BVUmV2b2tlUmVxdWVzdGVyKCk7CisgICAgCisgICAgaWYgKGdSZXZva2VyQ2FsbGJhY2sgPT0gMCkKKyAgICAgICAgZ1Jldm9rZXJDYWxsYmFjayA9IG5ldyBHUFVSZXZva2VSZXF1ZXN0ZXIoKTsKKwogICAgIHN0YXR1c190IGVyciA9IHNlcnZlci0+cmVxdWVzdEdQVShnUmV2b2tlckNhbGxiYWNrLCAmaW5mbyk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICBMT0dEKCJyZXF1ZXN0R1BVIHJldHVybmVkICVkIiwgZXJyKTsKQEAgLTU0OSw2ICs1NTMsMjEgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBFR0xpbnQgY29uZmlnVG9VbmlxdWVJZChlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgaW50IGksIGludCBpbmRleCkgCit7CisgICAgLy8gTk9URTogdGhpcyBtYXBwaW5nIHdvcmtzIG9ubHkgaWYgd2UgaGF2ZSBubyBtb3JlIHRoYW4gdHdvIEVHTGltcGwKKyAgICByZXR1cm4gKGk+MCA/IGRwLT5udW1Db25maWdzWzBdIDogMCkgKyBpbmRleDsKK30KKworc3RhdGljIHZvaWQgdW5pcXVlSWRUb0NvbmZpZyhlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgRUdMaW50IGNvbmZpZ0lkLAorICAgICAgICBpbnQmIGksIGludCYgaW5kZXgpIAoreworICAgIC8vIE5PVEU6IHRoaXMgbWFwcGluZyB3b3JrcyBvbmx5IGlmIHdlIGhhdmUgbm8gbW9yZSB0aGFuIHR3byBFR0xpbXBsCisgICAgc2l6ZV90IG51bUNvbmZpZ3MgPSBkcC0+bnVtQ29uZmlnc1swXTsKKyAgICBpID0gY29uZmlnSWQgLyBudW1Db25maWdzOworICAgIGluZGV4ID0gY29uZmlnSWQgJSBudW1Db25maWdzOworfQorCiBzdGF0aWMgaW50IGNtcF9jb25maWdzKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQgKmIpCiB7CiAgICAgRUdMQ29uZmlnIGMwID0gKihFR0xDb25maWcgY29uc3QgKilhOwpAQCAtNTU3LDcgKzU3Niw3IEBACiB9CiAKIHN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlbmRvclN0cmluZyAgICAgPSAiQW5kcm9pZCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZXJzaW9uU3RyaW5nICAgID0gIjEuMiBBbmRyb2lkIE1FVEEtRUdMIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlcnNpb25TdHJpbmcgICAgPSAiMS4zIEFuZHJvaWQgTUVUQS1FR0wiOwogc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnQ2xpZW50QXBpU3RyaW5nICA9ICJPcGVuR0wgRVMiOwogCiBzdHJ1Y3QgZXh0ZW50aW9uX21hcF90IHsKQEAgLTgzNCw3ICs4NTMsMTMgQEAKICAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuaHciLCB2YWx1ZSwgIjEiKTsKICAgICAgICAgaWYgKGF0b2kodmFsdWUpICE9IDApIHsKICAgICAgICAgICAgIGNueC0+aG9va3MgPSAmZ0hvb2tzW0lNUExfSEFSRFdBUkVdOwotICAgICAgICAgICAgY254LT5kc28gPSBsb2FkX2RyaXZlcigibGliaGdsLnNvIiwgY254LT5ob29rcyk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5wcm9maWxlciIsIHZhbHVlLCAiMCIpOworICAgICAgICAgICAgaWYgKGF0b2kodmFsdWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJoZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HVygiVXNpbmcgaW5zdHJ1bWVudGVkIGgvdyBPcGVuR0wgRVMgbGlicmFyeSIpOworICAgICAgICAgICAgICAgIGNueC0+ZHNvID0gbG9hZF9kcml2ZXIoImxpYmhnbGQuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPR0QoIjNEIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBkaXNhYmxlZCIpOwogICAgICAgICB9CkBAIC04NjQsNiArODg5LDggQEAKICAgICAgICAgCiAgICAgICAgIGQtPmRweXNbSU1QTF9IQVJEV0FSRV0gPSBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RGlzcGxheShkaXNwbGF5KTsKICAgICAgICAgaWYgKGQtPmRweXNbSU1QTF9IQVJEV0FSRV0gPT0gRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgICAgIExPR0UoImgvdyBhY2NlbGVyYXRlZCBlZ2xHZXREaXNwbGF5KCkgZmFpbGVkICglcykiLAorICAgICAgICAgICAgICAgICAgICBlZ2xfc3RyZXJyb3IoY254LT5ob29rcy0+ZWdsLmVnbEdldEVycm9yKCkpKTsKICAgICAgICAgICAgIGRsY2xvc2UoKHZvaWQqKWNueC0+ZHNvKTsKICAgICAgICAgICAgIGNueC0+ZHNvID0gMDsKICAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZmFpbHVyZSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IGFnYWluCkBAIC05MDAsNyArOTI3LDEwIEBACiAgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKICAgICAgICAgY254LT5tYWpvciA9IC0xOwogICAgICAgICBjbngtPm1pbm9yID0gLTE7Ci0gICAgICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmhvb2tzLT5lZ2wuZWdsSW5pdGlhbGl6ZSgKKyAgICAgICAgaWYgKCFjbngtPmRzbykgCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbEluaXRpYWxpemUoCiAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sICZjbngtPm1ham9yLCAmY254LT5taW5vcikpIHsKIAogICAgICAgICAgICAgLy9MT0dEKCJpbml0aWFsaXplZCAlZCBkcHk9JXAsIHZlcj0lZC4lZCwgY254PSVwIiwKQEAgLTkxMiwxMCArOTQyLDEwIEBACiAgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0udmVyc2lvbiA9CiAgICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfVkVSU0lPTik7CiAgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0uZXh0ZW5zaW9ucyA9IHN0cmR1cCgKLSAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9FWFRFTlNJT05TKSk7CisgICAgICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZyhkcC0+ZHB5c1tpXSwgRUdMX0VYVEVOU0lPTlMpKTsKICAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS5jbGllbnRBcGkgPQogICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZyhkcC0+ZHB5c1tpXSwgRUdMX0NMSUVOVF9BUElTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBEeW5hbWljYWxseSBpbnNlcnQgZXh0ZW5zaW9ucyB3ZSBrbm93IGFib3V0CiAgICAgICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbFN3YXBSZWN0YW5nbGVBTkRST0lEKQogICAgICAgICAgICAgICAgIGFkZF9leHRlbnNpb24oZHAsIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zLApAQCAtOTI0LDEyICs5NTQsMTUgQEAKICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmdDb25maWdBTkRST0lEKQogICAgICAgICAgICAgICAgIGFkZF9leHRlbnNpb24oZHAsIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIkVHTF9BTkRST0lEX3F1ZXJ5X3N0cmluZ19jb25maWciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIiVkOiBlZ2xJbml0aWFsaXplKCkgZmFpbGVkICglcykiLCAKKyAgICAgICAgICAgICAgICAgICAgaSwgZWdsX3N0cmVycm9yKGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgICAgICAgICAKKwogICAgIC8vIEJ1aWxkIHRoZSBleHRlbnNpb24gbGlzdCB0aGF0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgY29uZmlnLgogICAgIC8vIEl0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2Ygb3VyIGV4dGVuc2lvbiBsaXN0IGFuZCB0aGUKLSAgICAvLyB1bmRlcmxheWluZyBFR0wncyBleHRlbnNpb25zIGxpc3QKKyAgICAvLyB1bmRlcmx5aW5nIEVHTCdzIGV4dGVuc2lvbnMgbGlzdAogICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwogICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgewogICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CkBAIC05NTEsMTAgKzk4NCwxMCBAQAogICAgICAgICAgICAgfSB3aGlsZSAoKnApOwogICAgICAgICAgICAgZnJlZSgodm9pZCopb3VyX2V4dGVuc2lvbnNfb3JnKTsKIAotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSB0cmFpbGxpbmcgd2hpdGUgc3BhY2UKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgdHJhaWxpbmcgd2hpdGUgc3BhY2UKICAgICAgICAgICAgIGlmIChleHRlbnNpb25zX2NvbmZpZ1swXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IGwgPSBzdHJsZW4oZXh0ZW5zaW9uc19jb25maWcpIC0gMTsgLy8gbmV3IHNpemUKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zX2NvbmZpZ1tsXSA9IDA7IC8vIHJlbW92ZSB0aGUgdHJhaWxsaW5nIHdoaXRlIHNwYWNlCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWdbbF0gPSAwOyAvLyByZW1vdmUgdGhlIHRyYWlsaW5nIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWcgPSAoY2hhciopcmVhbGxvYyhleHRlbnNpb25zX2NvbmZpZywgbCsxKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWcgPSAoY2hhciopcmVhbGxvYyhleHRlbnNpb25zX2NvbmZpZywgMSk7CkBAIC0xMDY1LDE1ICsxMDk4LDc0IEBACiAgICAgICAgIHJldHVybiBFR0xfVFJVRTsKICAgICB9CiAKKyAgICBFR0xpbnQgbjsKICAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKICAgICAqbnVtX2NvbmZpZyA9IDA7CisKKyAgICAKKyAgICAvLyBJdCBpcyB1bmZvcnR1bmF0ZSwgYnV0IHdlIG5lZWQgdG8gcmVtYXAgdGhlIEVHTF9DT05GSUdfSURzLCAKKyAgICAvLyB0byBkbyAgdGhpcywgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBhdHRyaWJfbGlzdCBhcnJheSBvbmNlCisgICAgLy8gdG8gZmlndXJlIG91dCBib3RoIGl0cyBzaXplIGFuZCBpZiBpdCBjb250YWlucyBhbiBFR0xfQ09ORklHX0lECisgICAgLy8ga2V5LiBJZiBzbywgdGhlIGZ1bGwgYXJyYXkgaXMgY29waWVkIGFuZCBwYXRjaGVkLgorICAgIC8vIE5PVEU6IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBvY2N1cnJlbmNlCisgICAgLy8gb2YgRUdMX0NPTkZJR19JRC4KKyAgICAKKyAgICBFR0xpbnQgcGF0Y2hfaW5kZXggPSAtMTsKKyAgICBHTGludCBhdHRyOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICB3aGlsZSAoKGF0dHI9YXR0cmliX2xpc3Rbc2l6ZV0pKSB7CisgICAgICAgIGlmIChhdHRyID09IEVHTF9DT05GSUdfSUQpCisgICAgICAgICAgICBwYXRjaF9pbmRleCA9IHNpemU7CisgICAgICAgIHNpemUgKz0gMjsKKyAgICB9CisgICAgaWYgKHBhdGNoX2luZGV4ID49IDApIHsKKyAgICAgICAgc2l6ZSArPSAyOyAvLyB3ZSBuZWVkIGNvcHkgdGhlIHNlbnRpbmVsIGFzIHdlbGwKKyAgICAgICAgRUdMaW50KiBuZXdfbGlzdCA9IChFR0xpbnQqKW1hbGxvYyhzaXplKnNpemVvZihFR0xpbnQpKTsKKyAgICAgICAgaWYgKG5ld19saXN0ID09IDApCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKKyAgICAgICAgbWVtY3B5KG5ld19saXN0LCBhdHRyaWJfbGlzdCwgc2l6ZSpzaXplb2YoRUdMaW50KSk7CisKKyAgICAgICAgLy8gcGF0Y2ggdGhlIHJlcXVlc3RlZCBFR0xfQ09ORklHX0lECisgICAgICAgIGludCBpLCBpbmRleDsKKyAgICAgICAgRUdMaW50JiBjb25maWdJZChuZXdfbGlzdFtwYXRjaF9pbmRleCsxXSk7CisgICAgICAgIHVuaXF1ZUlkVG9Db25maWcoZHAsIGNvbmZpZ0lkLCBpLCBpbmRleCk7CisgICAgICAgIAorICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGlmIChjbngtPmRzbykgeworICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGRwLT5jb25maWdzW2ldW2luZGV4XSwgCisgICAgICAgICAgICAgICAgICAgIEVHTF9DT05GSUdfSUQsICZjb25maWdJZCk7CisKKyAgICAgICAgICAgIC8vIGFuZCBzd2l0Y2ggdG8gdGhlIG5ldyBsaXN0CisgICAgICAgICAgICBhdHRyaWJfbGlzdCA9IGNvbnN0X2Nhc3Q8Y29uc3QgRUdMaW50ICo+KG5ld19saXN0KTsKKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBtYXRjaCBpcworICAgICAgICAgICAgLy8gZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBob3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIGl0IHdvdWxkIGJlCisgICAgICAgICAgICAvLyByZWplY3RlZCBiZWNhdXNlIG9mIHRoZSBvdGhlciBhdHRyaWJ1dGVzLCBzbyB3ZSBkbyBoYXZlIHRvIGNhbGwKKyAgICAgICAgICAgIC8vIGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoKSAtLSBidXQgd2UgZG9uJ3QgaGF2ZSB0byBsb29wCisgICAgICAgICAgICAvLyB0aHJvdWdoIGFsbCB0aGUgRUdMaW1wbFtdLgorICAgICAgICAgICAgLy8gV2UgYWxzbyBrbm93IHdlIGNhbiBvbmx5IGdldCBhIHNpbmdsZSBjb25maWcgYmFjaywgYW5kIHdlIGtub3cKKyAgICAgICAgICAgIC8vIHdoaWNoIG9uZS4KKworICAgICAgICAgICAgcmVzID0gY254LT5ob29rcy0+ZWdsLmVnbENob29zZUNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGF0dHJpYl9saXN0LCBjb25maWdzLCBjb25maWdfc2l6ZSwgJm4pOworICAgICAgICAgICAgaWYgKHJlcyAmJiBuPjApIHsKKyAgICAgICAgICAgICAgICAvLyBuIGhhcyB0byBiZSAwIG9yIDEsIGJ5IGNvbnN0cnVjdGlvbiwgYW5kIHdlIGFscmVhZHkga25vdworICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNvbmZpZyBpdCB3aWxsIHJldHVybiAoc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lKS4KKyAgICAgICAgICAgICAgICBjb25maWdzWzBdID0gTUFLRV9DT05GSUcoaSwgaW5kZXgpOworICAgICAgICAgICAgICAgICpudW1fY29uZmlnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyZWUoY29uc3RfY2FzdDxFR0xpbnQgKj4oYXR0cmliX2xpc3QpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKICAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOwogICAgICAgICBpZiAoY254LT5kc28pIHsKLSAgICAgICAgICAgIEVHTGludCBuOwogICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoCi0gICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsICZuKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGF0dHJpYl9saXN0LCBjb25maWdzLCBjb25maWdfc2l6ZSwgJm4pKSB7CiAgICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gY29udmVydCB0aGVzZSBjbGllbnQgRUdMQ29uZmlnIHRvIG91cgogICAgICAgICAgICAgICAgIC8vIGludGVybmFsIEVHTENvbmZpZyBmb3JtYXQuIFRoaXMgaXMgZG9uZSBpbiBPKG4gbG9nIG4pLgogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8biA7IGorKykgewpAQCAtMTEwMiw2ICsxMTk0LDEzIEBACiAgICAgaW50IGk9MCwgaW5kZXg9MDsKICAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKICAgICBpZiAoIWNueCkgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAKKyAgICBpZiAoYXR0cmlidXRlID09IEVHTF9DT05GSUdfSUQpIHsKKyAgICAgICAgLy8gRUdMX0NPTkZJR19JRHMgbXVzdCBiZSB1bmlxdWUsIGp1c3QgdXNlIHRoZSBvcmRlciBvZiB0aGUgc2VsZWN0ZWQKKyAgICAgICAgLy8gRUdMQ29uZmlnLgorICAgICAgICAqdmFsdWUgPSBjb25maWdUb1VuaXF1ZUlkKGRwLCBpLCBpbmRleCk7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CiAgICAgcmV0dXJuIGNueC0+aG9va3MtPmVnbC5lZ2xHZXRDb25maWdBdHRyaWIoCiAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBhdHRyaWJ1dGUsIHZhbHVlKTsKIH0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKaW5kZXggMTJmYWU2My4uY2UzMTg1NCAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIC8vIHNvIGZvciBub3csIHdlIGp1c3QgbG9vc2UgaXQuCiAgICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOwogCi0gICAgLy8gaXQgd291bGQgYmUgbmljZSBpZCB3ZSBjb3VsZCBrZWVwIHRoZSBnZW5lcmF0ZV9taXBtYXAgZmxhZworICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQga2VlcCB0aGUgZ2VuZXJhdGVfbWlwbWFwIGZsYWcsCiAgICAgLy8gd2Ugd291bGQgaGF2ZSB0byBnZW5lcmF0ZSB0aGVtIHJpZ2h0IG5vdyB0aG91Z2guCiAgICAgZ2VuZXJhdGVfbWlwbWFwID0gR0xfRkFMU0U7CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogCiB2b2lkIEVHTFN1cmZhY2VNYW5hZ2VyOjpkZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKQogewotICAgIC8vIGZyZWUgYWxsIHRleHVyZXMKKyAgICAvLyBmcmVlIGFsbCB0ZXh0dXJlcwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykgewogICAgICAgICBjb25zdCBHTHVpbnQgdCgqdG9rZW5zKyspOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAgYi9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcAppbmRleCAxZjY3NTdkLi44ZmE3NTY2IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcApAQCAtMTExNiw4ICsxMTE2LDggQEAKICAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeyAvLyBuZWVkcyB0ZXh0dXJlIHRyYW5zZm9ybXMKICAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRTsKICAgICB9Ci0gICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlKSB7IC8vIG5lZWRzIGV5ZSBjb29yZHMKLSAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOworICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSB8fCAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSkgeyAKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOyAvLyBuZWVkcyBleWUgY29vcmRzCiAgICAgfQogICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB3YW50KTsKIApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwIGIvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCmluZGV4IDg1NGE0OWUuLjNlOGRjYTkgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvZWdsLmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxHTEVTL2VnbC5oPgogCiAjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAogI2luY2x1ZGUgImNvbnRleHQuaCIKICNpbmNsdWRlICJzdGF0ZS5oIgpAQCAtNTcsNyArNTgsNyBAQAogI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKIG5hbWVzcGFjZSBnbCB7CiBwdGhyZWFkX2tleV90IGdHTEtleSA9IC0xOwotfTsgLy8gbmFtc3BhY2UgZ2wKK307IC8vIG5hbWVzcGFjZSBnbAogI2VuZGlmCiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CkBAIC0xNTYsNyArMTU3LDcgQEAKIGVnbF9zdXJmYWNlX3Q6OmVnbF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCiAgICAgICAgIEVHTENvbmZpZyBjb25maWcsCiAgICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQpCi0gICAgOiBtYWdpYygweDMxNDE1MjY1KSwgZHB5KGRweSksIGNvbmZpZyhjb25maWcpLCBjdHgoMCkKKyAgICA6IG1hZ2ljKE1BR0lDKSwgZHB5KGRweSksIGNvbmZpZyhjb25maWcpLCBjdHgoMCkKIHsKICAgICBkZXB0aC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwogICAgIGRlcHRoLmRhdGEgPSAwOwpAQCAtMjQwLDcgKzI0MSw3IEBACiB7CiAgICAgdWludDMyX3QgZmxhZ3MgPSBuYXRpdmVXaW5kb3ctPnN3YXBCdWZmZXJzKG5hdGl2ZVdpbmRvdyk7CiAgICAgaWYgKGZsYWdzICYgRUdMX05BVElWRVNfRkxBR19TSVpFX0NIQU5HRUQpIHsKLSAgICAgICAgLy8gVE9ETzogd2UgcHJvYmFseSBzaG91bGQgcmVzZXQgdGhlIHN3YXAgcmVjdCBoZXJlCisgICAgICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IHNob3VsZCByZXNldCB0aGUgc3dhcCByZWN0IGhlcmUKICAgICAgICAgLy8gaWYgdGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkCiAgICAgICAgIC8vICAgIHdpbmRvdy0+c2V0U3dhcFJlY3RhbmdsZShSZWN0KGluZm8udywgaW5mby5oKSk7CiAgICAgICAgIGlmIChkZXB0aC5kYXRhKSB7CkBAIC00MDIsMTIgKzQwMywxMyBAQAogewogICAgIHNpemVfdCBzaXplID0gdypoOwogICAgIHN3aXRjaCAoZikgewotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OiAgICAgIHNpemUgKj0gMjsgYnJlYWs7Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODogICAgc2l6ZSAqPSA0OyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJpbmNvbXBhdGlibGUgcGl4ZWwgZm9ybWF0IGZvciBwYnVmZmVyIChmb3JtYXQ9JWQpIiwgZik7Ci0gICAgICAgIHBidWZmZXIuZGF0YSA9IDA7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfQV84OiAgICAgICAgICBzaXplICo9IDE7IGJyZWFrOworICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTogICAgICBzaXplICo9IDI7IGJyZWFrOworICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OiAgICBzaXplICo9IDQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiaW5jb21wYXRpYmxlIHBpeGVsIGZvcm1hdCBmb3IgcGJ1ZmZlciAoZm9ybWF0PSVkKSIsIGYpOworICAgICAgICAgICAgcGJ1ZmZlci5kYXRhID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBwYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CiAgICAgcGJ1ZmZlci53aWR0aCAgID0gdzsKQEAgLTQ4OCwyOCArNDkwLDI4IEBACiB9OwogCiBzdGF0aWMgY29uc3QgZXh0ZW50aW9uX21hcF90IGdFeHRlbnRpb25NYXBbXSA9IHsKLSAgICB7ICJlZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZWdsU3dhcFJlY3RhbmdsZUFORFJPSUQgfSwKLSAgICB7ICJnbERyYXdUZXhzT0VTIiwgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c09FUyB9LAotICAgIHsgImdsRHJhd1RleGlPRVMiLCAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpT0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4Zk9FUyIsICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXh4T0VTIiwgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eE9FUyB9LAotICAgIHsgImdsRHJhd1RleHN2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzdk9FUyB9LAotICAgIHsgImdsRHJhd1RleGl2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpdk9FUyB9LAotICAgIHsgImdsRHJhd1RleGZ2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmdk9FUyB9LAotICAgIHsgImdsRHJhd1RleHh2T0VTIiwgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4dk9FUyB9LAotICAgIHsgImdsUXVlcnlNYXRyaXh4T0VTIiwgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbFF1ZXJ5TWF0cml4eE9FUyB9LAotICAgIHsgImdsQ2xpcFBsYW5lZiIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZWYgfSwKLSAgICB7ICJnbENsaXBQbGFuZXgiLCAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xDbGlwUGxhbmV4IH0sCi0gICAgeyAiZ2xCaW5kQnVmZmVyIiwgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQmluZEJ1ZmZlciB9LAotICAgIHsgImdsQnVmZmVyRGF0YSIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlckRhdGEgfSwKLSAgICB7ICJnbEJ1ZmZlclN1YkRhdGEiLCAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCdWZmZXJTdWJEYXRhIH0sCi0gICAgeyAiZ2xEZWxldGVCdWZmZXJzIiwgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRGVsZXRlQnVmZmVycyB9LAotICAgIHsgImdsR2VuQnVmZmVycyIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEdlbkJ1ZmZlcnMgfSwKKyAgICB7ICJlZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCIsICAgICh2b2lkKCopKCkpJmVnbFN3YXBSZWN0YW5nbGVBTkRST0lEIH0sCisgICAgeyAiZ2xEcmF3VGV4c09FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzT0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4aU9FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpT0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4Zk9FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmT0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4eE9FUyIsICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4c3ZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzdk9FUyB9LAorICAgIHsgImdsRHJhd1RleGl2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aXZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhmdk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGZ2T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4eHZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4dk9FUyB9LAorICAgIHsgImdsUXVlcnlNYXRyaXh4T0VTIiwgICAgICAgICAgKHZvaWQoKikoKSkmZ2xRdWVyeU1hdHJpeHhPRVMgfSwKKyAgICB7ICJnbENsaXBQbGFuZWYiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5lZiB9LAorICAgIHsgImdsQ2xpcFBsYW5leCIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xDbGlwUGxhbmV4IH0sCisgICAgeyAiZ2xCaW5kQnVmZmVyIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJpbmRCdWZmZXIgfSwKKyAgICB7ICJnbEJ1ZmZlckRhdGEiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyRGF0YSB9LAorICAgIHsgImdsQnVmZmVyU3ViRGF0YSIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCdWZmZXJTdWJEYXRhIH0sCisgICAgeyAiZ2xEZWxldGVCdWZmZXJzIiwgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERlbGV0ZUJ1ZmZlcnMgfSwKKyAgICB7ICJnbEdlbkJ1ZmZlcnMiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsR2VuQnVmZmVycyB9LAogfTsKIAogLyogCiAgKiBJbiB0aGUgbGlzdHMgYmVsb3csIGF0dHJpYnV0ZXMgbmFtZXMgTVVTVCBiZSBzb3J0ZWQuCi0gKiBBZGRpdGlubmFseSwgYWxsIGNvbmZpZ3MgbXVzdCBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCisgKiBBZGRpdGlvbmFsbHksIGFsbCBjb25maWdzIG11c3QgYmUgc29ydGVkIGFjY29yZGluZyB0bwogICogdGhlIEVHTCBzcGVjaWZpY2F0aW9uLgogICovCiAKQEAgLTUxNyw5ICs1MTksMTAgQEAKICAgICAgICAgeyBFR0xfU1RFTkNJTF9TSVpFLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9DT05GSUdfQ0FWRUFULCAgICAgICAgICAgICAgRUdMX1NMT1dfQ09ORklHICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX0xFVkVMLCAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1dJRFRILCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsICAgICAgICAgCisgICAgICAgICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TKkdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9OQVRJVkVfUkVOREVSQUJMRSwgICAgICAgICAgRUdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLCAgICAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgICAgICB9LApAQCAtNTM2LDQ5ICs1MzksNzIgQEAKIH07CiAKIC8vIFRoZXNlIGNvbmZpZ3MgY2FuIG92ZXJyaWRlIHRoZSBiYXNlIGF0dHJpYnV0ZSBsaXN0CisvLyBOT1RFOiB3aGVuIGFkZGluZyBhIGNvbmZpZyBoZXJlLCBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIGVnbENyZWF0ZSpTdXJmYWNlKCkKIAogc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzBfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgNiB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QSVhNQVBfQklUIH0sCisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDYgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMV9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAgICA2IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAgICAxIH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BJWE1BUF9CSVQgfSwKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAxNiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgNiB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMSB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKIH07CiAKIHN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgICAgMzIgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgICAgIDIgfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgRUdMX1dJTkRPV19CSVQgfCBFR0xfUElYTUFQX0JJVCB9LAorICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAyIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAogfTsKIAogc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzNfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAzMiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgMyB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QSVhNQVBfQklUIH0sCisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMzIgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDMgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNF9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA0IH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzVfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgOCB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKIH07CiAKIHN0YXRpYyBjb25maWdzX3QgY29uc3QgZ0NvbmZpZ3NbXSA9IHsKQEAgLTU4Niw2ICs2MTIsOCBAQAogICAgICAgICB7IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMV9hdHRyaWJ1dGVfbGlzdCkgfSwKICAgICAgICAgeyBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzJfYXR0cmlidXRlX2xpc3QpIH0sCiAgICAgICAgIHsgY29uZmlnXzNfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0KSB9LAorICAgICAgICB7IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfNF9hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzVfYXR0cmlidXRlX2xpc3QpIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnX21hbmFnZW1lbnRfdCBjb25zdCBnQ29uZmlnTWFuYWdlbWVudFtdID0gewpAQCAtNjY5LDcgKzY5Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhdHRyaWJ1dGUgbm9udCBmb3VuZC4gdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLgorICAgICAgICAgICAgLy8gYXR0cmlidXRlIG5vdCBmb3VuZC4gdGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLgogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gZXJyb3IsIHRoaXMgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QKQEAgLTc3OSwxMSArODA3LDE5IEBACiAgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAogICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKICAgICB9CiAKLSAgICAvLyBYWFg6IHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwaXhlbEZvcm1hdCBoZXJlIGp1c3QgeWV0LgorICAgIC8vIEZJWE1FOiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcGl4ZWxGb3JtYXQgaGVyZSBqdXN0IHlldC4KICAgICAvLyAoaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzdXJmYWNlIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCkKICAgICAvLyBtYXliZSB0aGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBwYWdlLWZsaXAKICAgICAvL2lmIChFR0xpbnQoaW5mby5mb3JtYXQpICE9IHBpeGVsRm9ybWF0KQpAQCAtODQwLDYgKzg3NiwxNCBAQAogICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKICAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CiAgICAgfQpAQCAtODk2LDYgKzk0MCwxNCBAQAogICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKICAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CiAgICAgfQpAQCAtOTc5LDcgKzEwMzEsNyBAQAogICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7CiAgICAgZWdsX2Rpc3BsYXlfdCYgZCA9IGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KGRweSk7CiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmZC5pbml0aWFsaXplZCkgPT0gMSkgewotICAgICAgICAvLyBUT0RPOiBkZXN0cm95IGFsbCByZXNvdXJjZXMgKHN1cmZhY2VzLCBjb250ZXh0ZXMsIGV0Yy4uLikKKyAgICAgICAgLy8gVE9ETzogZGVzdHJveSBhbGwgcmVzb3VyY2VzIChzdXJmYWNlcywgY29udGV4dHMsIGV0Yy4uLikKICAgICAgICAgLy9wdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwogICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKICAgICB9CkBAIC0xMTA1LDExICsxMTU3LDcgQEAKIEVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKIHsKLSAgICAvLyBub25lIG9mIG91ciBjb25maWdzIHN1cHBvcnQgcGJ1ZmZlcnMKLSAgICAvLyAoaW4gZmFjdCBpdCdzIHdvcmtpbmcgYnV0IHNpbmNlIHdlIGNhbid0IHVzZSB0aGVtIGFzIAotICAgIC8vIHRleHR1cmVzIHlldCwgaXQncyBub3QgdXNlZnVsIGF0IGFsbCkKLSAgICAvL2NyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJfbGlzdCk7Ci0gICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworICAgIHJldHVybiBjcmVhdGVQYnVmZmVyU3VyZmFjZShkcHksIGNvbmZpZywgYXR0cmliX2xpc3QpOwogfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBFR0xCb29sZWFuIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGVnbFN1cmZhY2UpCkBAIC0xMjMxLDYgKzEyNzksMTMgQEAKICAgICB9CiAKICAgICBFR0xDb250ZXh0IGN1cnJlbnRfY3R4ID0gRUdMX05PX0NPTlRFWFQ7CisgICAgCisgICAgaWYgKChyZWFkID09IEVHTF9OT19TVVJGQUNFICYmIGRyYXcgPT0gRUdMX05PX1NVUkZBQ0UpICYmIChjdHggIT0gRUdMX05PX0NPTlRFWFQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKworICAgIGlmICgocmVhZCAhPSBFR0xfTk9fU1VSRkFDRSB8fCBkcmF3ICE9IEVHTF9OT19TVVJGQUNFKSAmJiAoY3R4ID09IEVHTF9OT19DT05URVhUKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7CisKICAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSB7CiAgICAgICAgIC8vIGlmIHdlJ3JlIGRldGFjaGluZywgd2UgbmVlZCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgIGN1cnJlbnRfY3R4ID0gKEVHTENvbnRleHQpZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwpAQCAtMTQ4Niw3ICsxNTQxLDcgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW5kcm9pZCBleHRlbnRpb25zCisvLyBBbmRyb2lkIGV4dGVuc2lvbnMKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCAoKmVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSkpKCkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwIGIvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKaW5kZXggODc3MjVjYi4uMjVjNDFkMCAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKQEAgLTExNywxMSArMTE3LDExIEBACiB9CiAKIHN0YXRpYyBHTGZpeGVkIGZvZ19saW5lYXIob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopIHsKLSAgICByZXR1cm4gY2xhbXBGKGdnbE11bHgoKGMtPmZvZy5lbmQgLSB6KSwgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQpKTsKKyAgICByZXR1cm4gY2xhbXBGKGdnbE11bHgoKGMtPmZvZy5lbmQgLSAoKHo8MCk/LXo6eikpLCBjLT5mb2cuaW52RW5kTWludXNTdGFydCkpOwogfQogCiBzdGF0aWMgR0xmaXhlZCBmb2dfZXhwKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7Ci0gICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCB6KSk7CisgICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCAoKHo8MCk/LXo6eikpKTsKICAgICByZXR1cm4gY2xhbXBGKGdnbEZsb2F0VG9GaXhlZChmYXN0ZXhwZigtZSkpKTsKIH0KIApAQCAtNTU2LDExICs1NTYsMTEgQEAKICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgR0xfRk9HX1NUQVJUOgotICAgICAgICBjLT5mb2cuc3RhcnQgPSBnZ2xDbGFtcHgocGFyYW0pOworICAgICAgICBjLT5mb2cuc3RhcnQgPSBwYXJhbTsKICAgICAgICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSBnZ2xSZWNpcChjLT5mb2cuZW5kIC0gYy0+Zm9nLnN0YXJ0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBHTF9GT0dfRU5EOgotICAgICAgICBjLT5mb2cuZW5kID0gZ2dsQ2xhbXB4KHBhcmFtKTsKKyAgICAgICAgYy0+Zm9nLmVuZCA9IHBhcmFtOwogICAgICAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IGdnbFJlY2lwKGMtPmZvZy5lbmQgLSBjLT5mb2cuc3RhcnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEdMX0ZPR19NT0RFOgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwIGIvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwCmluZGV4IDQ0MWRhMzguLmYxNzVjZGEgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKQEAgLTk4LDggKzk4LDkgQEAKICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpID8KICAgICAgICAgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEIDogb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0Q7CiAgICAgaWYgKGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkgewotICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpID8KLSAgICAgICAgICAgIG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFogOiBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFo7CisgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWjsKKyAgICAgICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzJkdHTF9FTkFCTEVfRk9HKSkKKyAgICAgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFo7CiAgICAgfQogICAgIGlmICgoYy0+YXJyYXlzLnZlcnRleC5zaXplICE9IDQpICYmCiAgICAgICAgIChjLT50cmFuc2Zvcm1zLm12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikpIHsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAgYi9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwCmluZGV4IDIwZThkMzcuLmYxNjRjMDIgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcApAQCAtMTMzLDcgKzEzMyw3IEBACiB7CiAgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewogICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPndpbmRvdy56KTsKKyAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CiAgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKICAgICAgICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKICAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYtPmNvbG9yLnYsIGNwKTsKQEAgLTE0NCwxNCArMTQ0LDE0IEBACiB7CiAgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewogICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPndpbmRvdy56KTsKKyAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CiAgICAgfQogfQogc3RhdGljIGlubGluZQogdm9pZCBsaWdodFZlcnRleFNtb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQogewogICAgIGlmICghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT53aW5kb3cueik7CisgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwogICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2KTsKICAgICB9CiB9CkBAIC0yNDMsMTIgKzI0MywyMCBAQAogICAgIG1fYXJlYSA9IG1fZHgwMSptX2R5MDIgKyAoLW1fZHkxMCkqbV9keDIwOwogfQogCit2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRMaW5lKAorICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjAsIHZlcnRleF90IGNvbnN0KiB2MSkKK3sKKyAgICBtX2R4MDEgPSBtX2R5MDIgPSB2MS0+d2luZG93LnggLSB2MC0+d2luZG93Lng7CisgICAgbV9keTEwID0gbV9keDIwID0gdjAtPndpbmRvdy55IC0gdjEtPndpbmRvdy55OworICAgIG1fYXJlYSA9IG1fZHgwMSptX2R5MDIgKyAoLW1fZHkxMCkqbV9keDIwOworfQorCiB2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRMZXJwKHZlcnRleF90IGNvbnN0KiB2MCwgdWludDMyX3QgZW5hYmxlcykKIHsKICAgICBtX3gwID0gdjAtPndpbmRvdy54OwogICAgIG1feTAgPSB2MC0+d2luZG93Lnk7CiAgICAgY29uc3QgR0dMY29vcmQgYXJlYSA9IChtX2FyZWEgKyBUUklfSEFMRikgPj4gVFJJX0ZSQUNUSU9OX0JJVFM7Ci0gICAgY29uc3QgR0dMY29vcmQgbWluQXJlYSA9IDI7IC8vIGNhbm5vdCBiZSBpbnZlcnNlZAorICAgIGNvbnN0IEdHTGNvb3JkIG1pbkFyZWEgPSAyOyAvLyBjYW5ub3QgYmUgaW52ZXJ0ZWQKICAgICAvLyB0cmlhbmdsZXMgd2l0aCBhbiBhcmVhIHNtYWxsZXIgdGhhbiAxLjAgYXJlIG5vdCBzbW9vdGgtc2hhZGVkCiAKICAgICBpbnQgcT0wLCBzPTAsIGQ9MDsKQEAgLTMzNiw2ICszNDQsMjAgQEAKICAgICBpdFsyXSA9IGRjZHk7CiB9CiAKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQ2NF90KiBpdCwKKyAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKK3sKKyAgICBjb25zdCBpbnQgcyA9IG1fYXJlYV9zY2FsZSAtIDE2OworICAgIGludDMyX3QgZGMwMSA9IChjMSAtIGMwKT4+czsKKyAgICBpbnQzMl90IGRjMDIgPSAoYzIgLSBjMCk+PnM7CisgICAgLy8gMTYuMTYgeCAxNi4xNiA9PSAzMi4zMgorICAgIGludDY0X3QgZGNkeCA9IGdnbE11bGlpKGRjMDEsIG1fZHkwMikgKyBnZ2xNdWxpaShkYzAyLCBtX2R5MTApOworICAgIGludDY0X3QgZGNkeSA9IGdnbE11bGlpKGRjMDIsIG1fZHgwMSkgKyBnZ2xNdWxpaShkYzAxLCBtX2R4MjApOworICAgIGl0WyAwXSA9IChjMDw8MTYpIC0gKChkY2R4Km1feDAgKyBkY2R5Km1feTApPj40KTsKKyAgICBpdFsgMV0gPSBkY2R4OworICAgIGl0WyAyXSA9IGRjZHk7Cit9CisKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKIGlubGluZSB2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6Oml0ZXJhdG9yczAwMzIoaW50MzJfdCogaXQsCiAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0CkBAIC0zNDYsMTYgKzM2OCwxMSBAQAogdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDMyX3QqIGl0LAogICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAogewotICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlIC0gMTY7Ci0gICAgaW50MzJfdCBkYzAxID0gKGMxIC0gYzApPj5zOwotICAgIGludDMyX3QgZGMwMiA9IChjMiAtIGMwKT4+czsKLSAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyCi0gICAgaW50NjRfdCBkY2R4ID0gZ2dsTXVsaWkoZGMwMSwgbV9keTAyKSArIGdnbE11bGlpKGRjMDIsIG1fZHkxMCk7Ci0gICAgaW50NjRfdCBkY2R5ID0gZ2dsTXVsaWkoZGMwMiwgbV9keDAxKSArIGdnbE11bGlpKGRjMDEsIG1fZHgyMCk7Ci0gICAgaW50MzJfdCBjID0gKGMwPDwxNikgLSAoKGRjZHgqbV94MCArIGRjZHkqbV95MCk+PjQpOwotICAgIGl0WyAwXSA9IGM7Ci0gICAgaXRbIDFdID0gZGNkeDsKLSAgICBpdFsgMl0gPSBkY2R5OworICAgIGludDY0X3QgaXQ2NFszXTsKKyAgICBpdGVyYXRvcnMwMDMyKGl0LCBjMCwgYzEsIGMyKTsKKyAgICBpdFswXSA9IGl0NjRbMF07CisgICAgaXRbMV0gPSBpdDY0WzFdOworICAgIGl0WzJdID0gaXQ2NFsyXTsKIH0KICNlbmRpZgogCkBAIC00NTQsNyArNDcxLDcgQEAKICAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykgewotICAgICAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT53aW5kb3cueik7CisgICAgICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTE0LDIyICs1MzEsMTIgQEAKIAogdm9pZCBwcmltaXRpdmVfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKQogewotICAgIC8vIFRoaXMgaXMgYSBjaGVlenkgaW1wbGVtZW50YXRpb24gb2YgbGluZSBkcmF3aW5nIHRoYXQKLSAgICAvLyB1c2VzIDIgdHJpYW5nbGVzIHBlciBsaW5lLiAKLSAgICAvLyBUaGF0IHNhaWQsIGhvdyBvZnRlbiBsaW5lIGRyYXdpbmcgaXMgdXNlZD8KLQogICAgIC8vIGdldCB0ZXh0dXJlIGNvb3JkaW5hdGVzCiAgICAgZmV0Y2hfdGV4Y29vcmQoYywgdjAsIHYxLCB2MSk7CiAKICAgICAvLyBsaWdodC9zaGFkZSB0aGUgdmVydGljZXMgZmlyc3QgKHRoZXkncmUgY29waWVkIGJlbG93KQogICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VHJpYW5nbGUoYywgdjAsIHYxLCB2MSk7CiAKLSAgICB2ZXJ0ZXhfdCB2WzRdOwotICAgIHZbMF0gPSAqdjA7Ci0gICAgdlsxXSA9ICp2MTsKLSAgICB2MCA9ICZ2WzBdOwotICAgIHYxID0gJnZbMV07Ci0KICAgICAvLyBjbGlwIHRoZSBsaW5lIGlmIG5lZWRlZAogICAgIGlmIChnZ2xfdW5saWtlbHkoKHYwLT5mbGFncyB8IHYxLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSB7CiAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IGNsaXBfbGluZShjLCB2MCwgdjEpOwpAQCAtNTQ2LDggKzU1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9ERVBUSF9URVNUOwogCiAgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgbWFzaykpIHsKLSAgICAgICAgYy0+bGVycC5pbml0VHJpYW5nbGUodjAsIHYxLCB2MSk7Ci0gICAgICAgIGxlcnBfdHJpYW5nbGUoYywgdjAsIHYxLCB2MSk7CisgICAgICAgIGMtPmxlcnAuaW5pdExpbmUodjAsIHYxKTsKKyAgICAgICAgbGVycF90cmlhbmdsZShjLCB2MCwgdjEsIHYwKTsKICAgICB9CiAKICAgICAvLyByZW5kZXIgb3VyIGxpbmUKQEAgLTY1NCwxNyArNjYxLDI2IEBACiAgICAgICAgIGNvbnN0IGludDMyX3QgdjB6ID0gY2xhbXBaKHYwLT53aW5kb3cueik7CiAgICAgICAgIGNvbnN0IGludDMyX3QgdjF6ID0gY2xhbXBaKHYxLT53aW5kb3cueik7CiAgICAgICAgIGNvbnN0IGludDMyX3QgdjJ6ID0gY2xhbXBaKHYyLT53aW5kb3cueik7Ci0gICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOwogICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGMtPnBvbHlnb25PZmZzZXQuZW5hYmxlKSkgeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB1bml0cyA9IChjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzIDw8IDE2KTsKICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFjdG9yID0gYy0+cG9seWdvbk9mZnNldC5mYWN0b3I7Ci0gICAgICAgICAgICBjb25zdCBHTGZpeGVkIHVuaXRzID0gYy0+cG9seWdvbk9mZnNldC51bml0czsKLSAgICAgICAgICAgIGludDMyX3QgbWF4RGVwdGhTbG9wZSA9IG1heChhYnMoaXR6WzFdKSwgYWJzKGl0elsyXSkpOwotICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQgPSAoaW50NjRfdChtYXhEZXB0aFNsb3BlKSpmYWN0b3IgKwotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCh1bml0cykgPDwgMTYpKSA+PiAxNjsKLSAgICAgICAgICAgIGl0elswXSArPSBvZmZzZXQ7IC8vIFhYWDogdGhpcyBjYW4gY2F1c2Ugb3ZlcmZsb3dzCisgICAgICAgICAgICBpZiAoZmFjdG9yKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBpdHo2NFszXTsKKyAgICAgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6NjQsIHYweiwgdjF6LCB2MnopOworICAgICAgICAgICAgICAgIGludDY0X3QgbWF4RGVwdGhTbG9wZSA9IG1heChpdHo2NFsxXSwgaXR6NjRbMl0pOworICAgICAgICAgICAgICAgIGl0elswXSA9IHVpbnQzMl90KGl0ejY0WzBdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdWludDMyX3QoKG1heERlcHRoU2xvcGUqZmFjdG9yKT4+MTYpICsgdW5pdHM7CisgICAgICAgICAgICAgICAgaXR6WzFdID0gdWludDMyX3QoaXR6NjRbMV0pOworICAgICAgICAgICAgICAgIGl0elsyXSA9IHVpbnQzMl90KGl0ejY0WzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7CisgICAgICAgICAgICAgICAgaXR6WzBdICs9IHVuaXRzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOwogICAgICAgICB9CiAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuekdyYWQzeHYoYywgaXR6KTsKLSAgICB9CisgICAgfSAgICAKIAogICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSkgewogICAgICAgICBHTGZpeGVkIGl0ZlszXTsKQEAgLTg4MCwxMSArODk2LDExIEBACiAgICAgICAgICAgICAgICAgdmVydGV4X3QqKiBvdXRwdXQgPSBvdmw7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9jID0gMDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VudGluZWwgPSAwOwotICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRpY2UsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGV4LCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQogICAgICAgICAgICAgICAgIHZlcnRleF90KiBzID0gaXZsW2ljLTFdOwogICAgICAgICAgICAgICAgIGNvbnN0IHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BsYW5lXS5lcXVhdGlvbjsKICAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZG90NChlcXVhdGlvbi52LCBzLT5leWUudik7Ci0gICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRpY2UgYWdhaW5zdCB0aGlzIHBsYW5lLi4uCisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZG90NChlcXVhdGlvbi52LCBwLT5leWUudik7CkBAIC05NDYsMTAgKzk2MiwxMCBAQAogICAgICAgICAgICAgICAgIHZlcnRleF90Kiogb3V0cHV0ID0gb3ZsOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvYyA9IDA7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbnRpbmVsID0gMDsKLSAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0aWNlLCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQorICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRleCwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcyA9IGl2bFtpYy0xXTsKICAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcy0+Y2xpcCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRpY2UgYWdhaW5zdCB0aGlzIHBsYW5lLi4uCisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcC0+Y2xpcCk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKaW5kZXggNWJjYzlkYy4uZGFkMDRkNiAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcApAQCAtOTksNyArOTksNyBAQAogICAgIGMtPmFycmF5cy5jdWxsICY9IGNsaXA7CiAKICAgICBpZiAoZ2dsX2xpa2VseSghY2xpcCkpIHsKLSAgICAgICAgLy8gaWYgdGhlIHZlcnRpY2UgaXMgY2xpcHBlZCwgd2UgZG9uJ3QgZG8gdGhlIHBlcnNwZWN0aXZlCisgICAgICAgIC8vIGlmIHRoZSB2ZXJ0ZXggaXMgY2xpcHBlZCwgd2UgZG9uJ3QgZG8gdGhlIHBlcnNwZWN0aXZlCiAgICAgICAgIC8vIGRpdmlkZSwgc2luY2Ugd2UgZG9uJ3QgbmVlZCBpdHMgd2luZG93IGNvb3JkaW5hdGVzLgogICAgICAgICBwZXJzcGVjdGl2ZShjLCB2LCBlbmFibGVzKTsKICAgICB9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxIEBACitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjczY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTOj0gYXBwLWxpbnV4LmMgZGVtby5jLmFybQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJHTEVTX0NNIGxpYnVpCitMT0NBTF9NT0RVTEU6PSBhbmdlbGVzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVM6PSBncHVzdGF0ZS5jCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkdMRVNfQ00KK0xPQ0FMX01PRFVMRTo9IGdwdXN0YXRlCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiOGE0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKQEAgLTAsMCArMSw3NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorU2VlIGZpbGUgbGljZW5zZS50eHQgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi4NCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGlzIGlzIGFuIE9wZW5HTCBFUyBwb3J0IG9mIHRoZSBzbWFsbCBzZWxmLXJ1bm5pbmcgZGVtb25zdHJhdGlvbg0KK2NhbGxlZCAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24iLCB3aGljaCB3YXMgZmlyc3QgcHJlc2VudGVkIGluIHRoZQ0KK0Fzc2VtYmx5JzIwMDQgZXZlbnQuIEl0IHdvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIDQgS0IgaW50cm8NCitjb21wZXRpdGlvbiBjYXRlZ29yeS4NCisNCitUaGUgZGVtb25zdHJhdGlvbiBmZWF0dXJlcyBhIHNpZ2h0c2VlaW5nIG9mIGEgZnV0dXJpc3RpYyBjaXR5DQoraGF2aW5nIG1hbnkgZGlmZmVyZW50IGtpbmQgb2YgYnVpbGRpbmdzIGFuZCBpdGVtcy4gRXZlcnl0aGluZyBpcw0KK2ZsYXQgc2hhZGVkIHdpdGggdGhyZWUgZGlmZmVyZW50IGxpZ2h0cy4NCisNCitUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgbWFkZSBmb3IgZGVza3RvcCB3aXRoIE9wZW5HTC4gSXQgd2FzDQorbmF0dXJhbGx5IGhlYXZpbHkgc2l6ZSBvcHRpbWl6ZWQgaW4gb3JkZXIgdG8gZml0IGl0IGluIHRoZSBzaXplDQorbGltaXQuIEZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgbXVjaCBvZiB0aGUgY29kZSBpcw0KK2NsZWFuZWQgdXAgYW5kIHRoZSBzb3VuZCBpcyByZW1vdmVkLiBBbHNvIGRldGFpbCBsZXZlbCBpcyBsb3dlcmVkLA0KK2FsdGhvdWdoIGl0IHN0aWxsIGNvbnRhaW5zIG92ZXIgNjAwMDAgZmFjZXMuDQorDQorVGhlIFdpbjMyICgyMDAwL1hQKSBiaW5hcnkgcGFja2FnZSBvZiBvcmlnaW5hbCB2ZXJzaW9uIGlzDQorYXZhaWxhYmxlIGZyb20gdGhpcyBhZGRyZXNzOiBodHRwOi8vamV0LnJvL2ZpbGVzL2FuZ2VsZXMuemlwDQorDQorRmlyc3QgdmVyc2lvbiBvZiB0aGlzIE9wZW5HTCBFUyBwb3J0IHdhcyBzdWJtaXR0ZWQgdG8gdGhlIEtocm9ub3MNCitPcGVuR0wgRVMgQ29kaW5nIENoYWxsZW5nZSBoZWxkIGluIDIwMDQtMjAwNS4NCisNCitBcyBhIGNvZGUgZXhhbXBsZSwgdGhpcyBzb3VyY2Ugc2hvd3MgdGhlIGZvbGxvd2luZzoNCisgICogSG93IHRvIGNyZWF0ZSBhIG1pbmltYWwgYW5kIHBvcnRhYmxlIGFkIGhvYyBmcmFtZXdvcmsNCisgICAgZm9yIHNtYWxsIHRlc3RpbmcvZGVtb25zdHJhdGlvbiBwcm9ncmFtcy4gVGhpcyBmcmFtZXdvcmsNCisgICAgY29tcGlsZXMgZm9yIGJvdGggZGVza3RvcCBhbmQgUG9ja2V0UEMgV2luMzIgZW52aXJvbm1lbnQsDQorICAgIGFuZCBhIHNlcGFyYXRlIHNvdXJjZSBpcyBpbmNsdWRlZCBmb3IgTGludXggd2l0aCBYMTEuDQorICAqIEhvdyB0byBkeW5hbWljYWxseSBmaW5kIGFuZCB1c2UgdGhlIE9wZW5HTCBFUyBETEwgb3INCisgICAgc2hhcmVkIG9iamVjdCwgc28gdGhhdCB0aGUgbGlicmFyeSBpcyBub3QgbmVlZGVkIGF0DQorICAgIHRoZSBjb21waWxlL2xpbmsgc3RhZ2UuDQorICAqIEhvdyB0byB1c2UgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIE9wZW5HTCBFUyAxLjAvMS4xDQorICAgIENvbW1vbiBMaXRlLCBzdWNoIGFzIHZlcnRleCBhcnJheXMsIGNvbG9yIGFycmF5cyBhbmQNCisgICAgbGlnaHRpbmcuDQorICAqIEhvdyB0byBjcmVhdGUgYSBzZWxmIGNvbnRhaW5lZCBzbWFsbCBkZW1vbnN0cmF0aW9uDQorICAgIGFwcGxpY2F0aW9uIHdpdGggb2JqZWN0cyBnZW5lcmF0ZWQgdXNpbmcgcHJvY2VkdXJhbA0KKyAgICBhbGdvcml0aG1zLg0KKw0KK0FzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdhcyBvcHRpbWl6ZWQgZm9yIHNpemUgaW5zdGVhZCBvZg0KK3BlcmZvcm1hbmNlLCB0aGF0IGhvbGRzIHRydWUgZm9yIHRoaXMgT3BlbkdMIEVTIHZlcnNpb24gYXMNCit3ZWxsLiBUaHVzIHRoZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBzaWduaWZpY2FudGx5IGluY3JlYXNlZCwNCitmb3IgZXhhbXBsZSBieSBjaGFuZ2luZyB0aGUgY29kZSB0byB1c2UgZ2xEcmF3RWxlbWVudHMNCitpbnN0ZWFkIG9mIGdsRHJhd0FycmF5cy4gVGhlIGNvZGUgdXNlcyBvbmx5IE9wZW5HTCBFUyAxLjANCitDb21tb24gTGl0ZSAtbGV2ZWwgZnVuY3Rpb24gY2FsbHMgd2l0aG91dCBhbnkgZXh0ZW5zaW9ucy4NCisNCitUaGUgcmVmZXJlbmNlIE9wZW5HTCBFUyBpbXBsZW1lbnRhdGlvbnMgdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbjoNCisgICogSHlicmlkJ3MgT3BlbkdMIEVTIEFQSSBJbXBsZW1lbnRhdGlvbiAoR2VyYmVyYSkgdmVyc2lvbiAyLjAuNA0KKyAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1HZXJiZXJhLmV4ZQ0KKyAgKiBQb3dlclZSIE1CWCBTREssIE9wZW5HTCBFUyBXaW5kb3dzIFBDIEVtdWxhdGlvbiB2ZXJzaW9uIDEuMDQuMTQuMDE3MA0KKyAgICBQcmVidWlsdCBXaW4zMiBQQyBleGVjdXRhYmxlOiBTYW5PR0xFUy1QVlJTREsuZXhlDQorDQorTm90ZSB0aGF0IERJU0FCTEVfSU1QT1JUR0wgcHJlcHJvY2Vzc29yIG1hY3JvIGNhbiBiZSB1c2VkDQordG8gc3BlY2lmeSBub3QgdG8gdXNlIGR5bmFtaWMgcnVudGltZSBiaW5kaW5nIG9mIHRoZSBsaWJyYXJ5Lg0KK1lvdSBhbHNvIG5lZWQgdG8gZGVmaW5lIHByZXByb2Nlc3NvciBtYWNybyBQVlJTREsgdG8gY29tcGlsZQ0KK3RoZSBzb3VyY2Ugd2l0aCBQb3dlclZSIE9wZW5HTCBFUyBTREsuDQorDQorVGhlIGRlbW8gYXBwbGljYXRpb24gaXMgYnJpZWZseSB0ZXN0ZWQgd2l0aCBhIGZldyBvdGhlciBPcGVuR0wgRVMNCitpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCAoZS5nLiBWaW5jZW50LCBHTEVTb25HTCBvbiBMaW51eCwgRGVsbA0KK0F4aW0gWDUwdikuIE1vc3Qgb2YgdGhlc2Ugb3RoZXIgaW1wbGVtZW50YXRpb25zIHJlbmRlcmVkIHRoZSBkZW1vDQorZXJyb25lb3VzbHkgaW4gc29tZSBhc3BlY3QuIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGRlbW8gc291cmNlDQorY291bGQgc3RpbGwgaGF2ZSBzb21lIHdvcmsgdG8gZG8gd2l0aCBjb21wYXRpYmlsaXR5IGFuZCBjb3JyZWN0DQorQVBJIHVzYWdlLCBhbHRob3VnaCB0aGUgbm9uLWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIGFyZSBtb3N0DQorcHJvYmFibHkgdW5maW5pc2hlZCBhcyB3ZWxsLg0KKw0KK1RoYW5rcyBhbmQgQWNrbm93bGVkZ2VtZW50czoNCisNCisqIFRvbmkgTPZubmJlcmcgKCFDdWJlKSBjcmVhdGVkIHRoZSBtdXNpYyBmb3Igb3JpZ2luYWwgdmVyc2lvbiwgd2hpY2gNCisgIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGlzIE9wZW5HTCBFUyBwb3J0Lg0KKyogU2FyYSBLYXBsaSAoc3QgUmFuYSkgZm9yIGFkZGl0aW9uYWwgY2FtZXJhIHdvcmsuDQorKiBQYXVsIEJvdXJrZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cGVyc2hhcGVzLg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzOWViMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAtbGludXguYyx2IDEuNCAyMDA1LzAyLzA4IDE4OjQyOjQ4IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNCAkCisgKgorICogUGFydHMgb2YgdGhpcyBzb3VyY2UgZmlsZSBpcyBiYXNlZCBvbiB0ZXN0L2V4YW1wbGUgY29kZSBmcm9tCisgKiBHTEVTb25HTCBpbXBsZW1lbnRhdGlvbiBieSBEYXZpZCBCbHl0aGUuIEhlcmUgaXMgY29weSBvZiB0aGUKKyAqIGxpY2Vuc2Ugbm90aWNlIGZyb20gdGhhdCBzb3VyY2U6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZCBCbHl0aGUgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogREFWSUQgQkxZVEhFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKKyNpbmNsdWRlICJhcHAuaCIKKworCitpbnQgZ0FwcEFsaXZlID0gMTsKKworc3RhdGljIGNvbnN0IGNoYXIgc0FwcE5hbWVbXSA9CisgICAgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgKExpbnV4KSI7CisKK3N0YXRpYyBpbnQgc1dpbmRvd1dpZHRoID0gV0lORE9XX0RFRkFVTFRfV0lEVEg7CitzdGF0aWMgaW50IHNXaW5kb3dIZWlnaHQgPSBXSU5ET1dfREVGQVVMVF9IRUlHSFQ7CitzdGF0aWMgRUdMRGlzcGxheSBzRWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOworc3RhdGljIEVHTENvbnRleHQgc0VnbENvbnRleHQgPSBFR0xfTk9fQ09OVEVYVDsKK3N0YXRpYyBFR0xTdXJmYWNlIHNFZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7CisKK2NvbnN0IGNoYXIgKmVnbF9zdHJlcnJvcih1bnNpZ25lZCBlcnIpCit7CisgICAgc3dpdGNoKGVycil7CisgICAgY2FzZSBFR0xfU1VDQ0VTUzogcmV0dXJuICJTVUNDRVNTIjsKKyAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6IHJldHVybiAiTk9UIElOSVRJQUxJWkVEIjsKKyAgICBjYXNlIEVHTF9CQURfQUNDRVNTOiByZXR1cm4gIkJBRCBBQ0NFU1MiOworICAgIGNhc2UgRUdMX0JBRF9BTExPQzogcmV0dXJuICJCQUQgQUxMT0MiOworICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6IHJldHVybiAiQkFEX0FUVFJJQlVURSI7CisgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogcmV0dXJuICJCQUQgQ09ORklHIjsKKyAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogcmV0dXJuICJCQUQgQ09OVEVYVCI7CisgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogcmV0dXJuICJCQUQgQ1VSUkVOVCBTVVJGQUNFIjsKKyAgICBjYXNlIEVHTF9CQURfRElTUExBWTogcmV0dXJuICJCQUQgRElTUExBWSI7CisgICAgY2FzZSBFR0xfQkFEX01BVENIOiByZXR1cm4gIkJBRCBNQVRDSCI7CisgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6IHJldHVybiAiQkFEIE5BVElWRSBQSVhNQVAiOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiByZXR1cm4gIkJBRCBOQVRJVkUgV0lORE9XIjsKKyAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiByZXR1cm4gIkJBRCBQQVJBTUVURVIiOworICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiByZXR1cm4gIkJBRF9TVVJGQUNFIjsKKy8vICAgIGNhc2UgRUdMX0NPTlRFWFRfTE9TVDogcmV0dXJuICJDT05URVhUIExPU1QiOworICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7CisgICAgfQorfQorCit2b2lkIGVnbF9lcnJvcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIHVuc2lnbmVkIGVyciA9IGVnbEdldEVycm9yKCk7CisgICAgaWYoZXJyICE9IEVHTF9TVUNDRVNTKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlcygpOiBlZ2wgZXJyb3IgMHgleCAoJXMpXG4iLCAKKyAgICAgICAgICAgICAgICBuYW1lLCBlcnIsIGVnbF9zdHJlcnJvcihlcnIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrR0xFcnJvcnMoKQoreworICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tFR0xFcnJvcnMoKQoreworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgLy8gR0xFU29uR0wgc2VlbXMgdG8gYmUgcmV0dXJuaW5nIDAgd2hlbiB0aGVyZSBpcyBubyBlcnJvcnM/CisgICAgaWYgKGVycm9yICYmIGVycm9yICE9IEVHTF9TVUNDRVNTKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKK30KKworc3RhdGljIGludCBpbml0R3JhcGhpY3MoKQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAjaWYgMQorICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICAxNiwKKyAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgMCwKKyAjZWxzZQorICAgICAgICAgRUdMX0FMUEhBX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICBFR0xfRE9OVF9DQVJFLAorICNlbmRpZgorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xHZXREaXNwbGF5Iik7CisgICAgIGZwcmludGYoc3RkZXJyLCJkcHkgPSAweCUwOHhcbiIsICh1bnNpZ25lZCkgZHB5KTsKKyAgICAgCisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xJbml0aWFsaXplIik7CisKKyAgICAgZWdsR2V0Q29uZmlncyhkcHksIE5VTEwsIDAsICZudW1Db25maWdzKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xHZXRDb25maWdzIik7CisgICAgIGZwcmludGYoc3RkZXJyLCJudW0gY29uZmlncyAlZFxuIiwgbnVtQ29uZmlncyk7CisgICAgIAorICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xDaG9vc2VDb25maWciKTsKKworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBlZ2xfZXJyb3IoImVnbE1hcFdpbmRvd1N1cmZhY2UiKTsKKworICAgICBmcHJpbnRmKHN0ZGVyciwic3VyZmFjZSA9ICVwXG4iLCBzdXJmYWNlKTsKKworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbF9lcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOworICAgICBmcHJpbnRmKHN0ZGVyciwiY29udGV4dCA9ICVwXG4iLCBjb250ZXh0KTsKKyAgICAgCisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbF9lcnJvcigiZWdsTWFrZUN1cnJlbnQiKTsKKworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZzV2luZG93V2lkdGgpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmc1dpbmRvd0hlaWdodCk7CisKKyAgICBzRWdsRGlzcGxheSA9IGRweTsKKyAgICBzRWdsU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgc0VnbENvbnRleHQgPSBjb250ZXh0OworCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCisKK3N0YXRpYyB2b2lkIGRlaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBlZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZWdsRGVzdHJveUNvbnRleHQoc0VnbERpc3BsYXksIHNFZ2xDb250ZXh0KTsKKyAgICBlZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgIGVnbFRlcm1pbmF0ZShzRWdsRGlzcGxheSk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAvLyBub3QgcmVmZXJlbmNlZDoKKyAgICBhcmdjID0gYXJnYzsKKyAgICBhcmd2ID0gYXJndjsKKworICAgIGlmICghaW5pdEdyYXBoaWNzKCkpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdyYXBoaWNzIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGFwcEluaXQoKTsKKyAgICAKKyAgICB3aGlsZSAoZ0FwcEFsaXZlKQorICAgIHsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZU5vdzsKKworICAgICAgICBpZiAoZ0FwcEFsaXZlKQorICAgICAgICB7CisgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnRpbWVOb3csIE5VTEwpOworICAgICAgICAgICAgYXBwUmVuZGVyKHRpbWVOb3cudHZfc2VjICogMTAwMCArIHRpbWVOb3cudHZfdXNlYyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1dpZHRoLCBzV2luZG93SGVpZ2h0KTsKKyAgICAgICAgICAgIGNoZWNrR0xFcnJvcnMoKTsKKyAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7CisgICAgICAgICAgICBjaGVja0VHTEVycm9ycygpOworICAgICAgICB9CisgICAgfQorCisgICAgYXBwRGVpbml0KCk7CisgICAgZGVpbml0R3JhcGhpY3MoKTsKKworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWJkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApAQCAtMCwwICsxLDU2IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBhcHAuaCx2IDEuMTQgMjAwNS8wMi8wNiAyMToxMzo1NCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjE0ICQKKyAqLworCisjaWZuZGVmIEFQUF9IX0lOQ0xVREVECisjZGVmaW5lIEFQUF9IX0lOQ0xVREVECisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUgV0lORE9XX0RFRkFVTFRfV0lEVEggICAgNjQwCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX0hFSUdIVCAgIDQ4MAorCisjZGVmaW5lIFdJTkRPV19CUFAgICAgICAgICAgICAgIDE2CisKKworLy8gVGhlIHNpbXBsZSBmcmFtZXdvcmsgZXhwZWN0cyB0aGUgYXBwbGljYXRpb24gY29kZSB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zLgorZXh0ZXJuIHZvaWQgYXBwSW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwRGVpbml0KCk7CitleHRlcm4gdm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvKiBWYWx1ZSBpcyBub24temVybyB3aGVuIGFwcGxpY2F0aW9uIGlzIGFsaXZlLCBhbmQgMCB3aGVuIGl0IGlzIGNsb3NpbmcuCisgKiBEZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcmFtZXdvcmsuCisgKi8KK2V4dGVybiBpbnQgZ0FwcEFsaXZlOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8vICFBUFBfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWFjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogY2Ftcy5oLHYgMS43IDIwMDUvMDEvMzEgMjI6MTU6MTUgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS43ICQKKyAqLworCisjaWZuZGVmIENBTVNfSF9JTkNMVURFRAorI2RlZmluZSBDQU1TX0hfSU5DTFVERUQKKworCisvKiBMZW5ndGggaW4gbWlsbGlzZWNvbmRzIG9mIG9uZSBjYW1lcmEgdHJhY2sgYmFzZSB1bml0LgorICogVGhlIHZhbHVlIG9yaWdpbmF0ZXMgZnJvbSB0aGUgbXVzaWMgc3luY2hyb25pemF0aW9uLgorICovCisjZGVmaW5lIENBTVRSQUNLX0xFTiAgICA1NDQyCisKKworLy8gQ2FtZXJhIHRyYWNrIGRlZmluaXRpb24gZm9yIG9uZSBjYW1lcmEgdHJ1Y2tpbmcgc2hvdC4KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogRml2ZSBwYXJhbWV0ZXJzIG9mIHNyY1s1XSBhbmQgZGVzdFs1XToKKyAgICAgKiBleWVYLCBleWVZLCBleWVaLCB2aWV3QW5nbGUsIHZpZXdIZWlnaHRPZmZzCisgICAgICovCisgICAgc2hvcnQgc3JjWzVdLCBkZXN0WzVdOworICAgIHVuc2lnbmVkIGNoYXIgZGlzdDsgICAgIC8vIGlmID4wLCBjYW0gcm90YXRlcyBhcm91bmQgZXllIHh5IG9uIGRpc3QgKiAwLjEKKyAgICB1bnNpZ25lZCBjaGFyIGxlbjsgICAgICAvLyBsZW5ndGggbXVsdGlwbGllcgorfSBDQU1UUkFDSzsKKworc3RhdGljIENBTVRSQUNLIHNDYW1UcmFja3NbXSA9Cit7CisgICAgeyB7IDQ1MDAsIDI3MDAsIDEwMCwgNzAsIC0zMCB9LCB7IDUwLCA1MCwgLTkwLCAtMTAwLCAwIH0sIDIwLCAxIH0sCisgICAgeyB7IC0xNDQ4LCA0Mjk0LCAyNSwgMzYzLCAwIH0sIHsgLTEzNiwgMjAyLCAxMjUsIC05OCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTQzNywgNDkzMCwgMjAwLCAtMjc1LCAtMjAgfSwgeyAxNjg0LCAwLCAwLCA5LCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTgwMCwgMzYwOSwgMjAwLCAwLCA2NzUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgMCwgMSB9LAorICAgIHsgeyA5MjMsIDk5NiwgNTAsIDIzMzYsIC04MCB9LCB7IDAsIC0yMCwgLTUwLCAwLCAxNzAgfSwgMCwgMSB9LAorICAgIHsgeyAtMTY2MywgLTQzLCA2MDAsIDIxNzAsIDAgfSwgeyAyMCwgMCwgLTYwMCwgMCwgMTAwIH0sIDAsIDEgfSwKKyAgICB7IHsgMTA0OSwgLTE0MjAsIDE3NSwgMjExMSwgLTE3IH0sIHsgMCwgMCwgMCwgLTMzNCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDAsIDAsIDUwLCAzMDAsIDI1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDcwLCAyIH0sCisgICAgeyB7IC00NzMsIC05NTMsIDM1MDAsIC0zNTMsIC0zNTAgfSwgeyAwLCAwLCAtMjgwMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDE5MSwgMTkzOCwgMzUsIDExMzksIC0xNyB9LCB7IDEyMDUsIC0yOTA5LCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgLTE0NDksIC0yNzAwLCAxNTAsIDAsIDAgfSwgeyAwLCAyMDAwLCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgNTI3MywgNDk5MiwgNjUwLCAzNzMsIC01MCB9LCB7IC00NTk4LCAtMzA3MiwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDMyMjMsIC0zMjgyLCAxMDc1LCAtMzkzLCAtMjUgfSwgeyAxNjQ5LCAtMTY0OSwgMCwgMCwgMCB9LCAwLCAyIH0KK307CisjZGVmaW5lIENBTVRSQUNLX0NPVU5UIChzaXplb2YoY2FtVHJhY2tzKSAvIHNpemVvZihjYW1UcmFja3NbMF0pKQorCisKKyNlbmRpZiAvLyAhQ0FNU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyZjM5OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYwpAQCAtMCwwICsxLDc5MiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogZGVtby5jLHYgMS4xMCAyMDA1LzAyLzA4IDIwOjU0OjM5IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTAgJAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgImFwcC5oIgorI2luY2x1ZGUgInNoYXBlcy5oIgorI2luY2x1ZGUgImNhbXMuaCIKKworCisvLyBUb3RhbCBydW4gbGVuZ3RoIGlzIDIwICogY2FtZXJhIHRyYWNrIGJhc2UgdW5pdCBsZW5ndGggKHNlZSBjYW1zLmgpLgorI2RlZmluZSBSVU5fTEVOR1RIICAoMjAgKiBDQU1UUkFDS19MRU4pCisjdW5kZWYgUEkKKyNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyZgorI2RlZmluZSBSQU5ET01fVUlOVF9NQVggNjU1MzUKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzUmFuZG9tU2VlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHNlZWRSYW5kb20odW5zaWduZWQgbG9uZyBzZWVkKQoreworICAgIHNSYW5kb21TZWVkID0gc2VlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZG9tVUludCgpCit7CisgICAgc1JhbmRvbVNlZWQgPSBzUmFuZG9tU2VlZCAqIDB4MzQzZmQgKyAweDI2OWVjMzsKKyAgICByZXR1cm4gc1JhbmRvbVNlZWQgPj4gMTY7Cit9CisKKworLy8gQ2FwcGVkIGNvbnZlcnNpb24gZnJvbSBmbG9hdCB0byBmaXhlZC4KK3N0YXRpYyBsb25nIGZsb2F0VG9GaXhlZChmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPCAtMzI3NjgpIHZhbHVlID0gLTMyNzY4OworICAgIGlmICh2YWx1ZSA+IDMyNzY3KSB2YWx1ZSA9IDMyNzY3OworICAgIHJldHVybiAobG9uZykodmFsdWUgKiA2NTUzNik7Cit9CisKKyNkZWZpbmUgRklYRUQodmFsdWUpIGZsb2F0VG9GaXhlZCh2YWx1ZSkKKworCisvLyBEZWZpbml0aW9uIG9mIG9uZSBHTCBvYmplY3QgaW4gdGhpcyBkZW1vLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIFZlcnRleCBhcnJheSBhbmQgY29sb3IgYXJyYXkgYXJlIGVuYWJsZWQgZm9yIGFsbCBvYmplY3RzLCBzbyB0aGVpcgorICAgICAqIHBvaW50ZXJzIG11c3QgYWx3YXlzIGJlIHZhbGlkIGFuZCBub24tTlVMTC4gTm9ybWFsIGFycmF5IGlzIG5vdAorICAgICAqIHVzZWQgYnkgdGhlIGdyb3VuZCBwbGFuZSwgc28gd2hlbiBpdHMgcG9pbnRlciBpcyBOVUxMIHRoZW4gbm9ybWFsCisgICAgICogYXJyYXkgdXNhZ2UgaXMgZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBWZXJ0ZXggYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMAorICAgICAqIChpLmUuIHRpZ2h0bHkgcGFja2VkIGFycmF5KS4gQ29sb3IgYXJyYXkgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0CisgICAgICogY29tcG9uZW50cyBwZXIgY29sb3Igd2l0aCBHTF9VTlNJR05FRF9CWVRFIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KKyAgICAgKiBOb3JtYWwgYXJyYXkgaXMgc3VwcG9zZWQgdG8gdXNlIEdMX0ZJWEVEIGRhdGF0eXBlIGFuZCBzdHJpZGUgMC4KKyAgICAgKi8KKyAgICBHTGZpeGVkICp2ZXJ0ZXhBcnJheTsKKyAgICBHTHVieXRlICpjb2xvckFycmF5OworICAgIEdMZml4ZWQgKm5vcm1hbEFycmF5OworICAgIEdMaW50IHZlcnRleENvbXBvbmVudHM7CisgICAgR0xzaXplaSBjb3VudDsKK30gR0xPQkpFQ1Q7CisKKworc3RhdGljIGxvbmcgc1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzVGljayA9IDA7CisKK3N0YXRpYyBpbnQgc0N1cnJlbnRDYW1UcmFjayA9IDA7CitzdGF0aWMgbG9uZyBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gMDsKK3N0YXRpYyBsb25nIHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPSAweDdmZmZmZmZmOworCitzdGF0aWMgR0xPQkpFQ1QgKnNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UXSA9IHsgTlVMTCB9Oworc3RhdGljIEdMT0JKRUNUICpzR3JvdW5kUGxhbmUgPSBOVUxMOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCB4LCB5LCB6OworfSBWRUNUT1IzOworCisKK3N0YXRpYyB2b2lkIGZyZWVHTE9iamVjdChHTE9CSkVDVCAqb2JqZWN0KQoreworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGZyZWUob2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgZnJlZShvYmplY3QtPmNvbG9yQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT52ZXJ0ZXhBcnJheSk7CisgICAgZnJlZShvYmplY3QpOworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIG5ld0dMT2JqZWN0KGxvbmcgdmVydGljZXMsIGludCB2ZXJ0ZXhDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZU5vcm1hbEFycmF5KQoreworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgcmVzdWx0ID0gKEdMT0JKRUNUICopbWFsbG9jKHNpemVvZihHTE9CSkVDVCkpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0LT5jb3VudCA9IHZlcnRpY2VzOworICAgIHJlc3VsdC0+dmVydGV4Q29tcG9uZW50cyA9IHZlcnRleENvbXBvbmVudHM7CisgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogdmVydGV4Q29tcG9uZW50cyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7CisgICAgcmVzdWx0LT5jb2xvckFycmF5ID0gKEdMdWJ5dGUgKiltYWxsb2ModmVydGljZXMgKiA0ICogc2l6ZW9mKEdMdWJ5dGUpKTsKKyAgICBpZiAodXNlTm9ybWFsQXJyYXkpCisgICAgeworICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5ID0gKEdMZml4ZWQgKiltYWxsb2ModmVydGljZXMgKiAzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHTGZpeGVkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IE5VTEw7CisgICAgaWYgKHJlc3VsdC0+dmVydGV4QXJyYXkgPT0gTlVMTCB8fAorICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXkgPT0gTlVMTCB8fAorICAgICAgICAodXNlTm9ybWFsQXJyYXkgJiYgcmVzdWx0LT5ub3JtYWxBcnJheSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGZyZWVHTE9iamVjdChyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3R0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBhc3NlcnQob2JqZWN0ICE9IE5VTEwpOworCisgICAgZ2xWZXJ0ZXhQb2ludGVyKG9iamVjdC0+dmVydGV4Q29tcG9uZW50cywgR0xfRklYRUQsCisgICAgICAgICAgICAgICAgICAgIDAsIG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGdsQ29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsIDAsIG9iamVjdC0+Y29sb3JBcnJheSk7CisKKyAgICAvLyBBbHJlYWR5IGRvbmUgaW4gaW5pdGlhbGl6YXRpb246CisgICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgLy9nbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgIGlmIChvYmplY3QtPm5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZJWEVELCAwLCBvYmplY3QtPm5vcm1hbEFycmF5KTsKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgb2JqZWN0LT5jb3VudCk7Cit9CisKKworc3RhdGljIHZvaWQgdmVjdG9yM1N1YihWRUNUT1IzICpkZXN0LCBWRUNUT1IzICp2MSwgVkVDVE9SMyAqdjIpCit7CisgICAgZGVzdC0+eCA9IHYxLT54IC0gdjItPng7CisgICAgZGVzdC0+eSA9IHYxLT55IC0gdjItPnk7CisgICAgZGVzdC0+eiA9IHYxLT56IC0gdjItPno7Cit9CisKKworc3RhdGljIHZvaWQgc3VwZXJTaGFwZU1hcChWRUNUT1IzICpwb2ludCwgZmxvYXQgcjEsIGZsb2F0IHIyLCBmbG9hdCB0LCBmbG9hdCBwKQoreworICAgIC8vIHNwaGVyZS1tYXBwaW5nIG9mIHN1cGVyc2hhcGUgcGFyYW1ldGVycworICAgIHBvaW50LT54ID0gKGZsb2F0KShjb3ModCkgKiBjb3MocCkgLyByMSAvIHIyKTsKKyAgICBwb2ludC0+eSA9IChmbG9hdCkoc2luKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnogPSAoZmxvYXQpKHNpbihwKSAvIHIyKTsKK30KKworCitzdGF0aWMgZmxvYXQgc3NGdW5jKGNvbnN0IGZsb2F0IHQsIGNvbnN0IGZsb2F0ICpwKQoreworICAgIHJldHVybiAoZmxvYXQpKHBvdyhwb3coZmFicyhjb3MocFswXSAqIHQgLyA0KSkgLyBwWzFdLCBwWzRdKSArCisgICAgICAgICAgICAgICAgICAgICAgIHBvdyhmYWJzKHNpbihwWzBdICogdCAvIDQpKSAvIHBbMl0sIHBbNV0pLCAxIC8gcFszXSkpOworfQorCisKKy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBzdXBlcnNoYXBlIG9iamVjdC4KKy8vIEJhc2VkIG9uIFBhdWwgQm91cmtlJ3MgUE9WLVJheSBpbXBsZW1lbnRhdGlvbi4KKy8vIGh0dHA6Ly9hc3Ryb25vbXkuc3dpbi5lZHUuYXUvfnBib3Vya2UvcG92cmF5L3N1cGVyc2hhcGUvCitzdGF0aWMgR0xPQkpFQ1QgKiBjcmVhdGVTdXBlclNoYXBlKGNvbnN0IGZsb2F0ICpwYXJhbXMpCit7CisgICAgY29uc3QgaW50IHJlc29sMSA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gM107CisgICAgY29uc3QgaW50IHJlc29sMiA9IChpbnQpcGFyYW1zW1NVUEVSU0hBUEVfUEFSQU1TIC0gMl07CisgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yIGZvciBubyBtaXJyb3JlZCBib3R0b20KKyAgICAvLyAobGF0aXR1ZGVCZWdpbj09MCBmb3IgLXBpLzIgdG8gcGkvMiBvcmlnaW5hbGx5KQorICAgIGNvbnN0IGludCBsYXRpdHVkZUJlZ2luID0gcmVzb2wyIC8gNDsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVFbmQgPSByZXNvbDIgLyAyOyAgICAvLyBub24taW5jbHVzaXZlCisgICAgY29uc3QgaW50IGxvbmdpdHVkZUNvdW50ID0gcmVzb2wxOworICAgIGNvbnN0IGludCBsYXRpdHVkZUNvdW50ID0gbGF0aXR1ZGVFbmQgLSBsYXRpdHVkZUJlZ2luOworICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9IGxvbmdpdHVkZUNvdW50ICogbGF0aXR1ZGVDb3VudCAqIDI7CisgICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgZmxvYXQgYmFzZUNvbG9yWzNdOworICAgIGludCBhLCBsb25naXR1ZGUsIGxhdGl0dWRlOworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMywgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCisgICAgICAgIGJhc2VDb2xvclthXSA9ICgocmFuZG9tVUludCgpICUgMTU1KSArIDEwMCkgLyAyNTUuZjsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIC8vIGxvbmdpdHVkZSAtcGkgdG8gcGkKKyAgICBmb3IgKGxvbmdpdHVkZSA9IDA7IGxvbmdpdHVkZSA8IGxvbmdpdHVkZUNvdW50OyArK2xvbmdpdHVkZSkKKyAgICB7CisKKyAgICAgICAgLy8gbGF0aXR1ZGUgMCB0byBwaS8yCisgICAgICAgIGZvciAobGF0aXR1ZGUgPSBsYXRpdHVkZUJlZ2luOyBsYXRpdHVkZSA8IGxhdGl0dWRlRW5kOyArK2xhdGl0dWRlKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB0MSA9IC1QSSArIGxvbmdpdHVkZSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHQyID0gLVBJICsgKGxvbmdpdHVkZSArIDEpICogMiAqIFBJIC8gcmVzb2wxOworICAgICAgICAgICAgZmxvYXQgcDEgPSAtUEkgLyAyICsgbGF0aXR1ZGUgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCBwMiA9IC1QSSAvIDIgKyAobGF0aXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMjsKKyAgICAgICAgICAgIGZsb2F0IHIwLCByMSwgcjIsIHIzOworCisgICAgICAgICAgICByMCA9IHNzRnVuYyh0MSwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIxID0gc3NGdW5jKHAxLCAmcGFyYW1zWzZdKTsKKyAgICAgICAgICAgIHIyID0gc3NGdW5jKHQyLCBwYXJhbXMpOworICAgICAgICAgICAgcjMgPSBzc0Z1bmMocDIsICZwYXJhbXNbNl0pOworCisgICAgICAgICAgICBpZiAocjAgIT0gMCAmJiByMSAhPSAwICYmIHIyICE9IDAgJiYgcjMgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHBhLCBwYiwgcGMsIHBkOworICAgICAgICAgICAgICAgIFZFQ1RPUjMgdjEsIHYyLCBuOworICAgICAgICAgICAgICAgIGZsb2F0IGNhOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIC8vZmxvYXQgbGVuU3EsIGludkxlblNxOworCisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGEsIHIwLCByMSwgdDEsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYiwgcjIsIHIxLCB0MiwgcDEpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBjLCByMiwgcjMsIHQyLCBwMik7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGQsIHIwLCByMywgdDEsIHAyKTsKKworICAgICAgICAgICAgICAgIC8vIGtsdWRnZSB0byBzZXQgbG93ZXIgZWRnZSBvZiB0aGUgb2JqZWN0IHRvIGZpeGVkIGxldmVsCisgICAgICAgICAgICAgICAgaWYgKGxhdGl0dWRlID09IGxhdGl0dWRlQmVnaW4gKyAxKQorICAgICAgICAgICAgICAgICAgICBwYS56ID0gcGIueiA9IDA7CisKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MSwgJnBiLCAmcGEpOworICAgICAgICAgICAgICAgIHZlY3RvcjNTdWIoJnYyLCAmcGQsICZwYSk7CisKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbm9ybWFsIHdpdGggY3Jvc3MgcHJvZHVjdC4KKyAgICAgICAgICAgICAgICAvKiAgIGkgICAgaiAgICBrICAgICAgaSAgICBqCisgICAgICAgICAgICAgICAgICogdjEueCB2MS55IHYxLnogfCB2MS54IHYxLnkKKyAgICAgICAgICAgICAgICAgKiB2Mi54IHYyLnkgdjIueiB8IHYyLnggdjIueQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgbi54ID0gdjEueSAqIHYyLnogLSB2MS56ICogdjIueTsKKyAgICAgICAgICAgICAgICBuLnkgPSB2MS56ICogdjIueCAtIHYxLnggKiB2Mi56OworICAgICAgICAgICAgICAgIG4ueiA9IHYxLnggKiB2Mi55IC0gdjEueSAqIHYyLng7CisKKyAgICAgICAgICAgICAgICAvKiBQcmUtbm9ybWFsaXphdGlvbiBvZiB0aGUgbm9ybWFscyBpcyBkaXNhYmxlZCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiB0aGV5IHdpbGwgYmUgbm9ybWFsaXplZCBhbnl3YXkgbGF0ZXIgZHVlIHRvIGF1dG9tYXRpYworICAgICAgICAgICAgICAgICAqIG5vcm1hbGl6YXRpb24gKEdMX05PUk1BTElaRSkuIEl0IGlzIGVuYWJsZWQgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBvYmplY3RzIGFyZSBzY2FsZWQgd2l0aCBnbFNjYWxlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgbGVuU3EgPSBuLnggKiBuLnggKyBuLnkgKiBuLnkgKyBuLnogKiBuLno7CisgICAgICAgICAgICAgICAgaW52TGVuU3EgPSAoZmxvYXQpKDEgLyBzcXJ0KGxlblNxKSk7CisgICAgICAgICAgICAgICAgbi54ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgIG4ueSAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnogKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGNhID0gcGEueiArIDAuNWY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogMzsKKyAgICAgICAgICAgICAgICAgICAgIGkgPCAoY3VycmVudFZlcnRleCArIDYpICogMzsKKyAgICAgICAgICAgICAgICAgICAgIGkgKz0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaV0gPSBGSVhFRChuLngpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAxXSA9IEZJWEVEKG4ueSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaSArIDJdID0gRklYRUQobi56KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSwgY29sb3JbM107CisgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCAzOyArK2EpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yW2FdID0gKGludCkoY2EgKiBiYXNlQ29sb3JbYV0gKiAyNTUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yW2FdID4gMjU1KSBjb2xvclthXSA9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSAoR0x1Ynl0ZSljb2xvclswXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAxXSA9IChHTHVieXRlKWNvbG9yWzFdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gKEdMdWJ5dGUpY29sb3JbMl07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBhLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBhLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBhLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBiLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBiLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBiLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBjLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBjLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBjLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzXSA9IEZJWEVEKHBkLngpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAxXSA9IEZJWEVEKHBkLnkpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDMgKyAyXSA9IEZJWEVEKHBkLnopOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgIH0gLy8gcjAgJiYgcjEgJiYgcjIgJiYgcjMKKyAgICAgICAgICAgICsrY3VycmVudFF1YWQ7CisgICAgICAgIH0gLy8gbGF0aXR1ZGUKKyAgICB9IC8vIGxvbmdpdHVkZQorCisgICAgLy8gU2V0IG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBvYmplY3QgdG8gdGhlIGFjdHVhbCBhbW91bnQgY3JlYXRlZC4KKyAgICByZXN1bHQtPmNvdW50ID0gY3VycmVudFZlcnRleDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlR3JvdW5kUGxhbmUoKQoreworICAgIGNvbnN0IGludCBzY2FsZSA9IDQ7CisgICAgY29uc3QgaW50IHlCZWdpbiA9IC0xNSwgeUVuZCA9IDE1OyAgICAvLyBlbmRzIGFyZSBub24taW5jbHVzaXZlCisgICAgY29uc3QgaW50IHhCZWdpbiA9IC0xNSwgeEVuZCA9IDE1OworICAgIGNvbnN0IGxvbmcgdHJpYW5nbGVDb3VudCA9ICh5RW5kIC0geUJlZ2luKSAqICh4RW5kIC0geEJlZ2luKSAqIDI7CisgICAgY29uc3QgbG9uZyB2ZXJ0aWNlcyA9IHRyaWFuZ2xlQ291bnQgKiAzOworICAgIEdMT0JKRUNUICpyZXN1bHQ7CisgICAgaW50IHgsIHk7CisgICAgbG9uZyBjdXJyZW50VmVydGV4LCBjdXJyZW50UXVhZDsKKworICAgIHJlc3VsdCA9IG5ld0dMT2JqZWN0KHZlcnRpY2VzLCAyLCAwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY3VycmVudFF1YWQgPSAwOworICAgIGN1cnJlbnRWZXJ0ZXggPSAwOworCisgICAgZm9yICh5ID0geUJlZ2luOyB5IDwgeUVuZDsgKyt5KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0geEJlZ2luOyB4IDwgeEVuZDsgKyt4KQorICAgICAgICB7CisgICAgICAgICAgICBHTHVieXRlIGNvbG9yOworICAgICAgICAgICAgaW50IGksIGE7CisgICAgICAgICAgICBjb2xvciA9IChHTHVieXRlKSgocmFuZG9tVUludCgpICYgMHg1ZikgKyA4MSk7ICAvLyAxMDEgMTExMQorICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDQ7IGkgPCAoY3VycmVudFZlcnRleCArIDYpICogNDsgaSArPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDJdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAzXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEF4aXMgYml0cyBmb3IgcXVhZCB0cmlhbmdsZXM6CisgICAgICAgICAgICAvLyB4OiAwMTExMDAgKDB4MWMpLCB5OiAxMTAwMDEgKDB4MzEpICAoY2xvY2t3aXNlKQorICAgICAgICAgICAgLy8geDogMDAxMTEwICgweDBlKSwgeTogMTAwMDExICgweDIzKSAgKGNvdW50ZXItY2xvY2t3aXNlKQorICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDY7ICsrYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeG0gPSB4ICsgKCgweDFjID4+IGEpICYgMSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHltID0geSArICgoMHgzMSA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG0gPSAoZmxvYXQpKGNvcyh4bSAqIDIpICogc2luKHltICogNCkgKiAwLjc1Zik7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMl0gPQorICAgICAgICAgICAgICAgICAgICBGSVhFRCh4bSAqIHNjYWxlICsgbSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeW0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgICsrY3VycmVudFZlcnRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrY3VycmVudFF1YWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3R3JvdW5kUGxhbmUoKQoreworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0NPTE9SKTsKKyAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgZHJhd0dMT2JqZWN0KHNHcm91bmRQbGFuZSk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3RmFkZVF1YWQoKQoreworICAgIHN0YXRpYyBjb25zdCBHTGZpeGVkIHF1YWRWZXJ0aWNlc1tdID0geworICAgICAgICAtMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgLTB4MTAwMDAsICAweDEwMDAwCisgICAgfTsKKworICAgIGNvbnN0IGludCBiZWdpbkZhZGUgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgY29uc3QgaW50IGVuZEZhZGUgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrIC0gc1RpY2s7CisgICAgY29uc3QgaW50IG1pbkZhZGUgPSBiZWdpbkZhZGUgPCBlbmRGYWRlID8gYmVnaW5GYWRlIDogZW5kRmFkZTsKKworICAgIGlmIChtaW5GYWRlIDwgMTAyNCkKKyAgICB7CisgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFkZUNvbG9yID0gbWluRmFkZSA8PCA2OworICAgICAgICBnbENvbG9yNHgoZmFkZUNvbG9yLCBmYWRlQ29sb3IsIGZhZGVDb2xvciwgMCk7CisKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCBxdWFkVmVydGljZXMpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCA2KTsKKworICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKworICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KK3ZvaWQgYXBwSW5pdCgpCit7CisgICAgaW50IGE7CisKKyAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKKworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDApOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMSk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQyKTsKKworICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKKworICAgIHNlZWRSYW5kb20oMTUpOworCisgICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKKyAgICB7CisgICAgICAgIHNTdXBlclNoYXBlT2JqZWN0c1thXSA9IGNyZWF0ZVN1cGVyU2hhcGUoc1N1cGVyU2hhcGVQYXJhbXNbYV0pOworICAgICAgICBhc3NlcnQoc1N1cGVyU2hhcGVPYmplY3RzW2FdICE9IE5VTEwpOworICAgIH0KKyAgICBzR3JvdW5kUGxhbmUgPSBjcmVhdGVHcm91bmRQbGFuZSgpOworICAgIGFzc2VydChzR3JvdW5kUGxhbmUgIT0gTlVMTCk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcERlaW5pdCgpCit7CisgICAgaW50IGE7CisgICAgZm9yIChhID0gMDsgYSA8IFNVUEVSU0hBUEVfQ09VTlQ7ICsrYSkKKyAgICAgICAgZnJlZUdMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1thXSk7CisgICAgZnJlZUdMT2JqZWN0KHNHcm91bmRQbGFuZSk7Cit9CisKKworc3RhdGljIHZvaWQgZ2x1UGVyc3BlY3RpdmUoR0xmbG9hdCBmb3Z5LCBHTGZsb2F0IGFzcGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKK3sKKyAgICBHTGZsb2F0IHhtaW4sIHhtYXgsIHltaW4sIHltYXg7CisKKyAgICB5bWF4ID0gek5lYXIgKiAoR0xmbG9hdCl0YW4oZm92eSAqIFBJIC8gMzYwKTsKKyAgICB5bWluID0gLXltYXg7CisgICAgeG1pbiA9IHltaW4gKiBhc3BlY3Q7CisgICAgeG1heCA9IHltYXggKiBhc3BlY3Q7CisKKyAgICBnbEZydXN0dW14KChHTGZpeGVkKSh4bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeG1heCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgIChHTGZpeGVkKSh5bWluICogNjU1MzYpLCAoR0xmaXhlZCkoeW1heCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgIChHTGZpeGVkKSh6TmVhciAqIDY1NTM2KSwgKEdMZml4ZWQpKHpGYXIgKiA2NTUzNikpOworfQorCisKK3N0YXRpYyB2b2lkIHByZXBhcmVGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGdsQ2xlYXJDb2xvcngoKEdMZml4ZWQpKDAuMWYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4yZiAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgwLjNmICogNjU1MzYpLCAweDEwMDAwKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdVBlcnNwZWN0aXZlKDQ1LCAoZmxvYXQpd2lkdGggLyBoZWlnaHQsIDAuNWYsIDE1MCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKworICAgIGdsTG9hZElkZW50aXR5KCk7Cit9CisKKworc3RhdGljIHZvaWQgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpCit7CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwUG9zaXRpb25bXSA9IHsgLTB4NDAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDBEaWZmdXNlW10gPSB7IDB4MTAwMDAsIDB4NjY2NiwgMCwgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MVBvc2l0aW9uW10gPSB7IDB4MTAwMDAsIC0weDIwMDAwLCAtMHgxMDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MURpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDIzZDcsIDB4NTk5OSwgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MlBvc2l0aW9uW10gPSB7IC0weDEwMDAwLCAwLCAtMHg0MDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MkRpZmZ1c2VbXSA9IHsgMHgxMWViLCAweDJiODUsIDB4MjNkNywgMHgxMDAwMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIG1hdGVyaWFsU3BlY3VsYXJbXSA9IHsgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCB9OworCisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfUE9TSVRJT04sIGxpZ2h0MFBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQwLCBHTF9ESUZGVVNFLCBsaWdodDBEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9QT1NJVElPTiwgbGlnaHQxUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDEsIEdMX0RJRkZVU0UsIGxpZ2h0MURpZmZ1c2UpOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX1BPU0lUSU9OLCBsaWdodDJQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMiwgR0xfRElGRlVTRSwgbGlnaHQyRGlmZnVzZSk7CisgICAgZ2xNYXRlcmlhbHh2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgbWF0ZXJpYWxTcGVjdWxhcik7CisKKyAgICBnbE1hdGVyaWFseChHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCA2MCA8PCAxNik7CisgICAgZ2xFbmFibGUoR0xfQ09MT1JfTUFURVJJQUwpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdNb2RlbHMoZmxvYXQgelNjYWxlKQoreworICAgIGNvbnN0IGludCB0cmFuc2xhdGlvblNjYWxlID0gOTsKKyAgICBpbnQgeCwgeTsKKworICAgIHNlZWRSYW5kb20oOSk7CisKKyAgICBnbFNjYWxleCgxIDw8IDE2LCAxIDw8IDE2LCAoR0xmaXhlZCkoelNjYWxlICogNjU1MzYpKTsKKworICAgIGZvciAoeSA9IC01OyB5IDw9IDU7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IC01OyB4IDw9IDU7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgYnVpbGRpbmdTY2FsZTsKKyAgICAgICAgICAgIEdMZml4ZWQgZml4ZWRTY2FsZTsKKworICAgICAgICAgICAgaW50IGN1clNoYXBlID0gcmFuZG9tVUludCgpICUgU1VQRVJTSEFQRV9DT1VOVDsKKyAgICAgICAgICAgIGJ1aWxkaW5nU2NhbGUgPSBzU3VwZXJTaGFwZVBhcmFtc1tjdXJTaGFwZV1bU1VQRVJTSEFQRV9QQVJBTVMgLSAxXTsKKyAgICAgICAgICAgIGZpeGVkU2NhbGUgPSAoR0xmaXhlZCkoYnVpbGRpbmdTY2FsZSAqIDY1NTM2KTsKKworICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgICAgICBnbFRyYW5zbGF0ZXgoKHggKiB0cmFuc2xhdGlvblNjYWxlKSAqIDY1NTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICh5ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGdsUm90YXRleCgoR0xmaXhlZCkoKHJhbmRvbVVJbnQoKSAlIDM2MCkgPDwgMTYpLCAwLCAwLCAxIDw8IDE2KTsKKyAgICAgICAgICAgIGdsU2NhbGV4KGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUsIGZpeGVkU2NhbGUpOworCisgICAgICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW2N1clNoYXBlXSk7CisgICAgICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh4ID0gLTI7IHggPD0gMjsgKyt4KQorICAgIHsKKyAgICAgICAgY29uc3QgaW50IHNoaXBTY2FsZTEwMCA9IHRyYW5zbGF0aW9uU2NhbGUgKiA1MDA7CisgICAgICAgIGNvbnN0IGludCBvZmZzMTAwID0geCAqIHNoaXBTY2FsZTEwMCArIChzVGljayAlIHNoaXBTY2FsZTEwMCk7CisgICAgICAgIGZsb2F0IG9mZnMgPSBvZmZzMTAwICogMC4wMWY7CisgICAgICAgIEdMZml4ZWQgZml4ZWRPZmZzID0gKEdMZml4ZWQpKG9mZnMgKiA2NTUzNik7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBnbFRyYW5zbGF0ZXgoZml4ZWRPZmZzLCAtNCAqIDY1NTM2LCAyIDw8IDE2KTsKKyAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UIC0gMV0pOworICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KC00ICogNjU1MzYsIGZpeGVkT2ZmcywgNCA8PCAxNik7CisgICAgICAgIGdsUm90YXRleCg5MCA8PCAxNiwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICB9Cit9CisKKworLyogRm9sbG93aW5nIGdsdUxvb2tBdCBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20gdGhlCisgKiBNZXNhIDNEIEdyYXBoaWNzIGxpYnJhcnkuIGh0dHA6Ly93d3cubWVzYTNkLm9yZworICovCitzdGF0aWMgdm9pZCBnbHVMb29rQXQoR0xmbG9hdCBleWV4LCBHTGZsb2F0IGV5ZXksIEdMZmxvYXQgZXlleiwKKwkgICAgICAgICAgICAgIEdMZmxvYXQgY2VudGVyeCwgR0xmbG9hdCBjZW50ZXJ5LCBHTGZsb2F0IGNlbnRlcnosCisJICAgICAgICAgICAgICBHTGZsb2F0IHVweCwgR0xmbG9hdCB1cHksIEdMZmxvYXQgdXB6KQoreworICAgIEdMZmxvYXQgbVsxNl07CisgICAgR0xmbG9hdCB4WzNdLCB5WzNdLCB6WzNdOworICAgIEdMZmxvYXQgbWFnOworCisgICAgLyogTWFrZSByb3RhdGlvbiBtYXRyaXggKi8KKworICAgIC8qIFogdmVjdG9yICovCisgICAgelswXSA9IGV5ZXggLSBjZW50ZXJ4OworICAgIHpbMV0gPSBleWV5IC0gY2VudGVyeTsKKyAgICB6WzJdID0gZXlleiAtIGNlbnRlcno7CisgICAgbWFnID0gKGZsb2F0KXNxcnQoelswXSAqIHpbMF0gKyB6WzFdICogelsxXSArIHpbMl0gKiB6WzJdKTsKKyAgICBpZiAobWFnKSB7CQkJLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgICAgIHpbMF0gLz0gbWFnOworICAgICAgICB6WzFdIC89IG1hZzsKKyAgICAgICAgelsyXSAvPSBtYWc7CisgICAgfQorCisgICAgLyogWSB2ZWN0b3IgKi8KKyAgICB5WzBdID0gdXB4OworICAgIHlbMV0gPSB1cHk7CisgICAgeVsyXSA9IHVwejsKKworICAgIC8qIFggdmVjdG9yID0gWSBjcm9zcyBaICovCisgICAgeFswXSA9IHlbMV0gKiB6WzJdIC0geVsyXSAqIHpbMV07CisgICAgeFsxXSA9IC15WzBdICogelsyXSArIHlbMl0gKiB6WzBdOworICAgIHhbMl0gPSB5WzBdICogelsxXSAtIHlbMV0gKiB6WzBdOworCisgICAgLyogUmVjb21wdXRlIFkgPSBaIGNyb3NzIFggKi8KKyAgICB5WzBdID0gelsxXSAqIHhbMl0gLSB6WzJdICogeFsxXTsKKyAgICB5WzFdID0gLXpbMF0gKiB4WzJdICsgelsyXSAqIHhbMF07CisgICAgeVsyXSA9IHpbMF0gKiB4WzFdIC0gelsxXSAqIHhbMF07CisKKyAgICAvKiBtcGljaGxlciwgMTk5NTA1MTUgKi8KKyAgICAvKiBjcm9zcyBwcm9kdWN0IGdpdmVzIGFyZWEgb2YgcGFyYWxsZWxvZ3JhbSwgd2hpY2ggaXMgPCAxLjAgZm9yCisgICAgICogbm9uLXBlcnBlbmRpY3VsYXIgdW5pdC1sZW5ndGggdmVjdG9yczsgc28gbm9ybWFsaXplIHgsIHkgaGVyZQorICAgICAqLworCisgICAgbWFnID0gKGZsb2F0KXNxcnQoeFswXSAqIHhbMF0gKyB4WzFdICogeFsxXSArIHhbMl0gKiB4WzJdKTsKKyAgICBpZiAobWFnKSB7CisgICAgICAgIHhbMF0gLz0gbWFnOworICAgICAgICB4WzFdIC89IG1hZzsKKyAgICAgICAgeFsyXSAvPSBtYWc7CisgICAgfQorCisgICAgbWFnID0gKGZsb2F0KXNxcnQoeVswXSAqIHlbMF0gKyB5WzFdICogeVsxXSArIHlbMl0gKiB5WzJdKTsKKyAgICBpZiAobWFnKSB7CisgICAgICAgIHlbMF0gLz0gbWFnOworICAgICAgICB5WzFdIC89IG1hZzsKKyAgICAgICAgeVsyXSAvPSBtYWc7CisgICAgfQorCisjZGVmaW5lIE0ocm93LGNvbCkgIG1bY29sKjQrcm93XQorICAgIE0oMCwgMCkgPSB4WzBdOworICAgIE0oMCwgMSkgPSB4WzFdOworICAgIE0oMCwgMikgPSB4WzJdOworICAgIE0oMCwgMykgPSAwLjA7CisgICAgTSgxLCAwKSA9IHlbMF07CisgICAgTSgxLCAxKSA9IHlbMV07CisgICAgTSgxLCAyKSA9IHlbMl07CisgICAgTSgxLCAzKSA9IDAuMDsKKyAgICBNKDIsIDApID0gelswXTsKKyAgICBNKDIsIDEpID0gelsxXTsKKyAgICBNKDIsIDIpID0gelsyXTsKKyAgICBNKDIsIDMpID0gMC4wOworICAgIE0oMywgMCkgPSAwLjA7CisgICAgTSgzLCAxKSA9IDAuMDsKKyAgICBNKDMsIDIpID0gMC4wOworICAgIE0oMywgMykgPSAxLjA7CisjdW5kZWYgTQorICAgIHsKKyAgICAgICAgaW50IGE7CisgICAgICAgIEdMZml4ZWQgZml4ZWRNWzE2XTsKKyAgICAgICAgZm9yIChhID0gMDsgYSA8IDE2OyArK2EpCisgICAgICAgICAgICBmaXhlZE1bYV0gPSAoR0xmaXhlZCkobVthXSAqIDY1NTM2KTsKKyAgICAgICAgZ2xNdWx0TWF0cml4eChmaXhlZE0pOworICAgIH0KKworICAgIC8qIFRyYW5zbGF0ZSBFeWUgdG8gT3JpZ2luICovCisgICAgZ2xUcmFuc2xhdGV4KChHTGZpeGVkKSgtZXlleCAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV5ICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoLWV5ZXogKiA2NTUzNikpOworfQorCisKK3N0YXRpYyB2b2lkIGNhbVRyYWNrKCkKK3sKKyAgICBmbG9hdCBsZXJwWzVdOworICAgIGZsb2F0IGVYLCBlWSwgZVosIGNYLCBjWSwgY1o7CisgICAgZmxvYXQgdHJhY2tQb3M7CisgICAgQ0FNVFJBQ0sgKmNhbTsKKyAgICBsb25nIGN1cnJlbnRDYW1UaWNrOworICAgIGludCBhOworCisgICAgaWYgKHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPD0gc1RpY2spCisgICAgeworICAgICAgICArK3NDdXJyZW50Q2FtVHJhY2s7CisgICAgICAgIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgPSBzTmV4dENhbVRyYWNrU3RhcnRUaWNrOworICAgIH0KKyAgICBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja10ubGVuICogQ0FNVFJBQ0tfTEVOOworCisgICAgY2FtID0gJnNDYW1UcmFja3Nbc0N1cnJlbnRDYW1UcmFja107CisgICAgY3VycmVudENhbVRpY2sgPSBzVGljayAtIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgdHJhY2tQb3MgPSAoZmxvYXQpY3VycmVudENhbVRpY2sgLyAoQ0FNVFJBQ0tfTEVOICogY2FtLT5sZW4pOworCisgICAgZm9yIChhID0gMDsgYSA8IDU7ICsrYSkKKyAgICAgICAgbGVycFthXSA9IChjYW0tPnNyY1thXSArIGNhbS0+ZGVzdFthXSAqIHRyYWNrUG9zKSAqIDAuMDFmOworCisgICAgaWYgKGNhbS0+ZGlzdCkKKyAgICB7CisgICAgICAgIGZsb2F0IGRpc3QgPSBjYW0tPmRpc3QgKiAwLjFmOworICAgICAgICBjWCA9IGxlcnBbMF07CisgICAgICAgIGNZID0gbGVycFsxXTsKKyAgICAgICAgY1ogPSBsZXJwWzJdOworICAgICAgICBlWCA9IGNYIC0gKGZsb2F0KWNvcyhsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVZID0gY1kgLSAoZmxvYXQpc2luKGxlcnBbM10pICogZGlzdDsKKyAgICAgICAgZVogPSBjWiAtIGxlcnBbNF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVYID0gbGVycFswXTsKKyAgICAgICAgZVkgPSBsZXJwWzFdOworICAgICAgICBlWiA9IGxlcnBbMl07CisgICAgICAgIGNYID0gZVggKyAoZmxvYXQpY29zKGxlcnBbM10pOworICAgICAgICBjWSA9IGVZICsgKGZsb2F0KXNpbihsZXJwWzNdKTsKKyAgICAgICAgY1ogPSBlWiArIGxlcnBbNF07CisgICAgfQorICAgIGdsdUxvb2tBdChlWCwgZVksIGVaLCBjWCwgY1ksIGNaLCAwLCAwLCAxKTsKK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KKy8qIFRoZSB0aWNrIGlzIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMsIHdpZHRoIGFuZCBoZWlnaHQKKyAqIGFyZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyB0byBiZSByZW5kZXJlZC4KKyAqLwordm9pZCBhcHBSZW5kZXIobG9uZyB0aWNrLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaWYgKHNTdGFydFRpY2sgPT0gMCkKKyAgICAgICAgc1N0YXJ0VGljayA9IHRpY2s7CisgICAgaWYgKCFnQXBwQWxpdmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEFjdHVhbCB0aWNrIHZhbHVlIGlzICJibHVycmVkIiBhIGxpdHRsZSBiaXQuCisgICAgc1RpY2sgPSAoc1RpY2sgKyB0aWNrIC0gc1N0YXJ0VGljaykgPj4gMTsKKworICAgIC8vIFRlcm1pbmF0ZSBhcHBsaWNhdGlvbiBhZnRlciBydW5uaW5nIHRocm91Z2ggdGhlIGRlbW9uc3RyYXRpb24gb25jZS4KKyAgICBpZiAoc1RpY2sgPj0gUlVOX0xFTkdUSCkKKyAgICB7CisgICAgICAgIGdBcHBBbGl2ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBQcmVwYXJlIE9wZW5HTCBFUyBmb3IgcmVuZGVyaW5nIG9mIHRoZSBmcmFtZS4KKyAgICBwcmVwYXJlRnJhbWUod2lkdGgsIGhlaWdodCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGNhbWVyYSBwb3NpdGlvbiBhbmQgc2V0IHRoZSBsb29rYXQuCisgICAgY2FtVHJhY2soKTsKKworICAgIC8vIENvbmZpZ3VyZSBlbnZpcm9ubWVudC4KKyAgICBjb25maWd1cmVMaWdodEFuZE1hdGVyaWFsKCk7CisKKyAgICAvLyBEcmF3IHRoZSByZWZsZWN0aW9uIGJ5IGRyYXdpbmcgbW9kZWxzIHdpdGggbmVnYXRlZCBaLWF4aXMuCisgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgZHJhd01vZGVscygtMSk7CisgICAgZ2xQb3BNYXRyaXgoKTsKKworICAgIC8vIEJsZW5kIHRoZSBncm91bmQgcGxhbmUgdG8gdGhlIHdpbmRvdy4KKyAgICBkcmF3R3JvdW5kUGxhbmUoKTsKKworICAgIC8vIERyYXcgYWxsIHRoZSBtb2RlbHMgbm9ybWFsbHkuCisgICAgZHJhd01vZGVscygxKTsKKworICAgIC8vIERyYXcgZmFkZSBxdWFkIG92ZXIgd2hvbGUgd2luZG93ICh3aGVuIGNoYW5naW5nIGNhbWVyYXMpLgorICAgIGRyYXdGYWRlUXVhZCgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NDBjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK3N0YXRpYyB2b2lkICptYXBfbWVtb3J5KGNvbnN0IGNoYXIgKmZuLCB1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBzaXplKQoreworICAgIGludCBmZDsKKyAgICB2b2lkICpwdHI7CisgICAgCisgICAgZmQgPSBvcGVuKGZuLCBPX1JEV1IgfCBPX1NZTkMpOworICAgIGlmKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoImNhbm5vdCBvcGVuICVzIGZvciBtYXBwaW5nIik7CisgICAgICAgIHJldHVybiBNQVBfRkFJTEVEOworICAgIH0KKworICAgIHB0ciA9IG1tYXAoMCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLCBiYXNlKTsKKyAgICBjbG9zZShmZCk7CisgICAgCisgICAgaWYocHRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImNhbm5vdCBtYXAgJXMgKEAlMDh4LCUwOHgpXG4iLCBmbiwgYmFzZSwgc2l6ZSk7CisgICAgfQorICAgIHJldHVybiBwdHI7ICAgIAorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICB2b2lkICpncnBfcmVncyA9IG1hcF9tZW1vcnkoIi9kZXYvaHczZCIsIDAsIDEwMjQgKiAxMDI0KTsKKyAgICBwcmludGYoIkdQVSBiYXNlIG1hcHBlZCBhdCAlcFxuIiwgZ3JwX3JlZ3MpOworICAgIGludCBzdGF0ZV9vZmZzZXQgPSAweDEwMTQwOworICAgIHByaW50ZigiR1BVIHN0YXRlID0gJTA4bHhcbiIsCisgICAgICAgICAgICAqKChsb25nKikoKGNoYXIqKWdycF9yZWdzICsgc3RhdGVfb2Zmc2V0KSkgICk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY4NDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oCkBAIC0wLDAgKzEsMjI5IEBACisjaWZuZGVmIF9fZWdsX2hfCisjZGVmaW5lIF9fZWdsX2hfCisKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKgorKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCisqKgorKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKKyoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAorKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCisqKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgorKioKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqCisqKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcworKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQorKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKKyoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgorKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCisqKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKKyoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KKyoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZworKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCisqLworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZWdsdHlwZXMuaD4KKworLyoKKyoqIGVnbHR5cGVzLmggaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBJdCBkZWZpbmVzOgorKioKKyoqICAgICAtIEVHTCB0eXBlcyBhbmQgcmVzb3VyY2VzCisqKiAgICAgLSBOYXRpdmUgdHlwZXMKKyoqICAgICAtIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyoqCisqKiBFR0wgdHlwZXMgYW5kIHJlc291cmNlcyBhcmUgdG8gYmUgdHlwZWRlZidlZCB3aXRoIGFwcHJvcHJpYXRlIHBsYXRmb3JtCisqKiBkZXBlbmRlbnQgcmVzb3VyY2UgaGFuZGxlIHR5cGVzLiBFR0xpbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIG9mIGF0IGxlYXN0CisqKiAzMi1iaXQuCisqKgorKiogTmF0aXZlRGlzcGxheVR5cGUsIE5hdGl2ZVdpbmRvd1R5cGUgYW5kIE5hdGl2ZVBpeG1hcFR5cGUgYXJlIHRvIGJlCisqKiByZXBsYWNlZCB3aXRoIGNvcnJlc3BvbmRpbmcgdHlwZXMgb2YgdGhlIG5hdGl2ZSB3aW5kb3cgc3lzdGVtIGluIGVnbC5oLgorKioKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMgbXVzdCBtYXRjaCB0aGVpciB0eXBlcy4KKyoqCisqKiBFeGFtcGxlIGVnbHR5cGVzLmg6CisqLworCisjaWYgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmF0aXZlX3dpbmRvd19zeXN0ZW0uaD4KKworLyoKKyoqIFR5cGVzIGFuZCByZXNvdXJjZXMKKyovCit0eXBlZGVmIGludCBFR0xCb29sZWFuOwordHlwZWRlZiBpbnQzMl90IEVHTGludDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwordHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwordHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OworCisvKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKKyNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCisKKyNlbmRpZgorCisvKgorKiogVmVyc2lvbmluZyBhbmQgZXh0ZW5zaW9ucworKi8KKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8wCQkgICAgICAgMQorCisvKgorKiogQm9vbGVhbgorKi8KKyNkZWZpbmUgRUdMX0ZBTFNFCQkgICAgICAgMAorI2RlZmluZSBFR0xfVFJVRQkJICAgICAgIDEKKworLyoKKyoqIEVycm9ycworKi8KKyNkZWZpbmUgRUdMX1NVQ0NFU1MJCSAgICAgICAweDMwMDAKKyNkZWZpbmUgRUdMX05PVF9JTklUSUFMSVpFRAkgICAgICAgMHgzMDAxCisjZGVmaW5lIEVHTF9CQURfQUNDRVNTCQkgICAgICAgMHgzMDAyCisjZGVmaW5lIEVHTF9CQURfQUxMT0MJCSAgICAgICAweDMwMDMKKyNkZWZpbmUgRUdMX0JBRF9BVFRSSUJVVEUJICAgICAgIDB4MzAwNAorI2RlZmluZSBFR0xfQkFEX0NPTkZJRwkJICAgICAgIDB4MzAwNQorI2RlZmluZSBFR0xfQkFEX0NPTlRFWFQJCSAgICAgICAweDMwMDYKKyNkZWZpbmUgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UgICAgICAgIDB4MzAwNworI2RlZmluZSBFR0xfQkFEX0RJU1BMQVkJCSAgICAgICAweDMwMDgKKyNkZWZpbmUgRUdMX0JBRF9NQVRDSAkJICAgICAgIDB4MzAwOQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9QSVhNQVAJICAgICAgIDB4MzAwQQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9XSU5ET1cJICAgICAgIDB4MzAwQgorI2RlZmluZSBFR0xfQkFEX1BBUkFNRVRFUgkgICAgICAgMHgzMDBDCisjZGVmaW5lIEVHTF9CQURfU1VSRkFDRQkJICAgICAgIDB4MzAwRAorLyogMHgzMDBFIC0gMHgzMDFGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGVycm9ycy4gKi8KKworLyoKKyoqIENvbmZpZyBhdHRyaWJ1dGVzCisqLworI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCSAgICAgICAweDMwMjAKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCSAgICAgICAweDMwMjEKKyNkZWZpbmUgRUdMX0JMVUVfU0laRQkJICAgICAgIDB4MzAyMgorI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJICAgICAgIDB4MzAyMworI2RlZmluZSBFR0xfUkVEX1NJWkUJCSAgICAgICAweDMwMjQKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCSAgICAgICAweDMwMjUKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkgICAgICAgMHgzMDI2CisjZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCSAgICAgICAweDMwMjcKKyNkZWZpbmUgRUdMX0NPTkZJR19JRAkJICAgICAgIDB4MzAyOAorI2RlZmluZSBFR0xfTEVWRUwJCSAgICAgICAweDMwMjkKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkgICAgICAgMHgzMDJBCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJICAgICAgIDB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJICAgICAgIDB4MzAyQworI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJICAgICAgIDB4MzAyRAorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkgICAgICAgMHgzMDJFCisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJICAgICAgIDB4MzAyRgorLyojZGVmaW5lIEVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTCSAweDMwMzAqLworI2RlZmluZSBFR0xfU0FNUExFUwkJICAgICAgIDB4MzAzMQorI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMJICAgICAgIDB4MzAzMgorI2RlZmluZSBFR0xfU1VSRkFDRV9UWVBFCSAgICAgICAweDMwMzMKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1RZUEUJICAgICAgIDB4MzAzNAorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSAgICAgMHgzMDM1CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSAgICAweDMwMzYKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSAgICAgIDB4MzAzNworCisvKgorKiogQ29uZmlnIGF0dHJpYnV0ZSBhbmQgdmFsdWUKKyovCisjZGVmaW5lIEVHTF9OT05FCQkgICAgICAgMHgzMDM4CisvKiAweDMwMzkgLSAweDMwNEYgcmVzZXJ2ZWQgZm9yIGFkZGl0aW9uYWwgY29uZmlnIGF0dHJpYnV0ZXMuICovCisKKy8qCisqKiBDb25maWcgdmFsdWVzCisqLworI2RlZmluZSBFR0xfRE9OVF9DQVJFCQkgICAgICAgKChFR0xpbnQpIC0xKQorI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCSAgICAgICAweDAxCisjZGVmaW5lIEVHTF9QSVhNQVBfQklUCQkgICAgICAgMHgwMgorI2RlZmluZSBFR0xfV0lORE9XX0JJVAkJICAgICAgIDB4MDQKKyNkZWZpbmUgRUdMX1NMT1dfQ09ORklHCQkgICAgICAgMHgzMDUwCisjZGVmaW5lIEVHTF9OT05fQ09ORk9STUFOVF9DT05GSUcgICAgICAweDMwNTEKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQgkgICAgICAgMHgzMDUyCisKKy8qCisqKiBTdHJpbmcgbmFtZXMKKyovCisjZGVmaW5lIEVHTF9WRU5ET1IJCSAgICAgICAweDMwNTMKKyNkZWZpbmUgRUdMX1ZFUlNJT04JCSAgICAgICAweDMwNTQKKyNkZWZpbmUgRUdMX0VYVEVOU0lPTlMJCSAgICAgICAweDMwNTUKKworLyoKKyoqIFN1cmZhY2UgYXR0cmlidXRlcworKi8KKyNkZWZpbmUgRUdMX0hFSUdIVAkJICAgICAgIDB4MzA1NgorI2RlZmluZSBFR0xfV0lEVEgJCSAgICAgICAweDMwNTcKKyNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUgkgICAgICAgMHgzMDU4CisKKy8qCisqKiBDdXJyZW50IHN1cmZhY2VzCisqLworI2RlZmluZSBFR0xfRFJBVwkJICAgICAgIDB4MzA1OQorI2RlZmluZSBFR0xfUkVBRAkJICAgICAgIDB4MzA1QQorCisvKgorKiogRW5naW5lcworKi8KKyNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkgICAgICAgMHgzMDVCCisKKy8qIDB4MzA1Qy0weDNGRkZGIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisKKy8qCisqKiBGdW5jdGlvbnMKKyovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0dMQVBJIEVHTGludCBBUElFTlRSWSBlZ2xHZXRFcnJvciAodm9pZCk7CisKK0dMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0RGlzcGxheSAoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEluaXRpYWxpemUgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsVGVybWluYXRlIChFR0xEaXNwbGF5IGRweSk7CitHTEFQSSBjb25zdCBjaGFyICogQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSk7CitHTEFQSSB2b2lkICgqIEFQSUVOVFJZIGVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSkpKCk7CisKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlncyAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDaG9vc2VDb25maWcgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xDb250ZXh0IEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xEZXN0cm95Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsTWFrZUN1cnJlbnQgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOworR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCAodm9pZCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlIChFR0xpbnQgcmVhZGRyYXcpOworR0xBUEkgRUdMRGlzcGxheSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSAodm9pZCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0R0wgKHZvaWQpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xXYWl0TmF0aXZlIChFR0xpbnQgZW5naW5lKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xDb3B5QnVmZmVycyAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjM2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisvKgorKiogVHlwZXMgYW5kIHJlc291cmNlcworKi8KK3R5cGVkZWYgaW50IEVHTEJvb2xlYW47Cit0eXBlZGVmIGxvbmcgRUdMaW50OwordHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OwordHlwZWRlZiB2b2lkICpFR0xDb25maWc7Cit0eXBlZGVmIHZvaWQgKkVHTFN1cmZhY2U7Cit0eXBlZGVmIHZvaWQgKkVHTENvbnRleHQ7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiB2b2lkICpOYXRpdmVXaW5kb3dUeXBlOwordHlwZWRlZiB2b2lkICpOYXRpdmVQaXhtYXBUeXBlOworCisvKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWSAoKE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9OT19DT05URVhUICgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWSAoKEVHTERpc3BsYXkpMCkKKyNkZWZpbmUgRUdMX05PX1NVUkZBQ0UgKChFR0xTdXJmYWNlKTApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTQ4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApAQCAtMCwwICsxLDU4NCBAQAorI2lmbmRlZiBfX2dsX2hfCisjZGVmaW5lIF9fZ2xfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCisqKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCisqKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCisqKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisqKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAorKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgorKiogCisqKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKKyoqIAorKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKKyoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAorKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCisqKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgorKiogCisqKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKKyoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAorKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisqKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKKyoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKiAKKyoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCisqKiBlc3RhYmxpc2hlZCBieSBTR0kgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgT3JpZ2luYWwgQ29kZSBhcmUgVGhlCisqKiBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtOiBBIFNwZWNpZmljYXRpb24gKFZlcnNpb24gMS4yLjEpLCByZWxlYXNlZAorKiogQXByaWwgMSwgMTk5OTsgVGhlIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW0gVXRpbGl0eSBMaWJyYXJ5IChWZXJzaW9uCisqKiAxLjMpLCByZWxlYXNlZCBOb3ZlbWJlciA0LCAxOTk4OyBhbmQgT3BlbkdMKFIpIEdyYXBoaWNzIHdpdGggdGhlIFgKKyoqIFdpbmRvdyBTeXN0ZW0oUikgKFZlcnNpb24gMS4zKSwgcmVsZWFzZWQgT2N0b2JlciAxOSwgMTk5OC4gVGhpcyBzb2Z0d2FyZQorKiogd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbgorKiogcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcyBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nCisqKiBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KKyovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgR0xzaG9ydDsKK3R5cGVkZWYgaW50IEdMaW50OwordHlwZWRlZiBpbnQgR0xzaXplaTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTHVieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKK3R5cGVkZWYgZmxvYXQgR0xmbG9hdDsKK3R5cGVkZWYgZmxvYXQgR0xjbGFtcGY7Cit0eXBlZGVmIHZvaWQgR0x2b2lkOwordHlwZWRlZiBpbnQgR0xpbnRwdHJBUkI7Cit0eXBlZGVmIGludCBHTHNpemVpcHRyQVJCOwordHlwZWRlZiBpbnQgR0xmaXhlZDsKK3R5cGVkZWYgaW50IEdMY2xhbXB4OworLyogSW50ZXJuYWwgY29udmVuaWVuY2UgdHlwZWRlZnMgKi8KK3R5cGVkZWYgdm9pZCAoKl9HTGZ1bmNwdHIpKCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFeHRlbnNpb25zICovCisjZGVmaW5lIEdMX09FU19WRVJTSU9OXzFfMCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX09FU19yZWFkX2Zvcm1hdCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgMQorCisvKiBDbGVhckJ1ZmZlck1hc2sgKi8KKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKworLyogQm9vbGVhbiAqLworI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBCZWdpbk1vZGUgKi8KKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvKiBBbHBoYUZ1bmN0aW9uICovCisjZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworCisvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KKyNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKKworLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KKy8qICAgICAgR0xfWkVSTyAqLworLyogICAgICBHTF9PTkUgKi8KKyNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKKy8qICAgICAgR0xfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfRFNUX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KKworLyogQ29sb3JNYXRlcmlhbEZhY2UgKi8KKy8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KKworLyogQ29sb3JNYXRlcmlhbFBhcmFtZXRlciAqLworLyogICAgICBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICovCisKKy8qIENvbG9yUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworCisvKiBDdWxsRmFjZU1vZGUgKi8KKyNkZWZpbmUgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNAorI2RlZmluZSBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA1CisjZGVmaW5lIEdMX0ZST05UX0FORF9CQUNLICAgICAgICAgICAgICAgICAweDA0MDgKKworLyogRGVwdGhGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogRW5hYmxlQ2FwICovCisjZGVmaW5lIEdMX0ZPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjAKKyNkZWZpbmUgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgIDB4MEI1MAorI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCisjZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEJDMAorI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCisjZGVmaW5lIEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAweDBCRjIKKyNkZWZpbmUgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJEMAorI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQjkwCisjZGVmaW5lIEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCNzEKKy8qICAgICAgR0xfTElHSFQwICovCisvKiAgICAgIEdMX0xJR0hUMSAqLworLyogICAgICBHTF9MSUdIVDIgKi8KKy8qICAgICAgR0xfTElHSFQzICovCisvKiAgICAgIEdMX0xJR0hUNCAqLworLyogICAgICBHTF9MSUdIVDUgKi8KKy8qICAgICAgR0xfTElHSFQ2ICovCisvKiAgICAgIEdMX0xJR0hUNyAqLworI2RlZmluZSBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgMHgwQjEwCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIICAgICAgICAgICAgICAgICAgICAweDBCMjAKKyNkZWZpbmUgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDB4MEMxMQorI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgMHgwQjU3CisjZGVmaW5lIEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAweDBCQTEKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUwgICAgICAgICAgICAgICAgIDB4ODAzQQorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgMHg4MDM3CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzQKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgMHg4MDc2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAweDgwNzgKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgIDB4ODA5RAorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDB4ODBBMAorCisvKiBFcnJvckNvZGUgKi8KKyNkZWZpbmUgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgwNTAxCisjZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAweDA1MDIKKyNkZWZpbmUgR0xfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAgICAgIDB4MDUwMworI2RlZmluZSBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgMHgwNTA0CisjZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAweDA1MDUKKworLyogRm9nTW9kZSAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCisKKy8qIEZvZ1BhcmFtZXRlciAqLworI2RlZmluZSBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgMHgwQjYyCisjZGVmaW5lIEdMX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAweDBCNjMKKyNkZWZpbmUgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NAorI2RlZmluZSBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY1CisjZGVmaW5lIEdMX0ZPR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDBCNjYKKworLyogRnJvbnRGYWNlRGlyZWN0aW9uICovCisjZGVmaW5lIEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAKKyNkZWZpbmUgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMQorCisvKiBHZXRQTmFtZSAqLworI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAweDBCMjIKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAorI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgMHg4QjlBCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAweDhCOUIKKyNkZWZpbmUgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQzMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgMHgwRDMzCisjZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAweDBEMzYKKyNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgIDB4MEQzOAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgMHgwRDM5CisjZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAweDBEM0EKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKKyNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCisjZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKKyNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgorI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCisjZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKKyNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQorI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2CisjZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKKworLyogSGludE1vZGUgKi8KKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKworLyogSGludFRhcmdldCAqLworI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgMHgwQzUwCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAweDBDNTEKKyNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgIDB4MEM1MgorI2RlZmluZSBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgMHgwQzUzCisjZGVmaW5lIEdMX0ZPR19ISU5UICAgICAgICAgICAgICAgICAgICAgICAweDBDNTQKKworLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgMHgwQjUzCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAweDBCNTIKKworLyogTGlnaHRQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAxCisjZGVmaW5lIEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAweDEyMDIKKyNkZWZpbmUgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMworI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgMHgxMjA0CisjZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAweDEyMDUKKyNkZWZpbmUgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgIDB4MTIwNgorI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgMHgxMjA3CisjZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAweDEyMDgKKyNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgIDB4MTIwOQorCisvKiBEYXRhVHlwZSAqLworI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKKyNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQworCisvKiBMb2dpY09wICovCisjZGVmaW5lIEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDAKKyNkZWZpbmUgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMQorI2RlZmluZSBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgMHgxNTAyCisjZGVmaW5lIEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDMKKyNkZWZpbmUgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgIDB4MTUwNAorI2RlZmluZSBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA1CisjZGVmaW5lIEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDYKKyNkZWZpbmUgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNworI2RlZmluZSBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA4CisjZGVmaW5lIEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDkKKyNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQorI2RlZmluZSBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgMHgxNTBCCisjZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAweDE1MEMKKyNkZWZpbmUgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgIDB4MTUwRAorI2RlZmluZSBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBFCisjZGVmaW5lIEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEYKKworLyogTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIE1hdGVyaWFsUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDE2MDAKKyNkZWZpbmUgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMQorI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgMHgxNjAyCisvKiAgICAgIEdMX0FNQklFTlQgKi8KKy8qICAgICAgR0xfRElGRlVTRSAqLworLyogICAgICBHTF9TUEVDVUxBUiAqLworCisvKiBNYXRyaXhNb2RlICovCisjZGVmaW5lIEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAweDE3MDAKKyNkZWZpbmUgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MTcwMQorI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCisKKy8qIE5vcm1hbFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX0JZVEUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogUGl4ZWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgorI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3CisjZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCisKKy8qIFBpeGVsU3RvcmVQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisKKy8qIFBpeGVsVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisKKy8qIFNoYWRpbmdNb2RlbCAqLworI2RlZmluZSBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAwCisjZGVmaW5lIEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDEKKworLyogU3RlbmNpbEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBTdGVuY2lsT3AgKi8KKy8qICAgICAgR0xfWkVSTyAqLworI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCisjZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKKyNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgorI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCisvKiAgICAgIEdMX0lOVkVSVCAqLworCisvKiBTdHJpbmdOYW1lICovCisjZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKKworLyogVGV4Q29vcmRQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIFRleHR1cmVFbnZNb2RlICovCisjZGVmaW5lIEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKKyNkZWZpbmUgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQorLyogICAgICBHTF9CTEVORCAqLworI2RlZmluZSBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisvKiAgICAgIEdMX1JFUExBQ0UgKi8KKworLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgMHgyMjAwCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAweDIyMDEKKworLyogVGV4dHVyZUVudlRhcmdldCAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgMHgyMzAwCisKKy8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAorI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCisKKy8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KKy8qICAgICAgR0xfTkVBUkVTVCAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMworCisvKiBUZXh0dXJlUGFyYW1ldGVyTmFtZSAqLworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCisKKy8qIFRleHR1cmVUYXJnZXQgKi8KKy8qICAgICAgR0xfVEVYVFVSRV8yRCAqLworCisvKiBUZXh0dXJlVW5pdCAqLworI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKKworLyogVGV4dHVyZVdyYXBNb2RlICovCisjZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgorCisvKiBQaXhlbEludGVybmFsRm9ybWF0ICovCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTAKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5MQorI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4QjkyCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTMKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5NAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4Qjk1CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTYKKyNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5NworI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4Qjk4CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTkKKworLyogVmVydGV4UG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBMaWdodE5hbWUgKi8KKyNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmN4IChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuYyAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvcnggKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGh4IChHTGNsYW1weCBkZXB0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJTdGVuY2lsIChHTGludCBzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0ZiAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0eCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JNYXNrIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZiAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2ggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2Z2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW1mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVteCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7CitHTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTEFQSSBjb25zdCBHTHVieXRlICogQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmdiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGh4IChHTGZpeGVkIHdpZHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9naWNPcCAoR0xlbnVtIG9wY29kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNb2RlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4IChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNmIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzeCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlciAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhvZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG94IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZXggKEdMZml4ZWQgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4IChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9wTWF0cml4ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQdXNoTWF0cml4ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGVmIChHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGV4IChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVNb2RlbCAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsT3AgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0CkBAIC0wLDAgKzEsMzQgQEAKK1RoaXMgaXMgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvciB0aGUgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIg0KK09wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUgc291cmNlIGNvZGUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisNCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCithcmUgbWV0Og0KKw0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluDQorICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAgICAgIGRpc3RyaWJ1dGlvbi4NCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBzb2Z0d2FyZSBwcm9kdWN0J3MgY29weXJpZ2h0IG93bmVyIG5vcg0KKyAgICAgIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQ0KKyAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbg0KKyAgICAgIHBlcm1pc3Npb24uDQorDQorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCitUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQorTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTDQorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2Y1YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKQEAgLTAsMCArMSw1MDQgQEAKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwODQxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorQWxsIHJpZ2h0cyByZXNlcnZlZC4NCitXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQorDQorVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6DQorICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCisgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdA0KKyAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXINCisgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlDQorICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0Lg0KKyAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4NCisgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuDQorDQorVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcw0KK0xJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmZmFlOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IHNoYXBlcy5oLHYgMS42IDIwMDUvMDEvMzEgMjI6MTU6MzAgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS42ICQKKyAqLworCisjaWZuZGVmIFNIQVBFU19IX0lOQ0xVREVECisjZGVmaW5lIFNIQVBFU19IX0lOQ0xVREVECisKKworI2RlZmluZSBTVVBFUlNIQVBFX1BBUkFNUyAxNQorCitzdGF0aWMgY29uc3QgZmxvYXQgc1N1cGVyU2hhcGVQYXJhbXNbXVtTVVBFUlNIQVBFX1BBUkFNU10gPQoreworICAgIC8vIG0gIGEgICAgIGIgICAgIG4xICAgICAgbjIgICAgIG4zICAgICBtICAgICBhICAgICBiICAgICBuMSAgICAgbjIgICAgICBuMyAgIHJlczEgcmVzMiBzY2FsZSAgKG9yZy5yZXMxLHJlczIpCisgICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDgsICAgIDEsICAgIDEsICAgIC0xLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMzAsIDIgfSwgLy8gNDAsIDYwCisgICAgeyAxMCwgMSwgICAgMiwgICAgOTAsICAgICAgMSwgICAtNDUsICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAgMSwgIC0wLjRmLCAgIDIwLCAgMjAsIDQgfSwgLy8gNDAsIDQwCisgICAgeyAxMCwgMSwgICAgMiwgICAgNjAsICAgICAgMSwgICAtMTAsICAgIDQsICAgIDEsICAgIDEsICAgIC0xLCAgICAtMiwgIC0wLjRmLCAgIDQxLCAgNDEsIDEgfSwgLy8gODIsIDgyCisgICAgeyAgNiwgMSwgICAgMSwgICAgNjAsICAgICAgMSwgICAtNzAsICAgIDgsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDIwLCAgMjAsIDEgfSwgLy8gNDAsIDQwCisgICAgeyAgNCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgMjAsICAgMTIsICAgIDEsICAgIDEsICAwLjRmLCAgICAgMywgIDAuMjVmLCAgIDEwLCAgMzAsIDEgfSwgLy8gMjAsIDYwCisgICAgeyAgOCwgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgIDgsICAgIDIsICAgIDEsICAgIC0xLCAgICAgNSwgICAwLjVmLCAgIDI1LCAgMjYsIDEgfSwgLy8gNjAsIDYwCisgICAgeyAxMywgMSwgICAgMSwgICAgMzAsICAgICAgMSwgICAgLTQsICAgMTMsICAgIDEsICAgIDEsICAgICAxLCAgICAgNSwgICAgICAxLCAgIDMwLCAgMzAsIDYgfSwgLy8gNjAsIDYwCisgICAgeyAxMCwgMSwgMS4xZiwgLTAuNWYsICAgMC4xZiwgICAgNzAsICAgNjAsICAgIDEsICAgIDEsICAgLTkwLCAgICAgMCwgLTAuMjVmLCAgIDIwLCAgNjAsIDggfSwgLy8gNjAsIDE4MAorICAgIHsgIDcsIDEsICAgIDEsICAgIDIwLCAgLTAuM2YsIC0zLjVmLCAgICA2LCAgICAxLCAgICAxLCAgICAtMSwgIDQuNWYsICAgMC41ZiwgICAxMCwgIDIwLCA0IH0sIC8vIDYwLCA4MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDEwLCAgICAgMTAsICAgIDEwLCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIwLCAxIH0sIC8vIDIwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA0LCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAxMCwgIDEwLCAyIH0sIC8vIDEwLCAxMAorICAgIHsgIDEsIDEsICAgIDEsICAgIDM4LCAtMC4yNWYsICAgIDE5LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAxMCwgIDE1LCAyIH0sIC8vIDIwLCA0MAorICAgIHsgIDIsIDEsICAgIDEsICAwLjdmLCAgIDAuM2YsICAwLjJmLCAgICAzLCAgICAxLCAgICAxLCAgIDEwMCwgICAxMDAsICAgIDEwMCwgICAxMCwgIDI1LCAyIH0sIC8vIDIwLCA1MAorICAgIHsgIDYsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDEsICAgICAgMSwgICAzMCwgIDMwLCAyIH0sIC8vIDYwLCA2MAorICAgIHsgIDMsIDEsICAgIDEsICAgICAxLCAgICAgIDEsICAgICAxLCAgICA2LCAgICAxLCAgICAxLCAgICAgMiwgICAgIDEsICAgICAgMSwgICAxMCwgIDIwLCAyIH0sIC8vIDIwLCA0MAorICAgIHsgIDYsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAyNSwgICAgMTAsICAgICAxMCwgICAzMCwgIDIwLCAyIH0sIC8vIDYwLCA0MAorICAgIHsgIDMsIDEsICAgIDEsICAwLjVmLCAgIDEuN2YsICAxLjdmLCAgICAyLCAgICAxLCAgICAxLCAgICAxMCwgICAgMTAsICAgICAxMCwgICAyMCwgIDIwLCAyIH0sIC8vIDQwLCA0MAorICAgIHsgIDUsIDEsICAgIDEsICAwLjFmLCAgIDEuN2YsICAxLjdmLCAgICAxLCAgICAxLCAgICAxLCAgMC4zZiwgIDAuNWYsICAgMC41ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgIDIsIDEsICAgIDEsICAgICA2LCAgIDUuNWYsICAgMTAwLCAgICA2LCAgICAxLCAgICAxLCAgICAgNCwgICAgMTAsICAgICAxMCwgICAxMCwgIDIyLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgNzAsICAwLjFmLCAgICA5LCAgICAxLCAwLjVmLCAgIC05OCwgMC4wNWYsICAgIC00NSwgICAyMCwgIDMwLCA0IH0sIC8vIDYwLCA5MQorICAgIHsgIDYsIDEsICAgIDEsICAgIC0xLCAgICAgOTAsIC0wLjFmLCAgICA3LCAgICAxLCAgICAxLCAgICA5MCwgIDEuM2YsICAgICAzNCwgICAxMywgIDE2LCAxIH0sIC8vIDMyLCA2MAorfTsKKyNkZWZpbmUgU1VQRVJTSEFQRV9DT1VOVCAoc2l6ZW9mKHNTdXBlclNoYXBlUGFyYW1zKSAvIHNpemVvZihzU3VwZXJTaGFwZVBhcmFtc1swXSkpCisKKworI2VuZGlmIC8vICFTSEFQRVNfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDI1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWZpbHRlci5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliR0xFU19DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmlsdGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiYWMwNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmIChhcmdjIT0yICYmIGFyZ2MhPTMpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgPDAtNj4gW3BidWZmZXJdXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKKyAgICBpbnQgdXNlUGJ1ZmZlciA9IGFyZ2M9PTMgJiYgIXN0cmNtcChhcmd2WzJdLCAicGJ1ZmZlciIpOworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVHxFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICB9IGVsc2UgeworICAgICAgICAgcHJpbnRmKCJ1c2luZyBwYnVmZmVyXG4iKTsKKyAgICAgICAgIEVHTGludCBhdHRyaWJzW10gPSB7IEVHTF9XSURUSCwgMzIwLCBFR0xfSEVJR0hULCA0ODAsIEVHTF9OT05FIH07CisgICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYnMpOworICAgICB9CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgICBHTGludCBjcm9wWzRdID0geyAwLCA0LCA0LCAtNCB9OworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisKKyAgICAgLy8gcGFja2luZyBpcyBhbHdheXMgNAorICAgICB1aW50OF90IHQ4W10gID0geyAKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGLAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYgIH07CisKKyAgICAgdWludDE2X3QgdDE2W10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiwKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiAgfTsKKworICAgICB1aW50MTZfdCB0NTU1MVtdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAgIH07CisKKyAgICAgdWludDMyX3QgdDMyW10gID0geyAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAKKyAgICAgICAgICAgICAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAKKyAgICAgICAgICAgICAweEZGMDBGRkZGLCAweEZGMDBGRjAwLCAweDAwRkYwMEZGLCAweEZGRkZGRjAwLCAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGRkYwMEZGLCAweEZGMDBGRkZGLCAweEZGRkZGRkZGCisgICAgIH07CisKKyAgICAgc3dpdGNoKHRlc3QpIAorICAgICB7CisgICAgIGNhc2UgMToKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAzOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA0OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNToKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xLCB0NTU1MSk7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA2OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHQzMik7CisgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgZGltLCBkaW0pOworCisgICAgIGlmICghdXNlUGJ1ZmZlcikgeworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgIH0KKyAgICAgCisgICAgIGVnbFRlcm1pbmF0ZShkcHkpOworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I5NWVkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlmaW5pc2guYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkdMRVNfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbmlzaAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZmUyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCitsb25nIGxvbmcgc3lzdGVtVGltZSgpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHQ7CisgICAgdC50dl9zZWMgPSB0LnR2X25zZWMgPSAwOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIChsb25nIGxvbmcpKHQudHZfc2VjKSoxMDAwMDAwMDAwTEwgKyB0LnR2X25zZWM7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKyAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICAgIGxvbmcgbG9uZyBub3csIHQ7CisgICAgIGludCBpOworCisgICAgIGNoYXIqIHRleGVscyA9IG1hbGxvYyg1MTIqNTEyKjIpOworICAgICBtZW1zZXQodGV4ZWxzLDB4RkYsNTEyKjUxMioyKTsKKyAgICAgCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgNTEyLCA1MTIsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHRleGVscyk7CisKKyAgICAgY2hhciogZHN0ID0gbWFsbG9jKDMyMCo0ODAqMik7CisgICAgIG1lbXNldChkc3QsIDAsIDMyMCo0ODAqMik7CisgICAgIHByaW50ZigiMzA3MjAwIGJ5dGVzIG1lbWNweVxuIik7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBtZW1jcHkoZHN0LCB0ZXhlbHMsIDMyMCo0ODAqMik7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJtZW1jcHkoKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICB9CisgICAgIGZyZWUoZHN0KTsKKworICAgICBmcmVlKHRleGVscyk7CisKKyAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMjApOworICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKyAgICAgCisgICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDUxMng1MTIgYmxpdCAoeDIpOlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQgKHgyKTpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworCisgICAgIGludDE2X3QgdGV4ZWwgPSAweEY4MDA7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgMSwgMSwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJnRleGVsKTsKKworICAgICBwcmludGYoIjF4MSB1bm1vZGlmaWVkIHRleHR1cmUsIDF4MSBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiMXgxICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Nmc2ltL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFhMDNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWVnbF9zdXJmYWNlLmNwcCBcCisJc2ZzaW0uYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJHTEVTX0NNCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXNmc2ltCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmNwcCBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NzdmOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5jcHAKQEAgLTAsMCArMSwzNDYgQEAKKy8qIAorICoqCisgKiogQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wKHRoZSAiTGljZW5zZSIpOyAKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworI2luY2x1ZGUgImVnbF9zdXJmYWNlLmgiCisKKyNkZWZpbmUgTE9HSSh4Li4uKSBkbyB7IHByaW50ZigiSU5GTzogIiB4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTE9HVyh4Li4uKSBkbyB7IHByaW50ZigiV0FSTjogIiB4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTE9HRSh4Li4uKSBkbyB7IHByaW50ZigiRVJSOiAiIHgpOyB9IHdoaWxlICgwKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VnbF9uYXRpdmVfd2luZG93X3QqIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKQoreworICAgIGVnbF9uYXRpdmVfd2luZG93X3QqIHMgPSBuZXcgYW5kcm9pZDo6RUdMRGlzcGxheVN1cmZhY2UoKTsKKyAgICBzLT5tZW1vcnlfdHlwZSA9IE5BVElWRV9NRU1PUllfVFlQRV9HUFU7CisgICAgcmV0dXJuIHM7Cit9CisKKyNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKKyNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xEaXNwbGF5U3VyZmFjZTo6RUdMRGlzcGxheVN1cmZhY2UoKQorICAgIDogRUdMTmF0aXZlU3VyZmFjZTxFR0xEaXNwbGF5U3VyZmFjZT4oKQoreworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnZlcnNpb24gPSBzaXplb2YoZWdsX25hdGl2ZV93aW5kb3dfdCk7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6aWRlbnQgPSAwOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmluY1JlZiA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19pbmNSZWY7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZGVjUmVmID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX2RlY1JlZjsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojpzd2FwQnVmZmVycyA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19zd2FwQnVmZmVyczsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpzZXRTd2FwUmVjdGFuZ2xlID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX3NldFN3YXBSZWN0YW5nbGU7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6bmV4dEJ1ZmZlciA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19uZXh0QnVmZmVyOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmNvbm5lY3QgPSAwOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmRpc2Nvbm5lY3QgPSAwOworCisgICAgbUZiWzBdLmRhdGEgPSAwOworICAgIG1GYlsxXS5kYXRhID0gMDsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCA9IG1hcEZyYW1lQnVmZmVyKCk7CisgICAgaWYgKGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkID49IDApIHsKKyAgICAgICAgY29uc3QgZmxvYXQgaW4ybW0gPSAyNS40ZjsKKyAgICAgICAgZmxvYXQgcmVmcmVzaFJhdGUgPSAxMDAwMDAwMDAwMDAwMDAwTExVIC8gKAorICAgICAgICAgICAgICAgIGZsb2F0KCBtSW5mby51cHBlcl9tYXJnaW4gKyBtSW5mby5sb3dlcl9tYXJnaW4gKyBtSW5mby55cmVzICkgCisgICAgICAgICAgICAgICAgKiAoIG1JbmZvLmxlZnRfbWFyZ2luICArIG1JbmZvLnJpZ2h0X21hcmdpbiArIG1JbmZvLnhyZXMgKQorICAgICAgICAgICAgICAgICogbUluZm8ucGl4Y2xvY2spOworCisgICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIGJ1ZmZlciA9IG1GYlsxIC0gbUluZGV4XTsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6d2lkdGggID0gYnVmZmVyLndpZHRoOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpoZWlnaHQgPSBidWZmZXIuaGVpZ2h0OworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpzdHJpZGUgPSBidWZmZXIuc3RyaWRlOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojpmb3JtYXQgPSBidWZmZXIuZm9ybWF0OworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlICAgPSBpbnRwdHJfdChtRmJbMF0uZGF0YSk7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om9mZnNldCA9CisgICAgICAgICAgICBpbnRwdHJfdChidWZmZXIuZGF0YSkgLSBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmbGFncyAgPSAwOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojp4ZHBpID0gKG1JbmZvLnhyZXMgKiBpbjJtbSkgLyBtSW5mby53aWR0aDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6eWRwaSA9IChtSW5mby55cmVzICogaW4ybW0pIC8gbUluZm8uaGVpZ2h0OworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpmcHMgID0gcmVmcmVzaFJhdGU7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om1lbW9yeV90eXBlID0gTkFUSVZFX01FTU9SWV9UWVBFX0ZCOworICAgICAgICAvLyBubyBlcnJvciwgc2V0IHRoZSBtYWdpYyB3b3JkCisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om1hZ2ljID0gMHg2MDA5MTM7CisgICAgfQorICAgIG1Td2FwQ291bnQgPSAtMTsKKyAgICBtUGFnZUZsaXBDb3VudCA9IDA7Cit9CisKK0VHTERpc3BsYXlTdXJmYWNlOjp+RUdMRGlzcGxheVN1cmZhY2UoKQoreworICAgIG1hZ2ljID0gMDsKKyAgICBjbG9zZShlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCk7CisgICAgbXVubWFwKG1GYlswXS5kYXRhLCBtU2l6ZSk7CisgICAgaWYgKCEobUZsYWdzICYgUEFHRV9GTElQKSkKKyAgICAgICAgZnJlZSgodm9pZCopbUZiWzFdLmRhdGEpOworfQorCit2b2lkIEVHTERpc3BsYXlTdXJmYWNlOjpob29rX2luY1JlZihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdykgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHRoYXQtPmluY1N0cm9uZyh0aGF0KTsKK30KK3ZvaWQgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfZGVjUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KSB7CisgICAgRUdMRGlzcGxheVN1cmZhY2UqIHRoYXQgPSBzdGF0aWNfY2FzdDxFR0xEaXNwbGF5U3VyZmFjZSo+KHdpbmRvdyk7CisgICAgdGhhdC0+ZGVjU3Ryb25nKHRoYXQpOworfQordWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfc3dhcEJ1ZmZlcnMoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICByZXR1cm4gdGhhdC0+c3dhcEJ1ZmZlcnMoKTsKK30KK3VpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpob29rX25leHRCdWZmZXIoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICByZXR1cm4gdGhhdC0+bmV4dEJ1ZmZlcigpOworfQordm9pZCBFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19zZXRTd2FwUmVjdGFuZ2xlKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICBpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCkgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHRoYXQtPnNldFN3YXBSZWN0YW5nbGUobCwgdCwgdywgaCk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheVN1cmZhY2U6OnNldFN3YXBSZWN0YW5nbGUoaW50IGwsIGludCB0LCBpbnQgdywgaW50IGgpCit7CisgICAgbUluZm8ucmVzZXJ2ZWRbMF0gPSAweDU0NDQ1MDU1OyAvLyAiVVBEVCI7CisgICAgbUluZm8ucmVzZXJ2ZWRbMV0gPSAodWludDE2X3QpbCB8ICgodWludDMyX3QpdCA8PCAxNik7CisgICAgbUluZm8ucmVzZXJ2ZWRbMl0gPSAodWludDE2X3QpKGwrdykgfCAoKHVpbnQzMl90KSh0K2gpIDw8IDE2KTsKK30KKwordWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6OnN3YXBCdWZmZXJzKCkKK3sKKyAgICBpZiAoIShtRmxhZ3MgJiBQQUdFX0ZMSVApKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIGRvIHRoZSBhY3R1YWwgZmxpcAorICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgbUluZm8uYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9WQkw7CisgICAgbUluZm8ueW9mZnNldCA9IG1JbmRleCA/IG1JbmZvLnlyZXMgOiAwOworICAgIGlmIChpb2N0bChlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJm1JbmZvKSA9PSAtMSkgeworICAgICAgICBMT0dFKCJGQklPUFVUX1ZTQ1JFRU5JTkZPIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHRoaXMgaXMgYSBtb25zdHJ1b3VzIGhhY2s6IEJlY2F1c2UgdGhlIGgvdyBhY2NlbGVyYXRvciBpcyBub3QgYWJsZQorICAgICAqIHRvIHJlbmRlciBkaXJlY3RseSBpbnRvIHRoZSBmcmFtZWJ1ZmZlciwgd2UgbmVlZCB0byBjb3B5IGl0cworICAgICAqIGludGVybmFsIGZyYW1lYnVmZmVyIG91dCB0byB0aGUgZmIuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIGZiCisgICAgICogaXMgZ2l2ZW4gaW4gb2VtWzBdLiAKKyAgICAgKiBBbGwgdGhpcyBpcyBuZWVkZWQgb25seSBpbiBzdGFuZGFsb25lIG1vZGUsIGluIFN1cmZhY2VGbGluZ2VyIG1vZGUKKyAgICAgKiB3ZSBjb250cm9sIHdoZXJlIHRoZSBHUFUgcmVuZGVycy4KKyAgICAgKi8KKyAgICBpZiAoZWdsX25hdGl2ZV93aW5kb3dfdDo6bWVtb3J5X3R5cGUgPT0gTkFUSVZFX01FTU9SWV9UWVBFX0dQVSAmJiBvZW1bMF0pIHsKKyAgICAgICAgLy8gY291bGQgdXNlIE1EUCBoZXJlLCBidXQgdGhhdCdzIHRyaWNreSBiZWNhdXNlIHdlIG5lZWQKKyAgICAgICAgLy8gL2Rldi9wbWVtX2dwdSogZmlsZWRlc2NyaXB0b3IKKyAgICAgICAgY29uc3QgR0dMU3VyZmFjZSYgYnVmZmVyID0gbUZiW21JbmRleF07CisgICAgICAgIG1lbWNweSggYnVmZmVyLmRhdGEsCisgICAgICAgICAgICAgICAgKHZvaWQqKShvZW1bMF0gKyBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQpLAorICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJpZGUqYnVmZmVyLmhlaWdodCoyKTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBkcmF3IHRvIG5leHQKKyAgICBjb25zdCBHR0xTdXJmYWNlJiBidWZmZXIgPSBtRmJbMSAtIG1JbmRleF07CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6b2Zmc2V0ID0KKyAgICAgICAgaW50cHRyX3QoYnVmZmVyLmRhdGEpIC0gZWdsX25hdGl2ZV93aW5kb3dfdDo6YmFzZTsKKworICAgIG1QYWdlRmxpcENvdW50Kys7CisKKyAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHNjcmVlbi1zaXplIGNoYW5nZXMgZm9yIG5vdworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpnZXRQYWdlRmxpcENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBhZ2VGbGlwQ291bnQ7Cit9CisKK3VpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpuZXh0QnVmZmVyKCkKK3sKKyAgICAvLyB1cGRhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBkcmF3IHRvIG5leHQKKyAgICBjb25zdCBHR0xTdXJmYWNlJiBidWZmZXIgPSBtRmJbbUluZGV4XTsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQgPQorICAgICAgICBpbnRwdHJfdChidWZmZXIuZGF0YSkgLSBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlOworICAgIHJldHVybiAwOworfQorCitpbnQgRUdMRGlzcGxheVN1cmZhY2U6Om1hcEZyYW1lQnVmZmVyKCkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZGV2aWNlX3RlbXBsYXRlW10gPSB7CisgICAgICAgICAgICAiL2Rldi9ncmFwaGljcy9mYiV1IiwKKyAgICAgICAgICAgICIvZGV2L2ZiJXUiLAorICAgICAgICAgICAgMCB9OworICAgIGludCBmZCA9IC0xOworICAgIGludCBpPTA7CisgICAgY2hhciBuYW1lWzY0XTsKKyAgICB3aGlsZSAoKGZkPT0tMSkgJiYgZGV2aWNlX3RlbXBsYXRlW2ldKSB7CisgICAgICAgIHNucHJpbnRmKG5hbWUsIDY0LCBkZXZpY2VfdGVtcGxhdGVbaV0sIDApOworICAgICAgICBmZCA9IG9wZW4obmFtZSwgT19SRFdSLCAwKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpbmZvOworICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBpbmZvOworICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmluZm8pID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaW5mby5yZXNlcnZlZFswXSA9IDA7CisgICAgaW5mby5yZXNlcnZlZFsxXSA9IDA7CisgICAgaW5mby5yZXNlcnZlZFsyXSA9IDA7CisgICAgaW5mby54b2Zmc2V0ID0gMDsKKyAgICBpbmZvLnlvZmZzZXQgPSAwOworICAgIGluZm8ueXJlc192aXJ0dWFsID0gaW5mby55cmVzICogMjsKKyAgICBpbmZvLmJpdHNfcGVyX3BpeGVsID0gMTY7CisgICAgaW5mby5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKworICAgIHVpbnQzMl90IGZsYWdzID0gUEFHRV9GTElQOworICAgIGlmIChpb2N0bChmZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJmluZm8pID09IC0xKSB7CisgICAgICAgIGluZm8ueXJlc192aXJ0dWFsID0gaW5mby55cmVzOworICAgICAgICBmbGFncyAmPSB+UEFHRV9GTElQOworICAgICAgICBMT0dXKCJGQklPUFVUX1ZTQ1JFRU5JTkZPIGZhaWxlZCwgcGFnZSBmbGlwcGluZyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgaWYgKGluZm8ueXJlc192aXJ0dWFsIDwgaW5mby55cmVzICogMikgeworICAgICAgICBpbmZvLnlyZXNfdmlydHVhbCA9IGluZm8ueXJlczsKKyAgICAgICAgZmxhZ3MgJj0gflBBR0VfRkxJUDsKKyAgICAgICAgTE9HVygicGFnZSBmbGlwcGluZyBub3Qgc3VwcG9ydGVkICh5cmVzX3ZpcnR1YWw9JWQsIHJlcXVlc3RlZD0lZCkiLAorICAgICAgICAgICAgICAgIGluZm8ueXJlc192aXJ0dWFsLCBpbmZvLnlyZXMqMik7CisgICAgfQorCisgICAgaWYgKGlvY3RsKGZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmaW5mbykgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87ICAgIAorCisgICAgaW50IHJlZnJlc2hSYXRlID0gMTAwMDAwMDAwMDAwMDAwMExMVSAvIAorICAgICgKKyAgICAgICAgICAgIHVpbnQ2NF90KCBpbmZvLnVwcGVyX21hcmdpbiArIGluZm8ubG93ZXJfbWFyZ2luICsgaW5mby55cmVzICkgCisgICAgICAgICAgICAqICggaW5mby5sZWZ0X21hcmdpbiAgKyBpbmZvLnJpZ2h0X21hcmdpbiArIGluZm8ueHJlcyApCisgICAgICAgICAgICAqIGluZm8ucGl4Y2xvY2sKKyAgICApOworCisgICAgaWYgKHJlZnJlc2hSYXRlID09IDApIHsKKyAgICAgICAgLy8gYmxlYWdoLCBiYWQgaW5mbyBmcm9tIHRoZSBkcml2ZXIKKyAgICAgICAgcmVmcmVzaFJhdGUgPSA2MCoxMDAwOyAgLy8gNjAgSHoKKyAgICB9CisKKyAgICBpZiAoaW50KGluZm8ud2lkdGgpIDw9IDAgfHwgaW50KGluZm8uaGVpZ2h0KSA8PSAwKSB7CisgICAgICAgIC8vIHN0dXBpZCBkcml2ZXIsIGRvZXNuJ3QgcmV0dXJuIHRoYXQgaW5mb3JtYXRpb24KKyAgICAgICAgLy8gZGVmYXVsdCB0byBTb29uZXIncyBzY3JlZW4gc2l6ZSAoMTYwIGRwaSkKKyAgICAgICAgaW5mby53aWR0aCAgPSA1MTsKKyAgICAgICAgaW5mby5oZWlnaHQgPSAzODsKKyAgICB9CisKKyAgICBmbG9hdCB4ZHBpID0gKGluZm8ueHJlcyAqIDI1LjRmKSAvIGluZm8ud2lkdGg7IAorICAgIGZsb2F0IHlkcGkgPSAoaW5mby55cmVzICogMjUuNGYpIC8gaW5mby5oZWlnaHQ7CisgICAgZmxvYXQgZnBzICA9IHJlZnJlc2hSYXRlIC8gMTAwMC4wZjsgCisKKyAgICBMT0dJKCAgICJ1c2luZyAoZmQ9JWQpXG4iCisgICAgICAgICAgICAiaWQgICAgICAgICAgID0gJXNcbiIKKyAgICAgICAgICAgICJ4cmVzICAgICAgICAgPSAlZCBweFxuIgorICAgICAgICAgICAgInlyZXMgICAgICAgICA9ICVkIHB4XG4iCisgICAgICAgICAgICAieHJlc192aXJ0dWFsID0gJWQgcHhcbiIKKyAgICAgICAgICAgICJ5cmVzX3ZpcnR1YWwgPSAlZCBweFxuIgorICAgICAgICAgICAgImJwcCAgICAgICAgICA9ICVkXG4iCisgICAgICAgICAgICAiciAgICAgICAgICAgID0gJTJ1OiV1XG4iCisgICAgICAgICAgICAiZyAgICAgICAgICAgID0gJTJ1OiV1XG4iCisgICAgICAgICAgICAiYiAgICAgICAgICAgID0gJTJ1OiV1XG4iLAorICAgICAgICAgICAgZmQsCisgICAgICAgICAgICBmaW5mby5pZCwKKyAgICAgICAgICAgIGluZm8ueHJlcywKKyAgICAgICAgICAgIGluZm8ueXJlcywKKyAgICAgICAgICAgIGluZm8ueHJlc192aXJ0dWFsLAorICAgICAgICAgICAgaW5mby55cmVzX3ZpcnR1YWwsCisgICAgICAgICAgICBpbmZvLmJpdHNfcGVyX3BpeGVsLAorICAgICAgICAgICAgaW5mby5yZWQub2Zmc2V0LCBpbmZvLnJlZC5sZW5ndGgsCisgICAgICAgICAgICBpbmZvLmdyZWVuLm9mZnNldCwgaW5mby5ncmVlbi5sZW5ndGgsCisgICAgICAgICAgICBpbmZvLmJsdWUub2Zmc2V0LCBpbmZvLmJsdWUubGVuZ3RoCisgICAgKTsKKworICAgIExPR0koICAgIndpZHRoICAgICAgICA9ICVkIG1tICglZiBkcGkpXG4iCisgICAgICAgICAgICAiaGVpZ2h0ICAgICAgID0gJWQgbW0gKCVmIGRwaSlcbiIKKyAgICAgICAgICAgICJyZWZyZXNoIHJhdGUgPSAlLjJmIEh6XG4iLAorICAgICAgICAgICAgaW5mby53aWR0aCwgIHhkcGksCisgICAgICAgICAgICBpbmZvLmhlaWdodCwgeWRwaSwKKyAgICAgICAgICAgIGZwcworICAgICk7CisKKyAgICAKKyAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBpZiAoZmluZm8uc21lbV9sZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIC8qCisgICAgICogT3BlbiBhbmQgbWFwIHRoZSBkaXNwbGF5LgorICAgICAqLworCisgICAgdm9pZCogYnVmZmVyICA9ICh1aW50MTZfdCopIG1tYXAoCisgICAgICAgICAgICAwLCBmaW5mby5zbWVtX2xlbiwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgZmQsIDApOworCisgICAgaWYgKGJ1ZmZlciA9PSBNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgLy8gYXQgbGVhc3QgZm9yIG5vdywgYWx3YXlzIGNsZWFyIHRoZSBmYgorICAgIG1lbXNldChidWZmZXIsIDAsIGZpbmZvLnNtZW1fbGVuKTsKKworICAgIHVpbnQ4X3QqIG9mZnNjcmVlblsyXTsKKyAgICBvZmZzY3JlZW5bMF0gPSAodWludDhfdCopYnVmZmVyOworICAgIGlmIChmbGFncyAmIFBBR0VfRkxJUCkgeworICAgICAgICBvZmZzY3JlZW5bMV0gPSAodWludDhfdCopYnVmZmVyICsgZmluZm8ubGluZV9sZW5ndGgqaW5mby55cmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZnNjcmVlblsxXSA9ICh1aW50OF90KiltYWxsb2MoZmluZm8uc21lbV9sZW4pOworICAgICAgICBpZiAob2Zmc2NyZWVuWzFdID09IDApIHsKKyAgICAgICAgICAgIG11bm1hcChidWZmZXIsIGZpbmZvLnNtZW1fbGVuKTsKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgfQorCisgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgbUluZm8gPSBpbmZvOworICAgIG1GaW5mbyA9IGZpbmZvOworICAgIG1TaXplID0gZmluZm8uc21lbV9sZW47CisgICAgbUluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgbUZiW2ldLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CisgICAgICAgIG1GYltpXS53aWR0aCAgID0gaW5mby54cmVzOworICAgICAgICBtRmJbaV0uaGVpZ2h0ICA9IGluZm8ueXJlczsKKyAgICAgICAgbUZiW2ldLnN0cmlkZSAgPSBmaW5mby5saW5lX2xlbmd0aCAvIChpbmZvLmJpdHNfcGVyX3BpeGVsID4+IDMpOworICAgICAgICBtRmJbaV0uZGF0YSAgICA9ICh1aW50OF90Kikob2Zmc2NyZWVuW2ldKTsKKyAgICAgICAgbUZiW2ldLmZvcm1hdCAgPSBOQVRJVkVfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgfQorICAgIHJldHVybiBmZDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5oIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhOTRmYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NJTV9FR0xfU1VSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfU0lNX0VHTF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbG5hdGl2ZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzc2l6ZV90ICAgIHZlcnNpb247ICAgIC8vIGFsd2F5cyBzZXQgdG8gc2l6ZW9mKEdHTFN1cmZhY2UpCisgICAgdWludDMyX3QgICB3aWR0aDsgICAgICAvLyB3aWR0aCBpbiBwaXhlbHMKKyAgICB1aW50MzJfdCAgIGhlaWdodDsgICAgIC8vIGhlaWdodCBpbiBwaXhlbHMKKyAgICBpbnQzMl90ICAgIHN0cmlkZTsgICAgIC8vIHN0cmlkZSBpbiBwaXhlbHMKKyAgICB1aW50OF90KiAgIGRhdGE7ICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGJpdHMKKyAgICB1aW50OF90ICAgIGZvcm1hdDsgICAgIC8vIHBpeGVsIGZvcm1hdAorICAgIHVpbnQ4X3QgICAgcmZ1WzNdOyAgICAgLy8gbXVzdCBiZSB6ZXJvCisgICAgdm9pZCogICAgICByZXNlcnZlZDsKK30gR0dMU3VyZmFjZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPGNsYXNzIFRZUEU+CitjbGFzcyBFR0xOYXRpdmVTdXJmYWNlIDogcHVibGljIGVnbF9uYXRpdmVfd2luZG93X3QKK3sKK3B1YmxpYzoKKyAgICBFR0xOYXRpdmVTdXJmYWNlKCkgOiBtQ291bnQoMCkgeyAKKyAgICAgICAgbWVtc2V0KGVnbF9uYXRpdmVfd2luZG93X3Q6OnJlc2VydmVkLCAwLCAKKyAgICAgICAgICAgICAgICBzaXplb2YoZWdsX25hdGl2ZV93aW5kb3dfdDo6cmVzZXJ2ZWQpKTsKKyAgICAgICAgbWVtc2V0KGVnbF9uYXRpdmVfd2luZG93X3Q6OnJlc2VydmVkX3Byb2MsIDAsIAorICAgICAgICAgICAgICAgIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190OjpyZXNlcnZlZF9wcm9jKSk7CisgICAgICAgIG1lbXNldChlZ2xfbmF0aXZlX3dpbmRvd190OjpvZW0sIDAsIAorICAgICAgICAgICAgICAgIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190OjpvZW0pKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgaW5jU3Ryb25nKHZvaWQqKSBjb25zdCB7CisgICAgICAgIC8qIGluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhlIGluYyBtdXN0IGJlIGF0b21pYyAqLworICAgICAgICBtQ291bnQrKzsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZGVjU3Ryb25nKHZvaWQqKSBjb25zdCB7CisgICAgICAgIC8qIGluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhlIGRlYyBtdXN0IGJlIGF0b21pYyAqLworICAgICAgICBpZiAoLS1tQ291bnQgPT0gMSkgeworICAgICAgICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBUWVBFKj4odGhpcyk7CisgICAgICAgICB9CisgICAgfQorcHJvdGVjdGVkOgorICAgIEVHTE5hdGl2ZVN1cmZhY2UmIG9wZXJhdG9yID0gKGNvbnN0IEVHTE5hdGl2ZVN1cmZhY2UmIHJocyk7CisgICAgRUdMTmF0aXZlU3VyZmFjZShjb25zdCBFR0xOYXRpdmVTdXJmYWNlJiByaHMpOworICAgIGlubGluZSB+RUdMTmF0aXZlU3VyZmFjZSgpIHsgfTsKKyAgICBtdXRhYmxlIHZvbGF0aWxlIGludDMyX3QgbUNvdW50OworfTsKKworCitjbGFzcyBFR0xEaXNwbGF5U3VyZmFjZSA6IHB1YmxpYyBFR0xOYXRpdmVTdXJmYWNlPEVHTERpc3BsYXlTdXJmYWNlPgoreworcHVibGljOgorICAgIEVHTERpc3BsYXlTdXJmYWNlKCk7CisgICAgfkVHTERpc3BsYXlTdXJmYWNlKCk7CisKKyAgICBpbnQzMl90IGdldFBhZ2VGbGlwQ291bnQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgIGhvb2tfaW5jUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgIGhvb2tfZGVjUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KTsKKyAgICBzdGF0aWMgdWludDMyX3QgICAgIGhvb2tfc3dhcEJ1ZmZlcnMoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpOworICAgIHN0YXRpYyB2b2lkICAgICAgICAgaG9va19zZXRTd2FwUmVjdGFuZ2xlKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCk7CisgICAgc3RhdGljIHVpbnQzMl90ICAgICBob29rX25leHRCdWZmZXIoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpOworCisgICAgdWludDMyX3QgICAgc3dhcEJ1ZmZlcnMoKTsKKyAgICB1aW50MzJfdCAgICBuZXh0QnVmZmVyKCk7CisgICAgdm9pZCAgICAgICAgc2V0U3dhcFJlY3RhbmdsZShpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCk7CisKKyAgICBpbnQgICAgbWFwRnJhbWVCdWZmZXIoKTsKKworICAgIGVudW0geworICAgICAgICBQQUdFX0ZMSVAgPSAweDAwMDAwMDAxCisgICAgfTsKKyAgICBHR0xTdXJmYWNlICAgICAgICAgIG1GYlsyXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1GbGFnczsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOworICAgIGZiX3Zhcl9zY3JlZW5pbmZvICAgbUluZm87CisgICAgZmJfZml4X3NjcmVlbmluZm8gICBtRmluZm87CisgICAgaW50MzJfdCAgICAgICAgICAgICBtUGFnZUZsaXBDb3VudDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1Td2FwQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRmVhdHVyZUZsYWdzOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyBBTkRST0lEX1NJTV9FR0xfU1VSRkFDRV9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zZnNpbS9zZnNpbS5jIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL3Nmc2ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiYTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9zZnNpbS5jCkBAIC0wLDAgKzEsMTEyIEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIDwwLTY+XG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKKworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisgICAgIHN3aXRjaCh0ZXN0KSAKKyAgICAgeworICAgICBjYXNlIDE6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIHQ4KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDI6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMzoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNDoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDU6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwgdDU1NTEpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbSwgZGltKTsKKworICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjOTAyMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwl0ZXh0dXJlcy5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliR0xFU19DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtdGV4dHVyZXMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuYyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTNiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgMCwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgZGltLzIsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYWM0YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdHJpdGV4LmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJHTEVTX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10cml0ZXgKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJlN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYwpAQCAtMCwwICsxLDI3MSBAQAorLy8gQ2FsbHMgZ2xEcmF3RWxlbWVudHMoKSB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCBieQorLy8gSVRFUkFUSU9OUy4gU2hvdWxkIGRyYXcgYSBjaGVja2VyYm9hcmQgb24gdGhlIHNjcmVlbiBhZnRlcgorLy8gYSBmZXcgc2Vjb25kcy4KKy8vCisvLyBQb3J0ZWQgZnJvbSBhIEphdmEgdmVyc2lvbiBieSBHb29nbGUuCisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPg0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisNCitFR0xEaXNwbGF5IGVnbERpc3BsYXk7DQorRUdMU3VyZmFjZSBlZ2xTdXJmYWNlOw0KK0VHTENvbnRleHQgZWdsQ29udGV4dDsNCitHTHVpbnQgdGV4dHVyZTsNCisNCisjZGVmaW5lIEZJWEVEX09ORSAweDEwMDAwCisjZGVmaW5lIElURVJBVElPTlMgNTANCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgaW5pdF9zY2VuZSh2b2lkKTsNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpOw0KK3ZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCk7CitpbnQgcmVhZFRpbWVyKHZvaWQpOw0KKworc3RhdGljIHZvaWQgZ2x1TG9va0F0KGZsb2F0IGV5ZVgsIGZsb2F0IGV5ZVksIGZsb2F0IGV5ZVosCisgICAgICAgIGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIGZsb2F0IGNlbnRlclosIGZsb2F0IHVwWCwgZmxvYXQgdXBZLAorICAgICAgICBmbG9hdCB1cFopCit7CisgICAgLy8gU2VlIHRoZSBPcGVuR0wgR0xVVCBkb2N1bWVudGF0aW9uIGZvciBnbHVMb29rQXQgZm9yIGEgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgYWxnb3JpdGhtLiBXZSBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgd2F5OgorCisgICAgZmxvYXQgZnggPSBjZW50ZXJYIC0gZXllWDsKKyAgICBmbG9hdCBmeSA9IGNlbnRlclkgLSBleWVZOworICAgIGZsb2F0IGZ6ID0gY2VudGVyWiAtIGV5ZVo7CisKKyAgICAvLyBOb3JtYWxpemUgZgorICAgIGZsb2F0IHJsZiA9IDEuMGYgLyBzcXJ0ZihmeCpmeCArIGZ5KmZ5ICsgZnoqZnopOworICAgIGZ4ICo9IHJsZjsKKyAgICBmeSAqPSBybGY7CisgICAgZnogKj0gcmxmOworCisgICAgLy8gTm9ybWFsaXplIHVwCisgICAgZmxvYXQgcmx1cCA9IDEuMGYgLyBzcXJ0Zih1cFgqdXBYICsgdXBZKnVwWSArIHVwWip1cFopOworICAgIHVwWCAqPSBybHVwOworICAgIHVwWSAqPSBybHVwOworICAgIHVwWiAqPSBybHVwOworCisgICAgLy8gY29tcHV0ZSBzID0gZiB4IHVwICh4IG1lYW5zICJjcm9zcyBwcm9kdWN0IikKKworICAgIGZsb2F0IHN4ID0gZnkgKiB1cFogLSBmeiAqIHVwWTsKKyAgICBmbG9hdCBzeSA9IGZ6ICogdXBYIC0gZnggKiB1cFo7CisgICAgZmxvYXQgc3ogPSBmeCAqIHVwWSAtIGZ5ICogdXBYOworCisgICAgLy8gY29tcHV0ZSB1ID0gcyB4IGYKKyAgICBmbG9hdCB1eCA9IHN5ICogZnogLSBzeiAqIGZ5OworICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7CisgICAgZmxvYXQgdXogPSBzeCAqIGZ5IC0gc3kgKiBmeDsKKworICAgIGZsb2F0IG1bMTZdIDsKKyAgICBtWzBdID0gc3g7CisgICAgbVsxXSA9IHV4OworICAgIG1bMl0gPSAtZng7CisgICAgbVszXSA9IDAuMGY7CisKKyAgICBtWzRdID0gc3k7CisgICAgbVs1XSA9IHV5OworICAgIG1bNl0gPSAtZnk7CisgICAgbVs3XSA9IDAuMGY7CisKKyAgICBtWzhdID0gc3o7CisgICAgbVs5XSA9IHV6OworICAgIG1bMTBdID0gLWZ6OworICAgIG1bMTFdID0gMC4wZjsKKworICAgIG1bMTJdID0gMC4wZjsKKyAgICBtWzEzXSA9IDAuMGY7CisgICAgbVsxNF0gPSAwLjBmOworICAgIG1bMTVdID0gMS4wZjsKKworICAgIGdsTXVsdE1hdHJpeGYobSk7CisgICAgZ2xUcmFuc2xhdGVmKC1leWVYLCAtZXllWSwgLWV5ZVopOworfQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KK3sNCisgICAgaW50IHE7CisgICAgaW50IHN0YXJ0LCBlbmQ7DQorCisgICAgcHJpbnRmKCJJbml0aWFsaXppbmcgRUdMLi4uXG4iKTsKKw0KKyAgICBpZighaW5pdF9nbF9zdXJmYWNlKCkpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiR0wgaW5pdGlhbGlzYXRpb24gZmFpbGVkIC0gZXhpdGluZ1xuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpbml0X3NjZW5lKCk7DQorDQorICAgIGNyZWF0ZV90ZXh0dXJlKCk7DQorDQorICAgIHByaW50ZigiU3RhcnQgdGVzdC4uLlxuIik7CisKKyAgICByZW5kZXIoYXJnYz09MiA/IGF0b2koYXJndlsxXSkgOiBJVEVSQVRJT05TKTsNCisNCisgICAgZnJlZV9nbF9zdXJmYWNlKCk7DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpDQorew0KKyAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDE7DQorICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsNCisgICAgRUdMaW50IGF0dHJpYltdID0NCisgICAgew0KKyAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsDQorICAgICAgICAgICAgRUdMX05PTkUNCisgICAgfTsNCisNCisgICAgaWYgKCAoZWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSkpID09IEVHTF9OT19ESVNQTEFZICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgTlVMTCwgTlVMTCkgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGF0dHJpYiwgJm15Q29uZmlnLCAxLCAmbnVtQ29uZmlncykgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbENob29zZUNvbmZpZyBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgbXlDb25maWcsCisgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIDApKSA9PSBFR0xfTk9fU1VSRkFDRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgbXlDb25maWcsIDAsIDApKSA9PSBFR0xfTk9fQ09OVEVYVCApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBlZ2xTdXJmYWNlLCBlZ2xDb250ZXh0KSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIHJldHVybiAxOw0KK30NCisNCit2b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKQ0KK3sNCisgICAgaWYgKGVnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpDQorICAgIHsNCisgICAgICAgIGVnbE1ha2VDdXJyZW50KCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NVUkZBQ0UsDQorICAgICAgICAgICAgICAgIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCApOw0KKyAgICAgICAgZWdsRGVzdHJveUNvbnRleHQoIGVnbERpc3BsYXksIGVnbENvbnRleHQgKTsNCisgICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKCBlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlICk7DQorICAgICAgICBlZ2xUZXJtaW5hdGUoIGVnbERpc3BsYXkgKTsNCisgICAgICAgIGVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsNCisgICAgfQ0KK30NCisNCit2b2lkIGluaXRfc2NlbmUodm9pZCkNCit7DQorICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBmbG9hdCByYXRpbyA9IDMyMC4wZiAvIDQ4MC4wZjsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIDMyMCwgNDgwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOw0KKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdUxvb2tBdCgKKyAgICAgICAgICAgIDAsIDAsIDMsICAvLyBleWUKKyAgICAgICAgICAgIDAsIDAsIDAsICAvLyBjZW50ZXIKKyAgICAgICAgICAgIDAsIDEsIDApOyAvLyB1cAorDQorICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOw0KKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7DQorICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Cit9DQorDQordm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKQ0KK3sNCisgICAgY29uc3QgdW5zaWduZWQgaW50IG9uID0gMHhmZjAwMDBmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgb2ZmID0gMHhmZmZmZmZmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgcGl4ZWxzW10gPQorICAgIHsKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgIH07DQorICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOw0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOw0KKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgOCwgOCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsNCisgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQorICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOw0KKyAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOw0KK30NCisNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpDQorew0KKyAgICBpbnQgaSwgajsNCisNCisgICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0gew0KKyAgICAgICAgICAgIC0xLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgIDEsICAwLA0KKyAgICAgICAgICAgIC0xLCAgIDEsICAwDQorICAgIH07DQorDQorICAgIGNvbnN0IEdMZml4ZWQgdGV4Q29vcmRzW10gPSB7DQorICAgICAgICAgICAgMCwgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgIEZJWEVEX09ORSwgICAgMCwNCisgICAgICAgICAgICBGSVhFRF9PTkUsICAgIEZJWEVEX09ORSwNCisgICAgICAgICAgICAwLCAgICAgICAgICAgIEZJWEVEX09ORQ0KKyAgICB9Ow0KKw0KKyAgICBjb25zdCBHTHVzaG9ydCB0ZW1wbGF0ZVtdID0geyAwLCAxLCAyLCAgMCwgMiwgMyB9OworCisKKyAgICBHTHVzaG9ydCogaW5kaWNlcyA9IChHTHVzaG9ydCopbWFsbG9jKHF1YWRzKnNpemVvZih0ZW1wbGF0ZSkpOworICAgIGZvciAoaT0wIDsgaTxxdWFkcyA7IGkrKykKKyAgICAgICAgbWVtY3B5KGluZGljZXMrKHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKGluZGljZXNbMF0pKSppLCB0ZW1wbGF0ZSwgc2l6ZW9mKHRlbXBsYXRlKSk7CisNCisgICAgZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7DQorICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCB0ZXhDb29yZHMpOworCisgICAgLy8gbWFrZSBzdXJlIHRvIGRvIGEgY291cGxlIGVnbFN3YXBCdWZmZXJzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUKKyAgICAvLyBubyBwcm9ibGVtcyB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZXMgKHdobyBrbm93cykKKyAgICBnbENsZWFyQ29sb3IoMC40LCAwLjQsIDAuNCwgMC40KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTsKKworICAgIGZvciAoaj0wIDsgajwxMCA7IGorKykgeworICAgICAgICBwcmludGYoImxvb3AgJWQgLyAxMCAoJWQgcXVhZHMgLyBsb29wKVxuIiwgaiwgcXVhZHMpOworCisgICAgICAgIGludCBuZWxlbSA9IHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKHRlbXBsYXRlWzBdKTsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbmVsZW0qcXVhZHMsIEdMX1VOU0lHTkVEX1NIT1JULCBpbmRpY2VzKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7CisgICAgfQorCisgICAgZnJlZShpbmRpY2VzKTsNCit9DQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzQ5ODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpAQCAtMCwwICsxLDk5IEBACisjIS9iaW4vc2gKK3JtIC1yZiBvdXQgZ2VuZXJhdGVkCisKK21rZGlyIG91dAorbWtkaXIgLXAgb3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzCitta2RpciAtcCBvdXQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pCitta2RpciAtcCBvdXQvYW5kcm9pZC9ncmFwaGljcworCitlY2hvICJwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7IiA+IG91dC9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCitlY2hvICJwdWJsaWMgaW50ZXJmYWNlIENhbnZhcyB7fSIgPj4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKworR0xGSUxFPW91dC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCitjcCBzdHVicy9HTEhlYWRlci5qYXZhLWlmICRHTEZJTEUKKworR0xHRU5fRklMRVM9IkNGdW5jLmphdmEgQ1R5cGUuamF2YSBDb2RlRW1pdHRlci5qYXZhIEdlbmVyYXRlR0wuamF2YSBKRnVuYy5qYXZhIEpUeXBlLmphdmEgSm5pQ29kZUVtaXR0ZXIuamF2YSBQYXJhbWV0ZXJDaGVja2VyLmphdmEiCisKK3B1c2hkIHNyYyA+IC9kZXYvbnVsbAoramF2YWMgJHtHTEdFTl9GSUxFU30KK3BvcGQgPiAvZGV2L251bGwKK2phdmEgLWNsYXNzcGF0aCBzcmMgR2VuZXJhdGVHTCAtYyBnbHNwZWMtMS4wIGdsc3BlYy0xLjBleHQgZ2xzcGVjLTEuMSBnbHNwZWMtMS4xZXh0IGdsc3BlYy0xLjFleHRwYWNrIGdsc3BlYy1jaGVja3MKKworcHVzaGQgb3V0ID4gL2Rldi9udWxsCitta2RpciBjbGFzc2VzCitqYXZhYyAtZCBjbGFzc2VzIGNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorcG9wZCA+IC9kZXYvbnVsbAorCitybSAtcmYgZ2VuZXJhdGVkCitta2RpciAtcCBnZW5lcmF0ZWQvQworY3Agb3V0L2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIGdlbmVyYXRlZC9DCitjcCAtciBvdXQvY29tIGdlbmVyYXRlZAorY3AgLXIgb3V0L2phdmF4IGdlbmVyYXRlZAorCitybSAtcmYgb3V0CisKKyMgY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2lmIGNtcCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgZ2VuZXJhdGVkL0MvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgOyB0aGVuCitlY2hvIGNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9DL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIC4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaQorZmkKKworIyBHTEltcGwuamF2YQoraWYgY21wIC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGdlbmVyYXRlZC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgOyB0aGVuCitlY2hvIEdMSW1wbC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaQorZmkKKworIyBHTC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIDsgdGhlbgorZWNobyBHTC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorZmkKKworIyBHTDEwLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIDsgdGhlbgorZWNobyBHTDEwLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitmaQorCisjIEdMMTBFeHQuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgOyB0aGVuCitlY2hvIEdMMTBFeHQuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2ZpCisKKyMgR0wxMS5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSA7IHRoZW4KK2VjaG8gR0wxMS5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZmkKKworIyBHTDExRXh0LmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIDsgdGhlbgorZWNobyBHTDExRXh0LmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitmaQorCisjIEdMMTFFeHRlbnNpb25QYWNrLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgOyB0aGVuCitlY2hvIEdMMTFFeHRlbnNpb25QYWNrLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCitmaQorCitybSAtcmYgZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMApAQCAtMCwwICsxLDEwNiBAQAordm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQordm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQ0KK3ZvaWQgZ2xBbHBoYUZ1bmN4ICggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiApDQordm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQ0KK3ZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQ0KK3ZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApDQordm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQordm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQ0KK3ZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkNCit2b2lkIGdsQ2xlYXJEZXB0aHggKCBHTGNsYW1weCBkZXB0aCApDQordm9pZCBnbENsZWFyU3RlbmNpbCAoIEdMaW50IHMgKQ0KK3ZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KK3ZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApDQordm9pZCBnbENvbG9yNHggKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkNCit2b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkNCit2b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApDQordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsQ3VsbEZhY2UgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkNCit2b2lkIGdsRGVwdGhGdW5jICggR0xlbnVtIGZ1bmMgKQ0KK3ZvaWQgZ2xEZXB0aE1hc2sgKCBHTGJvb2xlYW4gZmxhZyApDQordm9pZCBnbERlcHRoUmFuZ2VmICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQ0KK3ZvaWQgZ2xEZXB0aFJhbmdleCAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkNCit2b2lkIGdsRGlzYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkNCit2b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xGaW5pc2ggKCB2b2lkICkNCit2b2lkIGdsRmx1c2ggKCB2b2lkICkNCit2b2lkIGdsRm9nZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbEZvZ2Z2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xGb2d4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEZyb250RmFjZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkNCit2b2lkIGdsRnJ1c3R1bXggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCit2b2lkIGdsR2VuVGV4dHVyZXMgKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKQ0KK0dMZW51bSBnbEdldEVycm9yICggdm9pZCApDQordm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCitjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQordm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApDQordm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTGlnaHRNb2RlbGZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaWdodE1vZGVseCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTGlnaHRmICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsTGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkNCit2b2lkIGdsTGluZVdpZHRoeCAoIEdMZml4ZWQgd2lkdGggKQ0KK3ZvaWQgZ2xMb2FkSWRlbnRpdHkgKCB2b2lkICkNCit2b2lkIGdsTG9hZE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTG9naWNPcCAoIEdMZW51bSBvcGNvZGUgKQ0KK3ZvaWQgZ2xNYXRlcmlhbGYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbE1hdGVyaWFseCAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTWF0cml4TW9kZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsTXVsdE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDR4ICggR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxICkNCit2b2lkIGdsTm9ybWFsM2YgKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICkNCit2b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkNCit2b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQordm9pZCBnbE9ydGhveCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQ0KK3ZvaWQgZ2xQaXhlbFN0b3JlaSAoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQ0KK3ZvaWQgZ2xQb2ludFNpemV4ICggR0xmaXhlZCBzaXplICkNCit2b2lkIGdsUG9seWdvbk9mZnNldCAoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICkNCit2b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApDQordm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQ0KK3ZvaWQgZ2xQdXNoTWF0cml4ICggdm9pZCApDQordm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkNCit2b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xSb3RhdGV4ICggR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQordm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQordm9pZCBnbFNjYWxlZiAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xTY2FsZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCit2b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsU2hhZGVNb2RlbCAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApDQordm9pZCBnbFN0ZW5jaWxNYXNrICggR0x1aW50IG1hc2sgKQ0KK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleEVudmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsVGV4RW52eCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQordm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCit2b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTk3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dApAQCAtMCwwICsxIEBACitHTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTICggR0xmaXhlZCAqbWFudGlzc2EsIEdMaW50ICpleHBvbmVudCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ5YTdmOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xCkBAIC0wLDAgKzEsNDIgQEAKK3ZvaWQgZ2xCaW5kQnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciApDQordm9pZCBnbEJ1ZmZlckRhdGEgKCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlICkNCit2b2lkIGdsQnVmZmVyU3ViRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApDQordm9pZCBnbENsaXBQbGFuZXggKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uICkNCit2b2lkIGdsQ29sb3I0dWIgKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhICkNCit2b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xEZWxldGVCdWZmZXJzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMgKQ0KK3ZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbEdlbkJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyApDQordm9pZCBnbEdldEJvb2xlYW52ICggR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyApDQordm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0Q2xpcFBsYW5lZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkNCit2b2lkIGdsR2V0Q2xpcFBsYW5leCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqZXFuICkNCit2b2lkIGdsR2V0Rml4ZWR2ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRGbG9hdHYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldExpZ2h0ZnYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleEVudml2ICggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4RW52eHYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK0dMYm9vbGVhbiBnbElzQnVmZmVyICggR0x1aW50IGJ1ZmZlciApDQorR0xib29sZWFuIGdsSXNFbmFibGVkICggR0xlbnVtIGNhcCApDQorR0xib29sZWFuIGdsSXNUZXh0dXJlICggR0x1aW50IHRleHR1cmUgKQ0KK3ZvaWQgZ2xOb3JtYWxQb2ludGVyICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcmYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcmZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcnggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFRleEVudmkgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCit2b2lkIGdsVGV4RW52aXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyaSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0IGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwOGM3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dApAQCAtMCwwICsxLDE2IEBACit2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgKCBHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4ICkNCit2b2lkIGdsRHJhd1RleGZPRVMgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhmdk9FUyAoIGNvbnN0IEdMZmxvYXQgKmNvb3JkcyApDQordm9pZCBnbERyYXdUZXhpT0VTICggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhpdk9FUyAoIGNvbnN0IEdMaW50ICpjb29yZHMgKQ0KK3ZvaWQgZ2xEcmF3VGV4c09FUyAoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0ICkNCit2b2lkIGdsRHJhd1RleHN2T0VTICggY29uc3QgR0xzaG9ydCAqY29vcmRzICkNCit2b2lkIGdsRHJhd1RleHhPRVMgKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCApDQordm9pZCBnbERyYXdUZXh4dk9FUyAoIGNvbnN0IEdMZml4ZWQgKmNvb3JkcyApDQordm9pZCBnbEVuYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApDQordm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyAoIHZvaWQgKQ0KK3ZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZTZkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0cGFjawpAQCAtMCwwICsxLDM4IEBACit2b2lkIGdsQmluZEZyYW1lYnVmZmVyT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBmcmFtZWJ1ZmZlciApCit2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKK3ZvaWQgZ2xCaW5kVGV4dHVyZSAoIEdMaW50IHRhcmdldCwgR0xpbnQgdGV4dHVyZSApCit2b2lkIGdsQmxlbmRFcXVhdGlvbiAoIEdMaW50IG1vZGUgKQordm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAoIEdMaW50IG1vZGVSR0IsIEdMaW50IG1vZGVBbHBoYSApCit2b2lkIGdsQmxlbmRGdW5jU2VwYXJhdGUgKCBHTGludCBzcmNSR0IsIEdMaW50IGRzdFJHQiwgR0xpbnQgc3JjQWxwaGEsIEdMaW50IGRzdEFscGhhICkKK0dMaW50IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoIEdMaW50IHRhcmdldCApCit2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkKK3ZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCAoIEdMaW50IHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LCBHTGludCBib3JkZXIgKQordm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQordm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqcmVuZGVyYnVmZmVycyApCit2b2lkIGdsRW5hYmxlICggR0xpbnQgY2FwICkKK3ZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcmVuZGVyYnVmZmVydGFyZ2V0LCBHTGludCByZW5kZXJidWZmZXIgKQordm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCB0ZXh0YXJnZXQsIEdMaW50IHRleHR1cmUsIEdMaW50IGxldmVsICkKK3ZvaWQgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoIEdMaW50IHRhcmdldCApCit2b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKmZyYW1lYnVmZmVycyApCit2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpyZW5kZXJidWZmZXJzICkKK3ZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldEludGVnZXJ2ICggR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsR2V0VGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsR2V0VGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbnh2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK0dMYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMgKCBHTGludCBmcmFtZWJ1ZmZlciApCitHTGJvb2xlYW4gZ2xJc1JlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHJlbmRlcmJ1ZmZlciApCit2b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQordm9pZCBnbFN0ZW5jaWxPcCAoIEdMaW50IGZhaWwsIEdMaW50IHpmYWlsLCBHTGludCB6cGFzcyApCit2b2lkIGdsVGV4RW52ZiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQordm9pZCBnbFRleEVudmZ2ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhFbnZ4ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEVudnh2ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VuZiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCit2b2lkIGdsVGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VuaSAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEdlbml2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhHZW54ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCit2b2lkIGdsVGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbFRleFBhcmFtZXRlcmYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtY2hlY2tzIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy1jaGVja3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ZWQ2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcwpAQCAtMCwwICsxLDU5IEBACitnbENsaXBQbGFuZWYgY2hlY2sgZXF1YXRpb24gNA0KK2dsQ2xpcFBsYW5leCBjaGVjayBlcXVhdGlvbiA0DQorZ2xEZWxldGVCdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbiANCitnbERlbGV0ZVRleHR1cmVzIGNoZWNrIHRleHR1cmVzIG4NCitnbERyYXdFbGVtZW50cyBjaGVja19BSU9PQkUgaW5kaWNlcyBjb3VudA0KK2dsRm9nIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfRk9HX01PREUsR0xfRk9HX0RFTlNJVFksR0xfRk9HX1NUQVJULEdMX0ZPR19FTkQgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9GT0dfQ09MT1INCitnbEdlbkJ1ZmZlcnMgY2hlY2sgYnVmZmVycyBuDQorZ2xHZW5UZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuDQorZ2xHZXRDbGlwUGxhbmUgY2hlY2sgZXFuIDQNCitnbEdldEludGVnZXJ2IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfQUxQSEFfQklUUyxHTF9BTFBIQV9URVNUX0ZVTkMsR0xfQUxQSEFfVEVTVF9SRUYsR0xfQkxFTkRfRFNULEdMX0JMVUVfQklUUyxHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyxHTF9DT0xPUl9BUlJBWV9TSVpFLEdMX0NPTE9SX0FSUkFZX1NUUklERSxHTF9DT0xPUl9BUlJBWV9UWVBFLEdMX0NVTExfRkFDRSxHTF9ERVBUSF9CSVRTLEdMX0RFUFRIX0NMRUFSX1ZBTFVFLEdMX0RFUFRIX0ZVTkMsR0xfREVQVEhfV1JJVEVNQVNLLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19FTkQsR0xfRk9HX01PREUsR0xfRk9HX1NUQVJULEdMX0ZST05UX0ZBQ0UsR0xfR1JFRU5fQklUUyxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyxHTF9MSUdIVF9NT0RFTF9UV09fU0lERSxHTF9MSU5FX1NNT09USF9ISU5ULEdMX0xJTkVfV0lEVEgsR0xfTE9HSUNfT1BfTU9ERSxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMsR0xfTUFUUklYX01PREUsR0xfTUFYX0NMSVBfUExBTkVTLEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTLEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyxHTF9NQVhfTElHSFRTLEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgsR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTLEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1NJWkUsR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfTUFYX1RFWFRVUkVfVU5JVFMsR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMsR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9OT1JNQUxfQVJSQVlfU1RSSURFLEdMX05PUk1BTF9BUlJBWV9UWVBFLEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyxHTF9QQUNLX0FMSUdOTUVOVCxHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsR0xfUE9JTlRfU0laRSxHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyxHTF9QT0lOVF9TTU9PVEhfSElOVCxHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IsR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMsR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9SRURfQklUUyxHTF9TSEFERV9NT0RFTCxHTF9TVEVOQ0lMX0JJVFMsR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSxHTF9TVEVOQ0lMX0ZBSUwsR0xfU1RFTkNJTF9GVU5DLEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMLEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTLEdMX1NURU5DSUxfUkVGLEdMX1NURU5DSUxfVkFMVUVfTUFTSyxHTF9TVEVOQ0lMX1dSSVRFTUFTSyxHTF9TVUJQSVhFTF9CSVRTLEdMX1RFWFRVUkVfQklORElOR18yRCxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUsR0xfVEVYVFVSRV9TVEFDS19ERVBUSCxHTF9VTlBBQ0tfQUxJR05NRU5ULEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9WRVJURVhfQVJSQVlfU0laRSxHTF9WRVJURVhfQVJSQVlfU1RSSURFLEdMX1ZFUlRFWF9BUlJBWV9UWVBFLEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTLEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTLEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyBpZmNoZWNrIHBhcmFtcyAyIHBuYW1lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSxHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UsR0xfREVQVEhfUkFOR0UsR0xfTUFYX1ZJRVdQT1JUX0RJTVMsR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UsR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSxHTF9DT0xPUl9XUklURU1BU0ssR0xfU0NJU1NPUl9CT1gsR0xfVklFV1BPUlQgaWZjaGVjayBwYXJhbXMgMTYgcG5hbWUgR0xfTU9ERUxWSUVXX01BVFJJWCxHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyxHTF9QUk9KRUNUSU9OX01BVFJJWCxHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfVEVYVFVSRV9NQVRSSVgsR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTIGlmY2hlY2sgcGFyYW1zIF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgcG5hbWUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfRk9HX0NPTE9SLEdMX0xJR0hUX01PREVMX0FNQklFTlQNCitnbEdldExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04NCitnbEdldE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UNCitnbEdldFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SDQorZ2xHZXRUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbExpZ2h0TW9kZWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0xJR0hUX01PREVMX0FNQklFTlQNCitnbExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04NCitnbExvYWRNYXRyaXggY2hlY2sgbSAxNg0KK2dsTWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQ0KK2dsTXVsdE1hdHJpeCBjaGVjayBtIDE2DQorZ2xQb2ludFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsVGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1INCitnbFRleEltYWdlMkQgbnVsbEFsbG93ZWQNCitnbFRleFN1YkltYWdlMkQgbnVsbEFsbG93ZWQNCitnbEJ1ZmZlckRhdGEgbnVsbEFsbG93ZWQNCitnbFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsUXVlcnlNYXRyaXh4T0VTIGNoZWNrIG1hbnRpc3NhIDE2IGNoZWNrIGV4cG9uZW50IDE2IHJldHVybiAtMQ0KK2dsRHJhd1RleGZ2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xEcmF3VGV4aXZPRVMgY2hlY2sgY29vcmRzIDUNCitnbERyYXdUZXhzdk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsRHJhd1RleHh2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xCaW5kRnJhbWVidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEJpbmRSZW5kZXJidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEJsZW5kRXF1YXRpb24gdW5zdXBwb3J0ZWQNCitnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSB1bnN1cHBvcnRlZA0KK2dsQmxlbmRGdW5jU2VwYXJhdGUgdW5zdXBwb3J0ZWQNCitnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgdW5zdXBwb3J0ZWQgcmV0dXJuIDANCitnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIHVuc3VwcG9ydGVkDQorZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclN0b3JhZ2VPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgdW5zdXBwb3J0ZWQNCitnbEdlbmVyYXRlTWlwbWFwT0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRCdWZmZXJQYXJhbWV0ZXIgdW5zdXBwb3J0ZWQNCitnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0VGV4R2VuIHVuc3VwcG9ydGVkDQorZ2xJc0ZyYW1lYnVmZmVyT0VTIHVuc3VwcG9ydGVkIHJldHVybiBKTklfRkFMU0UNCitnbElzUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkIHJldHVybiBKTklfRkFMU0UNCitnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyB1bnN1cHBvcnRlZA0KK2dsTWF0cml4SW5kZXhQb2ludGVyT0VTIHVuc3VwcG9ydGVkDQorZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTIHVuc3VwcG9ydGVkIHJldHVybiBmYWxzZQ0KK2dsVGV4R2VuIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW5mIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW5pIHVuc3VwcG9ydGVkDQorZ2xUZXhHZW54IHVuc3VwcG9ydGVkDQorZ2xXZWlnaHRQb2ludGVyT0VTIHVuc3VwcG9ydGVkDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTRmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgQ0Z1bmMgew0KKw0KKyAgICBTdHJpbmcgb3JpZ2luYWw7DQorDQorICAgIENUeXBlIGZ0eXBlOw0KKyAgICBTdHJpbmcgZm5hbWU7DQorDQorICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICBMaXN0PENUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8Q1R5cGU+KCk7DQorDQorICAgIGJvb2xlYW4gaGFzUG9pbnRlckFyZyA9IGZhbHNlOw0KKyAgICBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZyA9IGZhbHNlOw0KKw0KKyAgICBwdWJsaWMgQ0Z1bmMoU3RyaW5nIG9yaWdpbmFsKSB7DQorICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbCgpIHsNCisgICAgICAgIHJldHVybiBvcmlnaW5hbDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBmbmFtZSkgew0KKyAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENUeXBlIGZ0eXBlKSB7DQorICAgICAgICB0aGlzLmZ0eXBlID0gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlIGdldFR5cGUoKSB7DQorICAgICAgICByZXR1cm4gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ05hbWUsIENUeXBlIGFyZ1R5cGUpIHsNCisgICAgICAgIGFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIGFyZ1R5cGVzLmFkZChhcmdUeXBlKTsNCisNCisgICAgICAgIGlmIChhcmdUeXBlLmlzUG9pbnRlcigpKSB7DQorICAgICAgICAgICAgaGFzUG9pbnRlckFyZyA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpKSB7DQorICAgICAgICAgICAgaGFzVHlwZWRQb2ludGVyQXJnID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGludCBsZW4gPSBhcmdOYW1lcy5zaXplKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzUG9pbnRlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNQb2ludGVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNUeXBlZFBvaW50ZXJBcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnTmFtZXMuc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoaSA+IDApIHsNCisgICAgICAgICAgICAgICAgcyArPSAiLCAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgQ0Z1bmMgcGFyc2VDRnVuYyhTdHJpbmcgcykgew0KKyAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBuZXcgQ0Z1bmMocyk7DQorICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBzLnNwbGl0KCJcXHMiKTsNCisNCisgICAgICAgIGludCBpID0gMDsNCisgICAgICAgIENUeXBlIGZ0eXBlID0gbmV3IENUeXBlKCk7DQorICAgICAgICBTdHJpbmcgZnR5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICBpZiAoZnR5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgew0KKyAgICAgICAgICAgIGZ0eXBlLnNldElzQ29uc3QodHJ1ZSk7DQorICAgICAgICAgICAgZnR5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICB9DQorICAgICAgICBmdHlwZS5zZXRCYXNlVHlwZShmdHlwZU5hbWUpOw0KKw0KKyAgICAgICAgU3RyaW5nIGZuYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCIqIikpIHsNCisgICAgICAgICAgICBmdHlwZS5zZXRJc1BvaW50ZXIodHJ1ZSk7DQorICAgICAgICAgICAgZm5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgIH0NCisJDQorICAgICAgICBjZnVuYy5zZXROYW1lKGZuYW1lKTsNCisgICAgICAgIGNmdW5jLnNldFR5cGUoZnR5cGUpOw0KKwkNCisgICAgICAgIHdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgew0KKyAgICAgICAgICAgIFN0cmluZyB0b2sgPSB0b2tlbnNbaSsrXTsNCisJICAgIA0KKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIoIikpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIpIikpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENUeXBlIGFyZ1R5cGUgPSBuZXcgQ1R5cGUoKTsNCisJICAgIA0KKyAgICAgICAgICAgIFN0cmluZyBhcmdUeXBlTmFtZSA9IHRvazsNCisgICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9ICIiOw0KKwkgICAgDQorICAgICAgICAgICAgaWYgKGFyZ1R5cGVOYW1lLmVxdWFscygiY29uc3QiKSkgew0KKyAgICAgICAgICAgICAgICBhcmdUeXBlLnNldElzQ29uc3QodHJ1ZSk7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGVOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGFyZ1R5cGUuc2V0QmFzZVR5cGUoYXJnVHlwZU5hbWUpOw0KKw0KKyAgICAgICAgICAgIGlmIChhcmdUeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorCSAgICANCisgICAgICAgICAgICBhcmdOYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICAgICAgaWYgKGFyZ05hbWUuc3RhcnRzV2l0aCgiKiIpKSB7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGUuc2V0SXNQb2ludGVyKHRydWUpOw0KKyAgICAgICAgICAgICAgICBhcmdOYW1lID0gYXJnTmFtZS5zdWJzdHJpbmcoMSwgYXJnTmFtZS5sZW5ndGgoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChhcmdOYW1lLmVuZHNXaXRoKCIsIikpIHsNCisgICAgICAgICAgICAgICAgYXJnTmFtZSA9IGFyZ05hbWUuc3Vic3RyaW5nKDAsIGFyZ05hbWUubGVuZ3RoKCkgLSAxKTsNCisgICAgICAgICAgICB9DQorCSAgICANCisgICAgICAgICAgICBjZnVuYy5hZGRBcmd1bWVudChhcmdOYW1lLCBhcmdUeXBlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBjZnVuYzsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxZWM2MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisNCitwdWJsaWMgY2xhc3MgQ1R5cGUgew0KKw0KKyAgICBTdHJpbmcgYmFzZVR5cGU7DQorICAgIGJvb2xlYW4gaXNDb25zdDsNCisgICAgYm9vbGVhbiBpc1BvaW50ZXI7DQorDQorICAgIHB1YmxpYyBDVHlwZSgpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlKSB7DQorCXNldEJhc2VUeXBlKGJhc2VUeXBlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlLCBib29sZWFuIGlzQ29uc3QsIGJvb2xlYW4gaXNQb2ludGVyKSB7DQorCXNldEJhc2VUeXBlKGJhc2VUeXBlKTsNCisJc2V0SXNDb25zdChpc0NvbnN0KTsNCisJc2V0SXNQb2ludGVyKGlzUG9pbnRlcik7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbigpIHsNCisJcmV0dXJuIGJhc2VUeXBlICsgKGlzUG9pbnRlciA/ICIgKiIgOiAiIik7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHNldElzQ29uc3QoYm9vbGVhbiBpc0NvbnN0KSB7DQorCXRoaXMuaXNDb25zdCA9IGlzQ29uc3Q7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdCgpIHsNCisJcmV0dXJuIGlzQ29uc3Q7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0SXNQb2ludGVyKGJvb2xlYW4gaXNQb2ludGVyKSB7DQorCXRoaXMuaXNQb2ludGVyID0gaXNQb2ludGVyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzUG9pbnRlcigpIHsNCisJcmV0dXJuIGlzUG9pbnRlcjsNCisgICAgfQ0KKw0KKyAgICBib29sZWFuIGlzVm9pZCgpIHsNCisJU3RyaW5nIGJhc2VUeXBlID0gZ2V0QmFzZVR5cGUoKTsNCisJcmV0dXJuIGJhc2VUeXBlLmVxdWFscygiR0x2b2lkIikgfHwNCisJICAgIGJhc2VUeXBlLmVxdWFscygidm9pZCIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRQb2ludGVyKCkgew0KKwlyZXR1cm4gaXNQb2ludGVyKCkgJiYgIWlzVm9pZCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEJhc2VUeXBlKFN0cmluZyBiYXNlVHlwZSkgew0KKwl0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCVN0cmluZyBzID0gIiI7DQorCWlmIChpc0NvbnN0KCkpIHsNCisJICAgIHMgKz0gImNvbnN0ICI7DQorCX0NCisJcyArPSBiYXNlVHlwZTsNCisJaWYgKGlzUG9pbnRlcigpKSB7DQorCSAgICBzICs9ICIqIjsNCisJfQ0KKw0KKwlyZXR1cm4gczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUuaGFzaENvZGUoKSBeIChpc1BvaW50ZXIgPyAyIDogMCkgXiAoaXNDb25zdCA/IDEgOiAwKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsNCisJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgQ1R5cGUpIHsNCisJICAgIENUeXBlIGMgPSAoQ1R5cGUpbzsNCisJICAgIHJldHVybiBiYXNlVHlwZS5lcXVhbHMoYy5iYXNlVHlwZSkgJiYNCisJCWlzUG9pbnRlcigpID09IGMuaXNQb2ludGVyKCkgJiYNCisJCWlzQ29uc3QoKSA9PSBjLmlzQ29uc3QoKTsNCisJfQ0KKwlyZXR1cm4gZmFsc2U7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWI5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEKQEAgLTAsMCArMSw4IEBACisNCitwdWJsaWMgaW50ZXJmYWNlIENvZGVFbWl0dGVyIHsNCisNCisgICAgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrKTsNCisgICAgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKTsNCisgICAgdm9pZCBhZGROYXRpdmVSZWdpc3RyYXRpb24oU3RyaW5nIGZuYW1lKTsNCisgICAgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCk7DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3ZWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisNCitpbXBvcnQgamF2YS5pby4qOw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVHTCB7DQorDQorICAgIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIGZpbGVuYW1lLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOw0KKyAgICAgICAgU3RyaW5nIHM7DQorICAgICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgb3V0LnByaW50bG4ocyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbWl0KGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUVtaXR0ZXIgZW1pdHRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWNSZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBnbFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0pIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHMgPSBudWxsOw0KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOw0KKyAgICAgICAgd2hpbGUgKChzID0gc3BlY1JlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKHMudHJpbSgpLnN0YXJ0c1dpdGgoIi8vIikpIHsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIENGdW5jIGNmdW5jID0gQ0Z1bmMucGFyc2VDRnVuYyhzKTsNCisNCisgICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBjZnVuYy5nZXROYW1lKCk7DQorICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoInN0dWJzLyIgKyBmbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiKTsNCisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgew0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNwZWNpYWwtY2FzaW5nIGZ1bmN0aW9uICIgKyBmbmFtZSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArDQorICAgICAgICAgICAgICAgICAgICAgIi5qYXZhLTEiICsgdmVyc2lvbiArICItaWYiLCBnbFN0cmVhbSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArICIuamF2YS1pbXBsIiwgZ2xJbXBsU3RyZWFtKTsNCisgICAgICAgICAgICAgICAgY29weSgic3R1YnMvIiArIGZuYW1lICsgIi5jcHAiLCBjU3RyZWFtKTsNCisNCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbmF0aXZlIGZ1bmN0aW9uIG5hbWVzDQorICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkIHRvIHJlcXVpcmUgZmV3ZXIgZGlzY3JldGUgZmlsZXMNCisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gInN0dWJzLyIgKyBmbmFtZSArICIubmF0aXZlUmVnIjsNCisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPQ0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7DQorICAgICAgICAgICAgICAgIFN0cmluZyBuZnVuYzsNCisgICAgICAgICAgICAgICAgd2hpbGUgKChuZnVuYyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuYWRkTmF0aXZlUmVnaXN0cmF0aW9uKG5mdW5jKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGVtaXR0ZXIuc2V0VmVyc2lvbih2ZXJzaW9uLCBleHQsIHBhY2spOw0KKyAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRDb2RlKGNmdW5jLCBzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgY2xhc3NQYXRoTmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsIjsNCisgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOw0KKw0KKyAgICAgICAgaW50IGFpZHggPSAwOw0KKyAgICAgICAgd2hpbGUgKGFyZ3NbYWlkeF0uY2hhckF0KDApID09ICctJykgew0KKyAgICAgICAgICAgIHN3aXRjaCAoYXJnc1thaWR4XS5jaGFyQXQoMSkpIHsNCisgICAgICAgICAgICBjYXNlICdjJzoNCisgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmtub3duIGZsYWc6ICIgKyBhcmdzW2FpZHhdKTsNCisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGFpZHgrKzsNCisgICAgICAgIH0NCisNCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXNlQ29udGV4dFBvaW50ZXIgPSAiICsgdXNlQ29udGV4dFBvaW50ZXIpOw0KKw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzEwUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTBFeHRSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMVJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExRXh0UmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFFeHRQYWNrUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBjaGVja3NSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisNCisgICAgICAgIFN0cmluZyBnbDEwRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDEwRXh0RmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFGaWxlbmFtZSA9ICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFFeHRGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMUV4dFBhY2tGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsSW1wbEZpbGVuYW1lID0gImNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSI7DQorICAgICAgICBTdHJpbmcgY0ZpbGVuYW1lID0gImNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIjsNCisNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTBTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTBFeHRTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDEwRXh0RmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRXh0RmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRQYWNrU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUV4dFBhY2tGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2xJbXBsU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2xJbXBsRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBjRmlsZW5hbWUpKTsNCisNCisgICAgICAgIFBhcmFtZXRlckNoZWNrZXIgY2hlY2tlciA9IG5ldyBQYXJhbWV0ZXJDaGVja2VyKGNoZWNrc1JlYWRlcik7DQorDQorICAgICAgICBDb2RlRW1pdHRlciBlbWl0dGVyID0NCisgICAgICAgICAgICBuZXcgSm5pQ29kZUVtaXR0ZXIoY2xhc3NQYXRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMFN0cmVhbSwgZ2wxMEV4dFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMVN0cmVhbSwgZ2wxMUV4dFN0cmVhbSwgZ2wxMUV4dFBhY2tTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIpOw0KKw0KKyAgICAgICAgZ2wxMFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTBGaWxlbmFtZSk7DQorICAgICAgICBnbDEwRXh0U3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMEV4dEZpbGVuYW1lKTsNCisgICAgICAgIGdsMTFTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDExRmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMUV4dFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTFFeHRGaWxlbmFtZSk7DQorICAgICAgICBnbDExRXh0UGFja1N0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArDQorICAgICAgICAgICAgZ2wxMUV4dFBhY2tGaWxlbmFtZSk7DQorICAgICAgICBnbEltcGxTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbEltcGxGaWxlbmFtZSk7DQorICAgICAgICBjU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2xpYnMvYW5kcm9pZF9ydW50aW1lLyIgKyBjRmlsZW5hbWUpOw0KKw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmIiwgZ2wxMFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYiLCBnbDEwRXh0U3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTFIZWFkZXIuamF2YS1pZiIsIGdsMTFTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmIiwgZ2wxMUV4dFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIiwgZ2wxMUV4dFBhY2tTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbCIsIGdsSW1wbFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTENIZWFkZXIuY3BwIiwgY1N0cmVhbSk7DQorDQorICAgICAgICBlbWl0KDAsIGZhbHNlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwUmVhZGVyLCBnbDEwU3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgwLCB0cnVlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwRXh0UmVhZGVyLCBnbDEwRXh0U3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgxLCBmYWxzZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMVJlYWRlciwgZ2wxMVN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgdHJ1ZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMUV4dFJlYWRlciwgZ2wxMUV4dFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgdHJ1ZSwgdHJ1ZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExRXh0UGFja1JlYWRlciwgZ2wxMUV4dFBhY2tTdHJlYW0sIGdsSW1wbFN0cmVhbSwNCisgICAgICAgICAgICAgY1N0cmVhbSk7DQorDQorICAgICAgICBlbWl0dGVyLmVtaXROYXRpdmVSZWdpc3RyYXRpb24oKTsNCisNCisgICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMEV4dFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMUV4dFBhY2tTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2xJbXBsU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNDY2YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSkZ1bmMuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBKRnVuYyB7DQorDQorICAgIFN0cmluZyBjbGFzc05hbWUgPSAiY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pLkdMMTFJbXBsIjsNCisNCisgICAgQ0Z1bmMgY2Z1bmM7DQorICAgIEpUeXBlIGZ0eXBlOw0KKyAgICBTdHJpbmcgZm5hbWU7DQorDQorICAgIExpc3Q8U3RyaW5nPiBhcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICBMaXN0PEpUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SlR5cGU+KCk7DQorICAgIExpc3Q8SW50ZWdlcj4gYXJnQ0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7DQorDQorICAgIGJvb2xlYW4gaGFzQnVmZmVyQXJnID0gZmFsc2U7DQorICAgIGJvb2xlYW4gaGFzVHlwZWRCdWZmZXJBcmcgPSBmYWxzZTsNCisgICAgQXJyYXlMaXN0PFN0cmluZz4gYnVmZmVyQXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisNCisgICAgcHVibGljIEpGdW5jKENGdW5jIGNmdW5jKSB7DQorICAgICAgICB0aGlzLmNmdW5jID0gY2Z1bmM7DQorICAgIH0NCisNCisgICAgcHVibGljIENGdW5jIGdldENGdW5jKCkgew0KKyAgICAgICAgcmV0dXJuIGNmdW5jOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7DQorICAgICAgICB0aGlzLmZuYW1lID0gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoSlR5cGUgZnR5cGUpIHsNCisgICAgICAgIHRoaXMuZnR5cGUgPSBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgew0KKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNCdWZmZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzQnVmZmVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc1R5cGVkQnVmZmVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVmZmVyQXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBidWZmZXJBcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KFN0cmluZyBhcmdOYW1lLCBKVHlwZSBhcmdUeXBlLCBpbnQgY2luZGV4KSB7DQorICAgICAgICBhcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7DQorICAgICAgICBhcmdDSW5kaWNlcy5hZGQobmV3IEludGVnZXIoY2luZGV4KSk7DQorDQorICAgICAgICBpZiAoYXJnVHlwZS5pc0J1ZmZlcigpKSB7DQorICAgICAgICAgICAgaGFzQnVmZmVyQXJnID0gdHJ1ZTsNCisgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkQnVmZmVyKCkpIHsNCisgICAgICAgICAgICBoYXNUeXBlZEJ1ZmZlckFyZyA9IHRydWU7DQorICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtQXJncygpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5zaXplKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRBcmdJbmRleChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgaW50IGxlbiA9IGFyZ05hbWVzLnNpemUoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJnTmFtZXMuZ2V0KGkpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRBcmdOYW1lKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlIGdldEFyZ1R5cGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnVHlwZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEFyZ0NJbmRleChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdDSW5kaWNlcy5nZXQoaW5kZXgpLmludFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBKRnVuYyBjb252ZXJ0KENGdW5jIGNmdW5jLCBib29sZWFuIHVzZUFycmF5KSB7DQorICAgICAgICBKRnVuYyBqZnVuYyA9IG5ldyBKRnVuYyhjZnVuYyk7DQorICAgICAgICBqZnVuYy5zZXROYW1lKGNmdW5jLmdldE5hbWUoKSk7DQorICAgICAgICBqZnVuYy5zZXRUeXBlKEpUeXBlLmNvbnZlcnQoY2Z1bmMuZ2V0VHlwZSgpLCBmYWxzZSkpOw0KKwkNCisgICAgICAgIGludCBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOw0KKyAgICAgICAgaW50IG51bU9mZnNldHMgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsNCisgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7DQorICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsNCisgICAgICAgICAgICAgICAgKytudW1PZmZzZXRzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7DQorICAgICAgICAgICAgU3RyaW5nIGNBcmdOYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShpKTsNCisgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7DQorDQorICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoY0FyZ05hbWUsIEpUeXBlLmNvbnZlcnQoY0FyZ1R5cGUsIHVzZUFycmF5KSwgaSk7DQorICAgICAgICAgICAgaWYgKGNBcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkgJiYgdXNlQXJyYXkpIHsNCisgICAgICAgICAgICAgICAgaWYgKG51bU9mZnNldHMgPiAxKSB7DQorICAgICAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudChjQXJnTmFtZSArICJPZmZzZXQiLCBuZXcgSlR5cGUoImludCIpLCBpKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KCJvZmZzZXQiLCBuZXcgSlR5cGUoImludCIpLCBpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBqZnVuYzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nIHMgPSAgIkZ1bmN0aW9uICIgKyBmbmFtZSArICIgcmV0dXJucyAiICsgZnR5cGUgKyAiOiAiOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdOYW1lcy5zaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpID4gMCkgew0KKyAgICAgICAgICAgICAgICBzICs9ICIsICI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHMgKz0gYXJnVHlwZXMuZ2V0KGkpICsgIiAiICsgYXJnTmFtZXMuZ2V0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHM7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmQ0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCisNCitwdWJsaWMgY2xhc3MgSlR5cGUgew0KKyAgICANCisgICAgU3RyaW5nIGJhc2VUeXBlOw0KKyAgICBib29sZWFuIGlzQXJyYXk7DQorICAgIGJvb2xlYW4gaXNDbGFzczsNCisNCisgICAgc3RhdGljIEhhc2hNYXA8Q1R5cGUsSlR5cGU+IHR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7DQorICAgIHN0YXRpYyBIYXNoTWFwPENUeXBlLEpUeXBlPiBhcnJheVR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7DQorDQorICAgIHN0YXRpYyB7DQorCS8vIFByaW1pdGl2ZSB0eXBlcw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJpdGZpZWxkIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iKSwgbmV3IEpUeXBlKCJib29sZWFuIikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1wZiIpLCBuZXcgSlR5cGUoImZsb2F0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGNsYW1weCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlbnVtIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiksIG5ldyBKVHlwZSgiZmxvYXQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludHB0ciIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIpLCBuZXcgSlR5cGUoInNob3J0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVieXRlIiksIG5ldyBKVHlwZSgiYnl0ZSIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJ2b2lkIiksIG5ldyBKVHlwZSgidm9pZCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoIlN0cmluZyIpKTsNCisNCisJLy8gVW50eXBlZCBwb2ludGVycyBtYXAgdG8gdW50eXBlZCBCdWZmZXJzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x2b2lkIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgidm9pZCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorDQorCS8vIFR5cGVkIHBvaW50ZXJzIG1hcCB0byB0eXBlZCBCdWZmZXJzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5GbG9hdEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uU2hvcnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKw0KKwkvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gYXJyYXlzICsgb2Zmc2V0cw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSwNCisJCQkgICAgIG5ldyBKVHlwZSgiYm9vbGVhbiIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJmbG9hdCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaG9ydCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoInNob3J0IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50cHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSkgew0KKwl0aGlzLmJhc2VUeXBlID0gcHJpbWl0aXZlVHlwZU5hbWU7DQorCXRoaXMuaXNDbGFzcyA9IGZhbHNlOw0KKwl0aGlzLmlzQXJyYXkgPSBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lLCBib29sZWFuIGlzQ2xhc3MsIGJvb2xlYW4gaXNBcnJheSkgew0KKwl0aGlzLmJhc2VUeXBlID0gcHJpbWl0aXZlVHlwZU5hbWU7DQorCXRoaXMuaXNDbGFzcyA9IGlzQ2xhc3M7DQorCXRoaXMuaXNBcnJheSA9IGlzQXJyYXk7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCXJldHVybiBiYXNlVHlwZSArIChpc0FycmF5ID8gIltdIiA6ICIiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgew0KKwlyZXR1cm4gaXNBcnJheTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgew0KKwlyZXR1cm4gaXNDbGFzczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsNCisJcmV0dXJuICFpc0NsYXNzKCkgJiYgIWlzQXJyYXkoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWQoKSB7DQorCXJldHVybiBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcigpIHsNCisJcmV0dXJuIGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRCdWZmZXIoKSB7DQorCXJldHVybiAhYmFzZVR5cGUuZXF1YWxzKCJqYXZhLm5pby5CdWZmZXIiKSAmJg0KKwkgICAgKGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIEpUeXBlIGNvbnZlcnQoQ1R5cGUgY3R5cGUsIGJvb2xlYW4gdXNlQXJyYXkpIHsNCisgCUpUeXBlIGphdmFUeXBlID0gbnVsbDsNCisgCWlmICh1c2VBcnJheSkgew0KKyAJICAgIGphdmFUeXBlID0gYXJyYXlUeXBlTWFwcGluZy5nZXQoY3R5cGUpOw0KKyAJfQ0KKyAJaWYgKGphdmFUeXBlID09IG51bGwpIHsNCisgCSAgICBqYXZhVHlwZSA9IHR5cGVNYXBwaW5nLmdldChjdHlwZSk7DQorIAl9DQorIAlpZiAoamF2YVR5cGUgPT0gbnVsbCkgew0KKyAJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBDIHR5cGU6ICIgKyBjdHlwZSk7DQorIAl9DQorIAlyZXR1cm4gamF2YVR5cGU7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjlhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEKQEAgLTAsMCArMSwxMDg2IEBACitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRW1pdHMgYSBKYXZhIGludGVyZmFjZSBhbmQgSmF2YSAmIEMgaW1wbGVtZW50YXRpb24gZm9yIGEgQyBmdW5jdGlvbi4KKyAqCisgKiA8cD4gVGhlIEphdmEgaW50ZXJmYWNlIHdpbGwgaGF2ZSBCdWZmZXIgYW5kIGFycmF5IHZhcmlhbnRzIGZvciBmdW5jdGlvbnMgdGhhdAorICogaGF2ZSBhIHR5cGVkIHBvaW50ZXIgYXJndW1lbnQuICBUaGUgYXJyYXkgdmFyaWFudCB3aWxsIGNvbnZlcnQgYSBzaW5nbGUgIjx0eXBlPiAqZGF0YSIKKyAqIGFyZ3VtZW50IHRvIGEgcGFpciBvZiBhcmd1bWVudHMgIjx0eXBlPltdIGRhdGEsIGludCBvZmZzZXQiLgorICovCitwdWJsaWMgY2xhc3MgSm5pQ29kZUVtaXR0ZXIgaW1wbGVtZW50cyBDb2RlRW1pdHRlciB7CisKKyAgICAvLyBJZiB0cnVlLCB1c2UgQysrIHN0eWxlIGZvciBjYWxsaW5nIHRocm91Z2ggYSBKTklFbnYgKjoKKyAgICAvLyBlbnYtPkZ1bmMoLi4uKQorICAgIC8vIElmIGZhbHNlLCB1c2UgQyBzdHlsZToKKyAgICAvLyAoKmVudiktPkZ1bmMoZW52LCAuLi4pCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gbVVzZUNQbHVzUGx1cyA9IHRydWU7CisKKyAgICBib29sZWFuIG1Vc2VDb250ZXh0UG9pbnRlciA9IHRydWU7CisKKyAgICBTdHJpbmcgbUNsYXNzUGF0aE5hbWU7CisgICAgCisgICAgUGFyYW1ldGVyQ2hlY2tlciBtQ2hlY2tlcjsKKyAgICBQcmludFN0cmVhbSBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMUludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhSW1wbFN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtQ1N0cmVhbTsKKworICAgIFByaW50U3RyZWFtIG1KYXZhSW50ZXJmYWNlU3RyZWFtOworCisgICAgTGlzdDxTdHJpbmc+IG5hdGl2ZVJlZ2lzdHJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIGJvb2xlYW4gbmVlZHNFeGl0OworCisgICAgc3RhdGljIFN0cmluZyBpbmRlbnQgPSAiICAgICI7CisKKyAgICBIYXNoU2V0PFN0cmluZz4gbUZ1bmN0aW9uc0VtaXR0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gamF2YTEwSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4wIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjAgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgZnVuY3Rpb25zIAorICAgICAqIEBwYXJhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgRXh0ZW5zaW9uIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBQYWNrIGZ1bmN0aW9ucworICAgICAqIEBwYXJhbSBqYXZhSW1wbFN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBjU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBDIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIEpuaUNvZGVFbWl0dGVyKFN0cmluZyBjbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YUltcGxTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgbUNsYXNzUGF0aE5hbWUgPSBjbGFzc1BhdGhOYW1lOworICAgICAgICBtQ2hlY2tlciA9IGNoZWNrZXI7CisgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmFJbXBsU3RyZWFtID0gamF2YUltcGxTdHJlYW07CisgICAgICAgIG1DU3RyZWFtID0gY1N0cmVhbTsKKyAgICAgICAgbVVzZUNvbnRleHRQb2ludGVyID0gdXNlQ29udGV4dFBvaW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaykgeworICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/IG1KYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0gOgorICAgICAgICAgICAgICAgIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBtSmF2YUludGVyZmFjZVN0cmVhbSA9IGV4dCA/CisgICAgICAgICAgICAgICAgKHBhY2sgPyBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA6CisgICAgICAgICAgICAgICAgIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0pIDoKKyAgICAgICAgICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKSB7CisgICAgICAgIEpGdW5jIGpmdW5jOworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlOworICAgICAgICBib29sZWFuIGR1cGxpY2F0ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChjZnVuYy5oYXNUeXBlZFBvaW50ZXJBcmcoKSkgeworICAgICAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gRG9uJ3QgZW1pdCBkdXBsaWNhdGUgZnVuY3Rpb25zCisgICAgICAgICAgICAvLyBUaGVzZSBtYXkgYXBwZWFyIGJlY2F1c2UgdGhleSBhcmUgZGVmaW5lZCBpbiBtdWx0aXBsZQorICAgICAgICAgICAgLy8gSmF2YSBpbnRlcmZhY2VzIChlLmcuLCBHTDExL0dMMTFFeHRlbnNpb25QYWNrKQorICAgICAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGR1cGxpY2F0ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBtSmF2YUludGVyZmFjZVN0cmVhbSk7CisgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgICAgIGVtaXRKbmlDb2RlKGpmdW5jLCBtQ1N0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqZnVuYyA9IEpGdW5jLmNvbnZlcnQoY2Z1bmMsIGZhbHNlKTsKKworICAgICAgICBzaWduYXR1cmUgPSBqZnVuYy50b1N0cmluZygpOworICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1GdW5jdGlvbnNFbWl0dGVkLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRnVuY3Rpb25zRW1pdHRlZC5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICBlbWl0TmF0aXZlRGVjbGFyYXRpb24oamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBtSmF2YUludGVyZmFjZVN0cmVhbSk7CisgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICBlbWl0SmF2YUNvZGUoamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgbUNTdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgb3V0LnByaW50bG4oIiAgICAvLyBDIGZ1bmN0aW9uICIgKyBqZnVuYy5nZXRDRnVuYygpLmdldE9yaWdpbmFsKCkpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEphdmFJbnRlcmZhY2VDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0SmF2YUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBlbWl0RnVuY3Rpb25DYWxsKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQsIFN0cmluZyBpaWksIGJvb2xlYW4gZ3JhYkFycmF5ICkgeworICAgICAgICBib29sZWFuIGlzVm9pZCA9IGpmdW5jLmdldFR5cGUoKS5pc1ZvaWQoKTsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0gamZ1bmMuZ2V0TmFtZSgpLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworCisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgKGlzVm9pZCA/ICIiIDogIl9yZXR1cm5WYWx1ZSA9ICIpICsKKyAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiICkgKworICAgICAgICAgICAgICAgICAgICAiKCIpOworCQorICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gamZ1bmMuZ2V0QXJnTmFtZShpKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworCisgICAgICAgICAgICBpZiAoZ3JhYkFycmF5ICYmIGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXJnVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDksIHR5cGVOYW1lLmxlbmd0aCgpIC0gNik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdldCIgKyB0eXBlTmFtZSArICJBcnJheSgiICsgYXJnTmFtZSArICIpLCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyAiZ2V0T2Zmc2V0KCIgKyBhcmdOYW1lICsgIikiKTsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyBhcmdOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgYXJnTmFtZSArICIucmVtYWluaW5nKCkiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQorICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiKTsiKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50SWZjaGVja1Bvc3RhbWJsZShQcmludFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssIFN0cmluZyBpaWkpIHsKKyAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQiLCAiX3JlbWFpbmluZyIsIGlpaSk7CisgICAgfQorCisgICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICBkZWZhdWx0OiIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBfbmVlZGVkID0gMDsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgYnJlYWs7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8IF9uZWVkZWQpIHsiKTsKKyAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgIklBRUNsYXNzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIiArCisgICAgICAgICAgICAgICAgICAgIChpc0J1ZmZlciA/IAorICAgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICAgICIgPCBuZWVkZWRcIik7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnb3RvIGV4aXQ7Iik7CisgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgfQorCisgICAgYm9vbGVhbiBpc051bGxBbGxvd2VkKENGdW5jIGNmdW5jKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0RXJyb3JSZXR1cm5WYWx1ZShDRnVuYyBjZnVuYykgeworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisgICAgICAgIGlmIChpc1ZvaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tzW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWRGdW5jKENGdW5jIGNmdW5jKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBjbmFtZSwgUHJpbnRTdHJlYW0gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQnVmZmVyLCBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9mZnNldCwgU3RyaW5nIHJlbWFpbmluZywgU3RyaW5nIGlpaSkgeworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisgICAgICAgIFN0cmluZyBjaGVja1ZhcjsKKyAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworCisgICAgICAgIGJvb2xlYW4gbGFzdFdhc0lmY2hlY2sgPSBmYWxzZTsKKworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtYWluaW5nRGVjbGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbnVsbENoZWNrRGVjbGFyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gb2Zmc2V0Q2hlY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCBpaWkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbmFtZSAhPSBudWxsICYmICFjbmFtZS5lcXVhbHMoY2hlY2tzW2luZGV4ICsgMV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gIklBRUNsYXNzIjsKKwkJICAgIC8vIElmIHRoZSAiY2hlY2siIGtleXdvcmQgd2FzIG9mIHRoZSBmb3JtCisJCSAgICAvLyAiY2hlY2tfPGNsYXNzIG5hbWU+IiwgdXNlIHRoZSBjbGFzcyBuYW1lIGluIHRoZQorCQkgICAgLy8gZXhjZXB0aW9uIHRvIGJlIHRocm93bgorCQkgICAgaW50IHVuZGVyc2NvcmUgPSBjaGVja3NbaW5kZXhdLmluZGV4T2YoJ18nKTsKKwkJICAgIGlmICh1bmRlcnNjb3JlID49IDApIHsKKwkJCWV4Y2VwdGlvbkNsYXNzTmFtZSA9IGNoZWNrc1tpbmRleF0uc3Vic3RyaW5nKHVuZGVyc2NvcmUgKyAxKSArICJDbGFzcyI7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKwkJCQlleGNlcHRpb25DbGFzc05hbWUgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc0J1ZmZlciA/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPCAiICsgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIpOyIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG1hdGNoZXMgPSBjaGVja3NbaW5kZXggKyA0XS5zcGxpdCgiLCIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpbnQgX25lZWRlZDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleCArIDNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiI2lmIGRlZmluZWQoIiArIG1hdGNoZXNbaV0gKyAiKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY2FzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIjZW5kaWYgLy8gZGVmaW5lZCgiICsgbWF0Y2hlc1tpXSArICIpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgX25lZWRlZCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIGJyZWFrOyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsYXN0V2FzSWZjaGVjayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssIGlpaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGhhc05vbkNvbnN0QXJnKEpGdW5jIGpmdW5jLCBDRnVuYyBjZnVuYywKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBub25QcmltaXRpdmVBcmdzKSB7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBub25QcmltaXRpdmVBcmdzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVtaXQgYSBmdW5jdGlvbiBpbiBzZXZlcmFsIHZhcmlhbnRzOgorICAgICAqCisgICAgICogaWYgbmF0aXZlRGVjbDogcHVibGljIG5hdGl2ZSA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKKyAgICAgKgorICAgICAqIGlmICFuYXRpdmVEZWNsOgorICAgICAqICAgaWYgaW50ZXJmYWNlRGVjbDogIHB1YmxpYyA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKTsKKyAgICAgKiAgIGlmICFpbnRlcmZhY2VEZWNsOiBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncykgeyBib2R5IH0KKyAgICAgKi8KKyAgICB2b2lkIGVtaXRGdW5jdGlvbihKRnVuYyBqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuYXRpdmVEZWNsLCBib29sZWFuIGludGVyZmFjZURlY2wpIHsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0KKyAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKworICAgICAgICBpZiAoIW5hdGl2ZURlY2wgJiYgIWludGVyZmFjZURlY2wgJiYgIWlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgcG9pbnRlciBmdW5jdGlvbiwgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGl0CisgICAgICAgICAgICAvLyB3aXRoIG5hdGl2ZURlY2wgPT0gdHJ1ZQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJwcml2YXRlIG5hdGl2ZSAiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJCb3VuZHMiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIoIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAicHVibGljIG5hdGl2ZSAiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0VHlwZSgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiKCIpOworICAgICAgICB9CisJCisgICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBqZnVuYy5nZXRBcmdOYW1lKGkpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisJICAgIAorICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArIGFyZ1R5cGUgKyAiICIgKyBhcmdOYW1lKTsKKyAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMgJiYgbmF0aXZlRGVjbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiaW50IHJlbWFpbmluZyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hdGl2ZURlY2wgfHwgaW50ZXJmYWNlRGVjbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIik7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKSB7Iik7CisKKyAgICAgICAgICAgIFN0cmluZyBpaWkgPSBpbmRlbnQgKyBpbmRlbnQ7CisKKyAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGpmdW5jLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlYWwgd2l0aCBWQk8gdmFyaWFudHMKKyAgICAgICAgICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCJnbENvbG9yUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKHNpemUgPT0gNCkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfY29sb3JQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xOb3JtYWxQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX25vcm1hbFBvaW50ZXIgPSBwb2ludGVyOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbFRleENvb3JkUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdGV4Q29vcmRQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xWZXJ0ZXhQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl92ZXJ0ZXhQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVtaXRCb3VuZHNDaGVja3MoamZ1bmMsIG91dCwgaWlpKTsKKyAgICAgICAgICAgIGVtaXRGdW5jdGlvbkNhbGwoamZ1bmMsIG91dCwgaWlpLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gamZ1bmMuZ2V0VHlwZSgpLmlzVm9pZCgpOworCisgICAgICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJyZXR1cm4gX3JldHVyblZhbHVlOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpuaU5hbWUoSlR5cGUgalR5cGUpIHsKKyAgICAgICAgU3RyaW5nIGpuaU5hbWUgPSAiIjsKKyAgICAgICAgaWYgKGpUeXBlLmlzQ2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuICJMIiArIGpUeXBlLmdldEJhc2VUeXBlKCkgKyAiOyI7CisgICAgICAgIH0gZWxzZSBpZiAoalR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBqbmlOYW1lID0gIlsiOworICAgICAgICB9CisJCisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoImludCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJJIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImZsb2F0IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkYiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiYm9vbGVhbiIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJaIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoInNob3J0IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIlMiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygibG9uZyIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJMIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJ5dGUiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiQiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGpuaU5hbWU7CisgICAgfQorCisgICAgU3RyaW5nIGdldEpuaVR5cGUoSlR5cGUgalR5cGUpIHsKKyAgICAgICAgaWYgKGpUeXBlLmlzVm9pZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gInZvaWQiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0galR5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgaWYgKGpUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChiYXNlVHlwZS5lcXVhbHMoIlN0cmluZyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJqc3RyaW5nIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJqIiArIGJhc2VUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGpUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuICJqIiArIGJhc2VUeXBlICsgIkFycmF5IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiam9iamVjdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgU3RyaW5nIGdldEpuaU1hbmdsZWROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIl8iLCAiXzEiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiOyIsICJfMiIpOworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJcXFsiLCAiXzMiKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEpuaUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBDRnVuYyBjZnVuYyA9IGpmdW5jLmdldENGdW5jKCk7CisJCisgICAgICAgIC8vIEVtaXQgY29tbWVudCBpZGVudGlmeWluZyBvcmlnaW5hbCBDIGZ1bmN0aW9uCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIC8qIHZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApICovCisgICAgICAgIC8vCisgICAgICAgIG91dC5wcmludGxuKCIvKiAiICsgY2Z1bmMuZ2V0T3JpZ2luYWwoKSArICIgKi8iKTsKKworICAgICAgICAvLyBFbWl0IEpOSSBzaWduYXR1cmUgKG5hbWUpCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIHZvaWQKKyAgICAgICAgLy8gYW5kcm9pZF9nbENsaXBQbGFuZWZfX0lfM0ZJCisgICAgICAgIC8vCisKKyAgICAgICAgU3RyaW5nIG91dE5hbWUgPSAiYW5kcm9pZF8iICsgamZ1bmMuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBvdXROYW1lLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworICAgICAgICBib29sZWFuIGlzVkJPUG9pbnRlckZ1bmMgPSAob3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlciIpIHx8CisgICAgICAgICAgICBvdXROYW1lLmVuZHNXaXRoKCJEcmF3RWxlbWVudHMiKSkgJiYKKyAgICAgICAgICAgICFqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dE5hbWUgKz0gIkJvdW5kcyI7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oZ2V0Sm5pVHlwZShqZnVuYy5nZXRUeXBlKCkpKTsKKyAgICAgICAgb3V0LnByaW50KG91dE5hbWUpOworCisgICAgICAgIFN0cmluZyByc2lnbmF0dXJlID0gZ2V0Sm5pTmFtZShqZnVuYy5nZXRUeXBlKCkpOworCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSAiIjsKKyAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKyAgICAgICAgICAgIHNpZ25hdHVyZSArPSBnZXRKbmlOYW1lKGFyZ1R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBzaWduYXR1cmUgKz0gIkkiOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwZW5kIHNpZ25hdHVyZSB0byBmdW5jdGlvbiBuYW1lCisgICAgICAgIFN0cmluZyBzaWcgPSBnZXRKbmlNYW5nbGVkTmFtZShzaWduYXR1cmUpLnJlcGxhY2UoJy4nLCAnXycpOyAgICAgICAgCisgICAgICAgIG91dC5wcmludCgiX18iICsgc2lnKTsKKyAgICAgICAgb3V0TmFtZSArPSAiX18iICsgc2lnOworCQorICAgICAgICBzaWduYXR1cmUgPSBzaWduYXR1cmUucmVwbGFjZSgnLicsICcvJyk7CisgICAgICAgIHJzaWduYXR1cmUgPSByc2lnbmF0dXJlLnJlcGxhY2UoJy4nLCAnLycpOworCQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICBpZiAocnNpZ25hdHVyZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByc2lnbmF0dXJlID0gIlYiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHMgPSAie1wiIiArCisgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiKSArCisgICAgICAgICAgICAiXCIsIFwiKCIgKyBzaWduYXR1cmUgKyIpIiArCisgICAgICAgICAgICByc2lnbmF0dXJlICsKKyAgICAgICAgICAgICJcIiwgKHZvaWQgKikgIiArCisgICAgICAgICAgICBvdXROYW1lICsKKyAgICAgICAgICAgICIgfSwiOworICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKKworICAgICAgICBMaXN0PEludGVnZXI+IG5vblByaW1pdGl2ZUFyZ3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGludCBudW1CdWZmZXJBcmdzID0gMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgLy8gRW1pdCBKTkkgc2lnbmF0dXJlIChhcmd1bWVudHMpCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIChKTklFbnYgKl9lbnYsIGpvYmplY3QgdGhpcywgamludCBwbGFuZSwgamZsb2F0QXJyYXkgZXF1YXRpb25fcmVmLCBqaW50IG9mZnNldCkgeworICAgICAgICAvLworICAgICAgICBvdXQucHJpbnQoIiAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisgICAgICAgICAgICBTdHJpbmcgc3VmZml4OworICAgICAgICAgICAgaWYgKCFhcmdUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIl9yZWYiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJfYnVmIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9uUHJpbWl0aXZlQXJncy5hZGQobmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGkpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoY25hbWUpOworICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJBcmdzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSAiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50KGdldEpuaVR5cGUoYXJnVHlwZSkgKyAiICIgKyBqZnVuYy5nZXRBcmdOYW1lKGkpICsgc3VmZml4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgb3V0LnByaW50KCIsIGppbnQgcmVtYWluaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIikgeyIpOworCQorICAgICAgICBpbnQgbnVtQXJyYXlzID0gMDsKKyAgICAgICAgaW50IG51bUJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICArK251bUFycmF5czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICsrbnVtQnVmZmVyczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVtaXQgbWV0aG9kIGJvZHkKKworICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgX2V4Y2VwdGlvbiBhbmQgX3JldHVyblZhbHVlCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eDsKKyAgICAgICAgLy8gCisgICAgICAgIC8vIGppbnQgX2V4Y2VwdGlvbjsKKyAgICAgICAgLy8gR0xlbnVtIF9yZXR1cm5WYWx1ZTsKKyAgICAgICAgLy8KKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworCisgICAgICAgIGJvb2xlYW4gaXNVbnN1cHBvcnRlZCA9IGlzVW5zdXBwb3J0ZWRGdW5jKGNmdW5jKTsKKyAgICAgICAgaWYgKGlzVW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiX2Vudi0+VGhyb3dOZXcoVU9FQ2xhc3MsIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcIiIgKyBjZnVuYy5nZXROYW1lKCkgKyAiXCIpOyIpOworICAgICAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiAiICsgcmV0dmFsICsgIjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZDo6Z2w6Om9nbGVzX2NvbnRleHRfdCAqY3R4ID0gZ2V0Q29udGV4dChfZW52LCBfdGhpcyk7Iik7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjayA9IChudW1BcnJheXMgPiAwIHx8IG51bUJ1ZmZlcnMgPiAwKSAmJgorICAgICAgICAgICAgaGFzTm9uQ29uc3RBcmcoamZ1bmMsIGNmdW5jLCBub25QcmltaXRpdmVBcmdzKTsKKyAgICAgICAgLy8gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSkgIT0gbnVsbAorCisgICAgICAgIC8vIEVtaXQgYW4gX2V4ZXB0aW9uIHZhcmlhYmxlIGlmIHRoZXJlIHdpbGwgYmUgZXJyb3IgY2hlY2tzCisgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqaW50IF9leGNlcHRpb24gPSAwOyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCBhIHNpbmdsZSBfYXJyYXkgb3IgbXVsdGlwbGUgX1hYWEFycmF5IHZhcmlhYmxlcworICAgICAgICBpZiAobnVtQnVmZmVyQXJncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImphcnJheSBfYXJyYXkgPSAoamFycmF5KSAwOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWZmZXJBcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamFycmF5IF8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgPSAoamFycmF5KSAwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisgICAgICAgICAgICBpZiAocmV0dmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZXR1cm5UeXBlLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgX3JldHVyblZhbHVlID0gIiArIHJldHZhbCArICI7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJldHVyblR5cGUuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgcG9pbnRlciBhcmd1bWVudHMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR0xmaXhlZCAqZXFuX2Jhc2U7CisgICAgICAgIC8vIEdMZml4ZWQgKmVxbjsKKyAgICAgICAgLy8KKyAgICAgICAgU3RyaW5nIG9mZnNldCA9ICJvZmZzZXQiOworICAgICAgICBTdHJpbmcgcmVtYWluaW5nID0gIl9yZW1haW5pbmciOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworCisgICAgICAgICAgICAgICAgQ1R5cGUgdHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsID0gdHlwZS5nZXREZWNsYXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKyBkZWNsICsgIikgMDsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gKG51bUFycmF5cyA8PSAxICYmIG51bUJ1ZmZlcnMgPD0gMSkgPyAiX3JlbWFpbmluZyIgOgorICAgICAgICAgICAgICAgICAgICAiXyIgKyBjbmFtZSArICJSZW1haW5pbmciOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImppbnQgIiArIHJlbWFpbmluZyArICI7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKyBkZWNsICsgIikgMDsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXR2YWwgPSBpc1ZvaWQgPyAiIiA6ICIgX3JldHVyblZhbHVlIjsKKworICAgICAgICAvLyBFbWl0ICdHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsJyBmb3IgYXJyYXlzCisgICAgICAgIC8vIEVtaXQgJ0dldFBvaW50ZXInIGNhbGxzIGZvciBCdWZmZXIgcG9pbnRlcnMKKyAgICAgICAgaW50IGJ1ZkFyZ0lkeCA9IDA7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKwkJCisgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IG51bUFycmF5cyA8PSAxID8gIm9mZnNldCIgOgorICAgICAgICAgICAgICAgICAgICBjbmFtZSArICJPZmZzZXQiOworICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IChudW1BcnJheXMgPD0gMSAmJiBudW1CdWZmZXJzIDw9IDEpID8gIl9yZW1haW5pbmciIDoKKyAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKKworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoISIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZikgeyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUFFQ2xhc3MsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID09IG51bGxcIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIG9mZnNldCArICIgPCAwKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQUVDbGFzcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBvZmZzZXQgKyAiIDwgMFwiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmVtYWluaW5nICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5HZXRBcnJheUxlbmd0aCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiX3JlZikgLSAiICsgb2Zmc2V0ICsgIjsiKTsKKworICAgICAgICAgICAgICAgICAgICBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKGNmdW5jLCBjbmFtZSwgb3V0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UgPSAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZiwgKGpib29sZWFuICopMCk7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIiA9ICIgKyBjbmFtZSArICJfYmFzZSArICIgKyBvZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbnVsbEFsbG93ZWQgPSBpc051bGxBbGxvd2VkKGNmdW5jKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBjbmFtZSArICJfYnVmKSB7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpZ2V0UG9pbnRlcihfZW52LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2J1ZiwgJiIgKyBhcnJheSArICIsICYiICsgcmVtYWluaW5nICsgIik7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsICIgICAgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyAiX3JldHVyblZhbHVlID0gIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGNmdW5jLmdldE5hbWUoKTsKKworICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMiwgbmFtZS5sZW5ndGgoKSk7IC8vIFN0cmlwIG9mZiAnZ2wnIHByZWZpeAorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKworICAgICAgICAgICAgICAgIG5hbWUuc3Vic3RyaW5nKDEsIG5hbWUubGVuZ3RoKCkpOworICAgICAgICAgICAgb3V0LnByaW50KCJjdHgtPnByb2NzLiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQucHJpbnQobmFtZSArIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIikgKyAiKCIpOworCisgICAgICAgIG51bUFyZ3MgPSBjZnVuYy5nZXROdW1BcmdzKCk7ICAgIAorICAgICAgICBpZiAobnVtQXJncyA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImN0eCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgsIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlY2FzdDsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSAmJiBpc1ZCT1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ID0gImNvbnN0IEdMdm9pZCAqIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9IGNmdW5jLmdldEFyZ1R5cGUoaSkuZ2V0RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIikiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICIoR0xzaXplaSlyZW1haW5pbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpOyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRzRXhpdCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJleGl0OiIpOworICAgICAgICAgICAgbmVlZHNFeGl0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBidWZBcmdJZHggPSAwOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbm9uUHJpbWl0aXZlQXJncy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisJCSAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyZ3VtZW50IGlzICdjb25zdCcsIEdMIHdpbGwgbm90IHdyaXRlIHRvIGl0LgorICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGNhbiB1c2UgdGhlICdKTklfQUJPUlQnIGZsYWcgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5lZWQgdG8gd3JpdGUgYmFjayB0byB0aGUgSmF2YSBhcnJheQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCIgKyBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAiX2Jhc2UpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9yZWYsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UsIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTklfQUJPUlQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfZXhjZXB0aW9uID8gSk5JX0FCT1JUOiAwIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBhcnJheSArICIpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VQb2ludGVyKF9lbnYsICIgKyBhcnJheSArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpOSV9GQUxTRSIgOiAiX2V4Y2VwdGlvbiA/IEpOSV9GQUxTRSA6IEpOSV9UUlVFIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRsbigifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgcykgeworICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCkgeworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJzdGF0aWMgY29uc3QgY2hhciAqY2xhc3NQYXRoTmFtZSA9IFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2xhc3NQYXRoTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCI7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZHNbXSA9IHsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ7XCJfbmF0aXZlQ2xhc3NJbml0XCIsIFwiKClWXCIsICh2b2lkKiluYXRpdmVDbGFzc0luaXQgfSwiKTsKKworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGkgPSBuYXRpdmVSZWdpc3RyYXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ9OyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCk7CisgICAgCisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigiaW50IHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwoSk5JRW52ICpfZW52KSIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXJyOyIpOworCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJlcnIgPSBhbmRyb2lkOjpBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKF9lbnYsIGNsYXNzUGF0aE5hbWUsIG1ldGhvZHMsIE5FTEVNKG1ldGhvZHMpKTsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArICJyZXR1cm4gZXJyOyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJ9Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjI2YWNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIFBhcmFtZXRlckNoZWNrZXIgeworCisgICAgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmdbXT4oKTsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXJDaGVja2VyKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzOworICAgICAgICB3aGlsZSAoKHMgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiXFxzIik7CisgICAgICAgICAgICBtYXAucHV0KHRva2Vuc1swXSwgdG9rZW5zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDaGVja3MoU3RyaW5nIGZ1bmN0aW9uTmFtZSkgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7CisgICAgICAgIGlmIChjaGVja3MgPT0gbnVsbCAmJgorICAgICAgICAgICAgKGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiZnYiKSB8fAorICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgieHYiKSB8fAorICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZS5lbmRzV2l0aCgiaXYiKSkpIHsKKyAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgZnVuY3Rpb25OYW1lLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICBjaGVja3MgPSBtYXAuZ2V0KGZ1bmN0aW9uTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk5OWMyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDIyIEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTBFeHQgZXh0ZW5kcyBHTCB7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTI4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjU5IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTAgZXh0ZW5kcyBHTCB7CisgICAgaW50IEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDQ7CisgICAgaW50IEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkU7CisgICAgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkQ7CisgICAgaW50IEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDY7CisgICAgaW50IEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTU7CisgICAgaW50IEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzA7CisgICAgaW50IEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDc7CisgICAgaW50IEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDA7CisgICAgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgPSAweDE2MDI7CisgICAgaW50IEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDE7CisgICAgaW50IEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDQ7CisgICAgaW50IEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDI7CisgICAgaW50IEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDU7CisgICAgaW50IEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTI7CisgICAgaW50IEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTQ7CisgICAgaW50IEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7CisgICAgaW50IEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDE7CisgICAgaW50IEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMkY7CisgICAgaW50IEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDA7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzY7CisgICAgaW50IEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7CisgICAgaW50IEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRjI7CisgICAgaW50IEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTc7CisgICAgaW50IEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICAgICAgPSAweDg2QTM7CisgICAgaW50IEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgPSAweDEyMDc7CisgICAgaW50IEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDM7CisgICAgaW50IEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEM7CisgICAgaW50IEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDQ7CisgICAgaW50IEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDA7CisgICAgaW50IEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDE7CisgICAgaW50IEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDM7CisgICAgaW50IEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTY7CisgICAgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDA7CisgICAgaW50IEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzE7CisgICAgaW50IEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDE7CisgICAgaW50IEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRDA7CisgICAgaW50IEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDA7CisgICAgaW50IEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDQ7CisgICAgaW50IEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDY7CisgICAgaW50IEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDA7CisgICAgaW50IEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDI7CisgICAgaW50IEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDk7CisgICAgaW50IEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDA7CisgICAgaW50IEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA4MDE7CisgICAgaW50IEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDM7CisgICAgaW50IEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGludCBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAxOworICAgIGludCBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOworICAgIGludCBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAwOworICAgIGludCBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2OworICAgIGludCBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYwOworICAgIGludCBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY2OworICAgIGludCBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYyOworICAgIGludCBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY0OworICAgIGludCBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzU0OworICAgIGludCBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY1OworICAgIGludCBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYzOworICAgIGludCBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA0OworICAgIGludCBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA4OworICAgIGludCBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA2OworICAgIGludCBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA0OworICAgIGludCBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUzOworICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgID0gMHg4QjlCOworICAgIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTICAgID0gMHg4QjlBOworICAgIGludCBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAyOworICAgIGludCBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwOworICAgIGludCBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAyOworICAgIGludCBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAxOworICAgIGludCBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBBOworICAgIGludCBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAwOworICAgIGludCBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAzOworICAgIGludCBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAxOworICAgIGludCBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgID0gMHgwQjUzOworICAgIGludCBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgICAgICAgID0gMHgwQjUyOworICAgIGludCBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOworICAgIGludCBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAxOworICAgIGludCBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAyOworICAgIGludCBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAzOworICAgIGludCBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA0OworICAgIGludCBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA1OworICAgIGludCBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA2OworICAgIGludCBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA3OworICAgIGludCBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjUwOworICAgIGludCBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyOworICAgIGludCBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIwOworICAgIGludCBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUyOworICAgIGludCBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAzOworICAgIGludCBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAxOworICAgIGludCBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgID0gMHgxMjA4OworICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgID0gMHgyNzAzOworICAgIGludCBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgID0gMHgyNzAxOworICAgIGludCBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxOworICAgIGludCBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA5OworICAgIGludCBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTBBOworICAgIGludCBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgICAgICAgID0gMHg4MEU5OworICAgIGludCBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgICAgICAgID0gMHg4MEU4OworICAgIGludCBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMxOworICAgIGludCBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgID0gMHgwRDM2OworICAgIGludCBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgID0gMHgwRDM4OworICAgIGludCBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMzOworICAgIGludCBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgID0gMHgwRDM5OworICAgIGludCBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUyOworICAgIGludCBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgICAgID0gMHgwRDNBOworICAgIGludCBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAwOworICAgIGludCBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAwOworICAgIGludCBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDlEOworICAgIGludCBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBFOworICAgIGludCBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAwOworICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgID0gMHgyNzAyOworICAgIGludCBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgID0gMHgyNzAwOworICAgIGludCBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwOworICAgIGludCBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAyOworICAgIGludCBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNTsKKyAgICBpbnQgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwODsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NTsKKyAgICBpbnQgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMTsKKyAgICBpbnQgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNTsKKyAgICBpbnQgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICA9IDB4ODZBMjsKKyAgICBpbnQgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgaW50IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDU7CisgICAgaW50IEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDc7CisgICAgaW50IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDM7CisgICAgaW50IEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgPSAweDAzMDE7CisgICAgaW50IEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDc7CisgICAgaW50IEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEQ7CisgICAgaW50IEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEI7CisgICAgaW50IEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDU7CisgICAgaW50IEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMDU7CisgICAgaW50IEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTI7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTQ7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTA7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTM7CisgICAgaW50IEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTE7CisgICAgaW50IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTc7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgPSAweDhCOTk7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTU7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTg7CisgICAgaW50IEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTY7CisgICAgaW50IEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAgICAgICAgPSAweDBDNTA7CisgICAgaW50IEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTA7CisgICAgaW50IEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTE7CisgICAgaW50IEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA7CisgICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgPSAweDgxMjg7CisgICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTE7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAgICAgICAgPSAweDgwMzc7CisgICAgaW50IEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgPSAweDBDNTM7CisgICAgaW50IEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDM7CisgICAgaW50IEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDE7CisgICAgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgPSAweDEyMDk7CisgICAgaW50IEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTI7CisgICAgaW50IEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDE7CisgICAgaW50IEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5MDE7CisgICAgaW50IEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDE7CisgICAgaW50IEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwM0E7CisgICAgaW50IEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDc7CisgICAgaW50IEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDg7CisgICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAgICAgICAgPSAweDgwOUU7CisgICAgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAgICAgICAgPSAweDgwOUY7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTA7CisgICAgaW50IEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTE7CisgICAgaW50IEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEY7CisgICAgaW50IEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE2MDE7CisgICAgaW50IEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7CisgICAgaW50IEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDE7CisgICAgaW50IEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMjI7CisgICAgaW50IEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICAgPSAweDBCMTI7CisgICAgaW50IEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDI7CisgICAgaW50IEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDY7CisgICAgaW50IEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDQ7CisgICAgaW50IEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDU7CisgICAgaW50IEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDI7CisgICAgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAgICAgICAgPSAweDAzMDg7CisgICAgaW50IEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDA7CisgICAgaW50IEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDM7CisgICAgaW50IEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDQ7CisgICAgaW50IEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTc7CisgICAgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgPSAweDA0MDA7CisgICAgaW50IEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTA7CisgICAgaW50IEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTA7CisgICAgaW50IEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDI7CisgICAgaW50IEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBERTE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAgICAgICAgPSAweDgwNzg7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIzMDA7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDE7CisgICAgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDA7CisgICAgaW50IEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDA7CisgICAgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgPSAweDI4MDE7CisgICAgaW50IEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDI7CisgICAgaW50IEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDM7CisgICAgaW50IEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzA7CisgICAgaW50IEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzE7CisgICAgaW50IEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzI7CisgICAgaW50IEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzM7CisgICAgaW50IEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzQ7CisgICAgaW50IEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzU7CisgICAgaW50IEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzY7CisgICAgaW50IEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzc7CisgICAgaW50IEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzg7CisgICAgaW50IEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzk7CisgICAgaW50IEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0E7CisgICAgaW50IEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0I7CisgICAgaW50IEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0M7CisgICAgaW50IEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Q7CisgICAgaW50IEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0U7CisgICAgaW50IEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Y7CisgICAgaW50IEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDA7CisgICAgaW50IEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDE7CisgICAgaW50IEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDI7CisgICAgaW50IEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDM7CisgICAgaW50IEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDQ7CisgICAgaW50IEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDU7CisgICAgaW50IEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDY7CisgICAgaW50IEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDc7CisgICAgaW50IEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDg7CisgICAgaW50IEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDk7CisgICAgaW50IEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REE7CisgICAgaW50IEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REI7CisgICAgaW50IEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REM7CisgICAgaW50IEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REQ7CisgICAgaW50IEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REU7CisgICAgaW50IEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REY7CisgICAgaW50IEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDY7CisgICAgaW50IEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDU7CisgICAgaW50IEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQ7CisgICAgaW50IEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgID0gMHgwQ0Y1OworICAgIGludCBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAxOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAzOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgICAgICAgID0gMHg4MDMzOworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgICAgICAgID0gMHg4MDM0OworICAgIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgICAgICAgID0gMHg4MzYzOworICAgIGludCBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAwOworICAgIGludCBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAyOworICAgIGludCBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc0OworICAgIGludCBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA2OworICAgIGludCBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlMjE2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSw0MCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExRXh0IGV4dGVuZHMgR0wgeworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTID0gMHg4QjlFOworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTICAgICAgICAgICAgICAgID0gMHg4ODQ0OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgID0gMHg4ODQ5OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMgICAgICAgICAgID0gMHg4ODQ2OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgID0gMHg4ODQ4OworICAgIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgID0gMHg4ODQ3OworICAgIGludCBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4ODQwOworICAgIGludCBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgID0gMHg4ODQyOworICAgIGludCBHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgID0gMHg4NkE0OworICAgIGludCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjlEOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgID0gMHg4ODlFOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFEOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgID0gMHg4NkFDOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgID0gMHg4NkFCOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgID0gMHg4NkFBOworICAgIGludCBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgID0gMHg4NkE5OworCisgICAgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSwgaW50IG9mZnNldCk7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwMDE5MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMTA4IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHRlbnNpb25QYWNrIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0E7CisgICAgaW50IEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDODsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OworICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4M0Q7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKKyAgICBpbnQgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOworICAgIGludCBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzk7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UxOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U0OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNjsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U3OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTg7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ5X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFOTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VBOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VEOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRjsKKyAgICBpbnQgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OworICAgIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMjsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTY7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgID0gMHg4Q0QxOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgPSAweDhDRDA7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyA9IDB4OENEMzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUyAgICAgICAgID0gMHg4Q0QyOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTY7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENENTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgID0gMHg4Q0Q2OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgPSAweDhDRDk7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgID0gMHg4Q0RBOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgPSAweDhDRDc7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQwOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREQ7CisgICAgaW50IEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKKyAgICBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBCOworICAgIGludCBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEE7CisgICAgaW50IEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKKyAgICBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgID0gMHgwNTA2OworICAgIGludCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREY7CisgICAgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQzsKKyAgICBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU4OworICAgIGludCBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7CisgICAgaW50IEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMTsKKyAgICBpbnQgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTM7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQzOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgPSAweDhENDQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUwOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhENTU7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKKyAgICBpbnQgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU3OworICAgIGludCBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjI7CisgICAgaW50IEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1MTsKKyAgICBpbnQgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OworICAgIGludCBHTF9SR0JBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTg7CisgICAgaW50IEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQyMDsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAxOworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDY7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OworICAgIGludCBHTF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE0OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTM7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE4OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE3OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTk7CisgICAgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9HRU5fU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYwOworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU1YTZiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDE0NSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExIGV4dGVuZHMgR0wxMCB7CisgICAgaW50IEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMDsKKyAgICBpbnQgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc0OworICAgIGludCBHTF9BTFBIQV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMUM7CisgICAgaW50IEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMTsKKyAgICBpbnQgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMyOworICAgIGludCBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OTI7CisgICAgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4ODg5NDsKKyAgICBpbnQgR0xfQkxFTkRfRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUwOworICAgIGludCBHTF9CTEVORF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTE7CisgICAgaW50IEdMX0JVRkZFUl9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQjsKKyAgICBpbnQgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY0OworICAgIGludCBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjU7CisgICAgaW50IEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICA9IDB4ODRFMTsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAwOworICAgIGludCBHTF9DTElQX1BMQU5FMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDE7CisgICAgaW50IEdMX0NMSVBfUExBTkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMjsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAzOworICAgIGludCBHTF9DTElQX1BMQU5FNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDQ7CisgICAgaW50IEdMX0NMSVBfUExBTkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwNTsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgID0gMHg4ODk4OworICAgIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAweDgwOTA7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MTsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgzOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODI7CisgICAgaW50IEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMjsKKyAgICBpbnQgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIzOworICAgIGludCBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzA7CisgICAgaW50IEdMX0NPTUJJTkVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MjsKKyAgICBpbnQgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcxOworICAgIGludCBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzY7CisgICAgaW50IEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MjsKKyAgICBpbnQgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ1OworICAgIGludCBHTF9DVVJSRU5UX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDA7CisgICAgaW50IEdMX0NVUlJFTlRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIwMjsKKyAgICBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyAgICAgICAgICAgICAgICAgID0gMHgwQjAzOworICAgIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzM7CisgICAgaW50IEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3NDsKKyAgICBpbnQgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcwOworICAgIGludCBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzI7CisgICAgaW50IEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRTsKKyAgICBpbnQgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFGOworICAgIGludCBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTg7CisgICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MzsKKyAgICBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgID0gMHg4ODk1OworICAgIGludCBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDY7CisgICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MTsKKyAgICBpbnQgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICAgICAgICAgID0gMHg4MTkyOworICAgIGludCBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzU7CisgICAgaW50IEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMTsKKyAgICBpbnQgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYwOworICAgIGludCBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTA7CisgICAgaW50IEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMjsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE2OworICAgIGludCBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgPSAweDg5OEQ7CisgICAgaW50IEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICA9IDB4MEJBMzsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk3OworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEY7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RjsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdFOworICAgIGludCBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTg7CisgICAgaW50IEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MDsKKyAgICBpbnQgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk5OworICAgIGludCBHTF9PUEVSQU5EMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTE7CisgICAgaW50IEdMX09QRVJBTkQyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5QTsKKyAgICBpbnQgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkyOworICAgIGludCBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgICAgICAgICAgPSAweDgxMjk7CisgICAgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgICA9IDB4ODEyODsKKyAgICBpbnQgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgPSAweDhCOUY7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5QzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgID0gMHg4OThDOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgPSAweDg5OEI7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICA9IDB4ODk4QTsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI3OworICAgIGludCBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjY7CisgICAgaW50IEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MTsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgICAgICAgICAgID0gMHg4MDM4OworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgICAgICAgICAgPSAweDJBMDA7CisgICAgaW50IEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3ODsKKyAgICBpbnQgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc3OworICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTc7CisgICAgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyA9IDB4ODk4RTsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgID0gMHgwQkE0OworICAgIGludCBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzM7CisgICAgaW50IEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBODsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgICAgICAgICAgID0gMHg4MEFCOworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgICAgICAgICAgPSAweDgwQUE7CisgICAgaW50IEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBOTsKKyAgICBpbnQgR0xfU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzEwOworICAgIGludCBHTF9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTQ7CisgICAgaW50IEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4ODsKKyAgICBpbnQgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgwOworICAgIGludCBHTF9TUkMxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODk7CisgICAgaW50IEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MTsKKyAgICBpbnQgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NThBOworICAgIGludCBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODI7CisgICAgaW50IEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFNDsKKyAgICBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkxOworICAgIGludCBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTQ7CisgICAgaW50IEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MjsKKyAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgICAgICAgICAgID0gMHgwQjk1OworICAgIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgICAgICAgPSAweDBCOTY7CisgICAgaW50IEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkzOworICAgIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTg7CisgICAgaW50IEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFNzsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDY5OworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgPSAweDg4OUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICA9IDB4ODA5MjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgID0gMHg4MDg4OworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgPSAweDgwOEE7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICA9IDB4ODA4OTsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE4OworICAgIGludCBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgPSAweDg5OEY7CisgICAgaW50IEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgID0gMHg4ODk2OworICAgIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgPSAweDgwOEU7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdDOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0I7CisgICAgaW50IEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMjsKKyAgICBpbnQgR0xfV1JJVEVfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEI5OworCisgICAgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWJlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaTsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworCitwdWJsaWMgY2xhc3MgR0wxMUltcGwgaW1wbGVtZW50cyBHTDExIHsKKworICAgIC8vIFByaXZhdGUgYWNjZXNzb3JzIGZvciBuYXRpdmUgY29kZQorCisgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIHN0YXRpYyB7CisJX25hdGl2ZUNsYXNzSW5pdCgpOworICAgIH0KKworICAgIEJ1ZmZlciBfY29sb3JQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX25vcm1hbFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3ZlcnRleFBvaW50ZXIgPSBudWxsOworCisgICAgcHVibGljIEdMMTFJbXBsKCkgeworICAgIH0KKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTENIZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTU2ODZiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMQ0hlYWRlci5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaD4KKworI2RlZmluZSBfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIFwKKyAgICAgICAgKDo6YW5kcm9pZDo6T0dMRVNfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKQorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIGpjbGFzcyBuaW9BY2Nlc3NDbGFzczsKK3N0YXRpYyBqY2xhc3MgYnVmZmVyQ2xhc3M7CitzdGF0aWMgamNsYXNzIE9PTUVDbGFzczsKK3N0YXRpYyBqY2xhc3MgVU9FQ2xhc3M7CitzdGF0aWMgamNsYXNzIElBRUNsYXNzOworc3RhdGljIGpjbGFzcyBBSU9PQkVDbGFzczsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7CitzdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOworc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7CitzdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKK3N0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7CisKKy8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCisKK3ZvaWQKK25hdGl2ZUNsYXNzSW5pdEJ1ZmZlcihKTklFbnYgKl9lbnYpCit7CisgICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOworICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOworCisgICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOworICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOworCisgICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7CisgICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOworICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7CisKKyAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKKyAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKKyAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQorICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOworfQorCisKK3N0YXRpYyB2b2lkCituYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCit7CisgICAgbmF0aXZlQ2xhc3NJbml0QnVmZmVyKF9lbnYpOworCisgICAgamNsYXNzIElBRUNsYXNzTG9jYWwgPQorICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICBqY2xhc3MgT09NRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIpOworICAgIGpjbGFzcyBVT0VDbGFzc0xvY2FsID0KKyAgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgamNsYXNzIEFJT09CRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisKKyAgICBJQUVDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihJQUVDbGFzc0xvY2FsKTsKKyAgICBPT01FQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoT09NRUNsYXNzTG9jYWwpOworICAgIFVPRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKFVPRUNsYXNzTG9jYWwpOworICAgIEFJT09CRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKEFJT09CRUNsYXNzTG9jYWwpOworfQorCitzdGF0aWMgdm9pZCAqCitnZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKK3sKKyAgICBqaW50IHBvc2l0aW9uOworICAgIGppbnQgbGltaXQ7CisgICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OworICAgIGpsb25nIHBvaW50ZXI7CisgICAgamludCBvZmZzZXQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKKyAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7CisgICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKKyAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7CisgICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKKyAgICBpZiAocG9pbnRlciAhPSAwTCkgeworICAgICAgICAqYXJyYXkgPSBOVUxMOworICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7CisgICAgfQorICAgIAorICAgICphcnJheSA9IChqYXJyYXkpIF9lbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlQXJyYXlJRCwgYnVmZmVyKTsKKyAgICBvZmZzZXQgPSBfZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQsIGJ1ZmZlcik7CisgICAgZGF0YSA9IF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKmFycmF5LCAoamJvb2xlYW4gKikgMCk7CisgICAgCisgICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKK30KKworCitzdGF0aWMgdm9pZAorcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKK3sKKyAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKKwkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3OGYzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjIgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTCB7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzYTQxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsCkBAIC0wLDAgKzEsNDggQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMEV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dGVuc2lvblBhY2s7CisKK3B1YmxpYyBjbGFzcyBHTEltcGwgaW1wbGVtZW50cyBHTDEwLCBHTDEwRXh0LCBHTDExLCBHTDExRXh0LCBHTDExRXh0ZW5zaW9uUGFjayB7CisKKyAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeworCV9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICB9CisKKyAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBHTEltcGwoKSB7CisgICAgfQorCisgICAgIHB1YmxpYyB2b2lkIGdsR2V0UG9pbnRlcnYoaW50IHBuYW1lLCBqYXZhLm5pby5CdWZmZXJbXSBwYXJhbXMpIHsKKyAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2xHZXRQb2ludGVydiIpOworICAgICB9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisvKiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApICovDQoranN0cmluZw0KK2FuZHJvaWRfZ2xHZXRTdHJpbmcNCisgIChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbmFtZSkgew0KKyAgICBjb25zdCBjaGFyICogY2hhcnMgPSAoY29uc3QgY2hhciAqKWdsR2V0U3RyaW5nKChHTGVudW0pbmFtZSk7DQorICAgIGpzdHJpbmcgb3V0cHV0ID0gX2Vudi0+TmV3U3RyaW5nVVRGKGNoYXJzKTsNCisgICAgcmV0dXJuIG91dHB1dDsNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThmYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYKQEAgLTAsMCArMSw0IEBACisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThmYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYKQEAgLTAsMCArMSw0IEBACisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ODgxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwKQEAgLTAsMCArMSwxNiBAQAorICAgIC8vIEMgZnVuY3Rpb24gY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQ0KKw0KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBfZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApOw0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKSB7DQorICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWU7DQorICAgICAgICByZXR1cm5WYWx1ZSA9IF9nbEdldFN0cmluZygNCisgICAgICAgICAgICBuYW1lDQorICAgICAgICApOw0KKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KKyAgICB9DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MTg3YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcKQEAgLTAsMCArMSBAQAoreyJfZ2xHZXRTdHJpbmciLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKikgYW5kcm9pZF9nbEdldFN0cmluZyB9LA0K