LypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgovLwovLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCi8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAovLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgovLwovLwovLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50Ci8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KLy8KLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgovLwovLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi8vCi8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAovLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgovLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi8vCi8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAovLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAovLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCi8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAovLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOwovLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAovLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCi8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgovLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi8vCi8vTSovCgojaWZuZGVmIF9fQ1ZBVVhfX0hfXwojZGVmaW5lIF9fQ1ZBVVhfX0hfXwoKI2luY2x1ZGUgImN2LmgiCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKQ1ZBUEkoQ3ZTZXEqKSBjdlNlZ21lbnRJbWFnZSggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNhbm55X3RocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGZmaWxsX3RocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbiBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBpbnQgKENWX0NERUNMICogQ3ZDYWxsYmFjaykoaW50IGluZGV4LCB2b2lkKiBidWZmZXIsIHZvaWQqIHVzZXJfZGF0YSk7CnR5cGVkZWYgdW5pb24KewogICAgQ3ZDYWxsYmFjayBjYWxsYmFjazsKICAgIHZvaWQqIGRhdGE7Cn0KQ3ZJbnB1dDsKCiNkZWZpbmUgQ1ZfRUlHT0JKX05PX0NBTExCQUNLICAgICAwCiNkZWZpbmUgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLICAxCiNkZWZpbmUgQ1ZfRUlHT0JKX09VVFBVVF9DQUxMQkFDSyAyCiNkZWZpbmUgQ1ZfRUlHT0JKX0JPVEhfQ0FMTEJBQ0sgICAzCgovKiBDYWxjdWxhdGVzIGNvdmFyaWF0aW9uIG1hdHJpeCBvZiBhIHNldCBvZiBhcnJheXMgKi8KQ1ZBUEkodm9pZCkgIGN2Q2FsY0NvdmFyTWF0cml4RXgoIGludCBuT2JqZWN0cywgdm9pZCogaW5wdXQsIGludCBpb0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvQnVmU2l6ZSwgdWNoYXIqIGJ1ZmZlciwgdm9pZCogdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSogYXZnLCBmbG9hdCogY292YXJNYXRyaXggKTsKCi8qIENhbGN1bGF0ZXMgZWlnZW4gdmFsdWVzIGFuZCB2ZWN0b3JzIG9mIGNvdmFyaWF0aW9uIG1hdHJpeCBvZiBhIHNldCBvZgogICBhcnJheXMgKi8KQ1ZBUEkodm9pZCkgIGN2Q2FsY0VpZ2VuT2JqZWN0cyggaW50IG5PYmplY3RzLCB2b2lkKiBpbnB1dCwgdm9pZCogb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9GbGFncywgaW50IGlvQnVmU2l6ZSwgdm9pZCogdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhKiBjYWxjTGltaXQsIElwbEltYWdlKiBhdmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBlaWdWYWxzICk7CgovKiBDYWxjdWxhdGVzIGRvdCBwcm9kdWN0IChvYmogLSBhdmcpICogZWlnT2JqIChpLmUuIHByb2plY3RzIGltYWdlIHRvIGVpZ2VuIHZlY3RvcikgKi8KQ1ZBUEkoZG91YmxlKSAgY3ZDYWxjRGVjb21wQ29lZmYoIElwbEltYWdlKiBvYmosIElwbEltYWdlKiBlaWdPYmosIElwbEltYWdlKiBhdmcgKTsKCi8qIFByb2plY3RzIGltYWdlIHRvIGVpZ2VuIHNwYWNlIChmaW5kcyBhbGwgZGVjb21wb3Npb24gY29lZmZpY2llbnRzICovCkNWQVBJKHZvaWQpICBjdkVpZ2VuRGVjb21wb3NpdGUoIElwbEltYWdlKiBvYmosIGludCBuRWlnT2Jqcywgdm9pZCogZWlnSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb0ZsYWdzLCB2b2lkKiB1c2VyRGF0YSwgSXBsSW1hZ2UqIGF2ZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGNvZWZmcyApOwoKLyogUHJvamVjdHMgb3JpZ2luYWwgb2JqZWN0cyB1c2VkIHRvIGNhbGN1bGF0ZSBlaWdlbiBzcGFjZSBiYXNpcyB0byB0aGF0IHNwYWNlICovCkNWQVBJKHZvaWQpICBjdkVpZ2VuUHJvamVjdGlvbiggdm9pZCogZWlnSW5wdXQsIGludCBuRWlnT2JqcywgaW50IGlvRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlckRhdGEsIGZsb2F0KiBjb2VmZnMsIElwbEltYWdlKiBhdmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqIHByb2ogKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUQvMkQgSE1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdCBDdkltZ09ic0luZm8KewogICAgaW50IG9ic194OwogICAgaW50IG9ic195OwogICAgaW50IG9ic19zaXplOwogICAgZmxvYXQqIG9iczsvL2NvbnNlcXV0aXZlIG9ic2VydmF0aW9ucwoKICAgIGludCogc3RhdGU7LyogYXJyIG9mIHBhaXJzIHN1cGVyc3RhdGUvc3RhdGUgdG8gd2hpY2ggb2JzZXJ2YXRpb24gYmVsb25nICovCiAgICBpbnQqIG1peDsgIC8qIG51bWJlciBvZiBtaXh0dXJlIHRvIHdoaWNoIG9ic2VydmF0aW9uIGJlbG9uZyAqLwoKfQpDdkltZ09ic0luZm87LypzdHJ1Y3QgZm9yIDEgaW1hZ2UqLwoKdHlwZWRlZiBDdkltZ09ic0luZm8gQ3YxRE9ic0luZm87Cgp0eXBlZGVmIHN0cnVjdCBDdkVITU1TdGF0ZQp7CiAgICBpbnQgbnVtX21peDsgICAgICAgIC8qbnVtYmVyIG9mIG1peHR1cmVzIGluIHRoaXMgc3RhdGUqLwogICAgZmxvYXQqIG11OyAgICAgICAgICAvKm1lYW4gdmVjdG9ycyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbWl4dHVyZSovCiAgICBmbG9hdCogaW52X3ZhcjsgICAgIC8qIHNxdWFyZSByb290IG9mIGludmVyc2VkIHZhcmlhbmNlcyBjb3JyZXNwLiB0byBlYWNoIG1peHR1cmUqLwogICAgZmxvYXQqIGxvZ192YXJfdmFsOyAvKiBzdW0gb2YgMC41IChMTjJQSSArIGxuKHZhcmlhbmNlW2ldKSApIGZvciBpPTEsbiAqLwogICAgZmxvYXQqIHdlaWdodDsgICAgICAvKmFycmF5IG9mIG1peHR1cmUgd2VpZ2h0cy4gU3VtbSBvZiBhbGwgd2VpZ2h0cyBpbiBzdGF0ZSBpcyAxLiAqLwoKfQpDdkVITU1TdGF0ZTsKCnR5cGVkZWYgc3RydWN0IEN2RUhNTQp7CiAgICBpbnQgbGV2ZWw7IC8qIDAgLSBsb3dlc3QoaS5lIGl0cyBzdGF0ZXMgYXJlIHJlYWwgc3RhdGVzKSwgLi4uLi4gKi8KICAgIGludCBudW1fc3RhdGVzOyAvKiBudW1iZXIgb2YgSE1NIHN0YXRlcyAqLwogICAgZmxvYXQqICB0cmFuc1A7Lyp0cmFuc2l0aW9uIHByb2JhYi4gbWF0cmljZXMgZm9yIHN0YXRlcyAqLwogICAgZmxvYXQqKiBvYnNQcm9iOyAvKiBpZiBsZXZlbCA9PSAwIC0gYXJyYXkgb2YgYnJvYiBtYXRyaWNlcyBjb3JyZXNwb25kaW5nIHRvIGhtbQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbCA9PSAxIC0gbWFydGl4IG9mIG1hdHJpY2VzICovCiAgICB1bmlvbgogICAgewogICAgICAgIEN2RUhNTVN0YXRlKiBzdGF0ZTsgLyogaWYgbGV2ZWwgPT0gMCBwb2ludHMgdG8gcmVhbCBzdGF0ZXMgYXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgLSBwb2ludHMgdG8gZW1iZWRkZWQgaG1tcyAqLwogICAgICAgIHN0cnVjdCBDdkVITU0qIGVobW07IC8qIHBvaW50ZXIgdG8gYW4gZW1iZWRkZWQgbW9kZWwgb3IgTlVMTCwgaWYgaXQgaXMgYSBsZWFmICovCiAgICB9IHU7Cgp9CkN2RUhNTTsKCi8qQ1ZBUEkoaW50KSAgaWN2Q3JlYXRlMURITU0oIEN2RUhNTSoqIHRoaXNfaG1tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZV9udW1iZXIsIGludCogbnVtX21peCwgaW50IG9ic19zaXplICk7CgpDVkFQSShpbnQpICBpY3ZSZWxlYXNlMURITU0oIEN2RUhNTSoqIHBobW0gKTsKCkNWQVBJKGludCkgIGljdlVuaWZvcm0xRFNlZ20oIEN2MURPYnNJbmZvKiBvYnNfaW5mbywgQ3ZFSE1NKiBobW0gKTsKCkNWQVBJKGludCkgIGljdkluaXQxRE1peFNlZ20oIEN2MURPYnNJbmZvKiogb2JzX2luZm9fYXJyYXksIGludCBudW1faW1nLCBDdkVITU0qIGhtbSk7CgpDVkFQSShpbnQpICBpY3ZFc3RpbWF0ZTFESE1NU3RhdGVQYXJhbXMoIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0pOwoKQ1ZBUEkoaW50KSAgaWN2RXN0aW1hdGUxRE9ic1Byb2IoIEN2SW1nT2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogaG1tICk7CgpDVkFQSShpbnQpICBpY3ZFc3RpbWF0ZTFEVHJhbnNQcm9iKCBDdjFET2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9zZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkVITU0qIGhtbSApOwoKQ1ZBUEkoZmxvYXQpICBpY3ZWaXRlcmJpKCBDdjFET2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogaG1tKTsKCkNWQVBJKGludCkgIGljdjFETWl4U2VnbUwyKCBDdkltZ09ic0luZm8qKiBvYnNfaW5mb19hcnJheSwgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICk7Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbWJlZGRlZCBITU1zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDcmVhdGVzIDJEIEhNTSAqLwpDVkFQSShDdkVITU0qKSAgY3ZDcmVhdGUyREhNTSggaW50KiBzdGF0ZU51bWJlciwgaW50KiBudW1NaXgsIGludCBvYnNTaXplICk7CgovKiBSZWxlYXNlcyBITU0gKi8KQ1ZBUEkodm9pZCkgIGN2UmVsZWFzZTJESE1NKCBDdkVITU0qKiBobW0gKTsKCiNkZWZpbmUgQ1ZfQ09VTlRfT0JTKHJvaSwgd2luLCBkZWx0YSwgbnVtT2JzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIChudW1PYnMpLT53aWR0aCAgPSgocm9pKS0+d2lkdGggIC0od2luKS0+d2lkdGggICsoZGVsdGEpLT53aWR0aCkvKGRlbHRhKS0+d2lkdGg7ICBcCiAgIChudW1PYnMpLT5oZWlnaHQgPSgocm9pKS0+aGVpZ2h0IC0od2luKS0+aGVpZ2h0ICsoZGVsdGEpLT5oZWlnaHQpLyhkZWx0YSktPmhlaWdodDtcCn0KCi8qIENyZWF0ZXMgc3RvcmFnZSBmb3Igb2JzZXJ2YXRpb24gdmVjdG9ycyAqLwpDVkFQSShDdkltZ09ic0luZm8qKSAgY3ZDcmVhdGVPYnNJbmZvKCBDdlNpemUgbnVtT2JzLCBpbnQgb2JzU2l6ZSApOwoKLyogUmVsZWFzZXMgc3RvcmFnZSBmb3Igb2JzZXJ2YXRpb24gdmVjdG9ycyAqLwpDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlT2JzSW5mbyggQ3ZJbWdPYnNJbmZvKiogb2JzX2luZm8gKTsKCgovKiBUaGUgZnVuY3Rpb24gdGFrZXMgYW4gaW1hZ2Ugb24gaW5wdXQgYW5kIGFuZCByZXR1cm5zIHRoZSBzZXF1bmNlIG9mIG9ic2VydmF0aW9ucwogICB0byBiZSB1c2VkIHdpdGggYW4gZW1iZWRkZWQgSE1NOyBFYWNoIG9ic2VydmF0aW9uIGlzIHRvcC1sZWZ0IGJsb2NrIG9mIERDVAogICBjb2VmZmljaWVudCBtYXRyaXggKi8KQ1ZBUEkodm9pZCkgIGN2SW1nVG9PYnNfRENUKCBjb25zdCBDdkFyciogYXJyLCBmbG9hdCogb2JzLCBDdlNpemUgZGN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgb2JzU2l6ZSwgQ3ZTaXplIGRlbHRhICk7CgoKLyogVW5pZm9ybWx5IHNlZ21lbnRzIGFsbCBvYnNlcnZhdGlvbiB2ZWN0b3JzIGV4dHJhY3RlZCBmcm9tIGltYWdlICovCkNWQVBJKHZvaWQpICBjdlVuaWZvcm1JbWdTZWdtKCBDdkltZ09ic0luZm8qIG9ic19pbmZvLCBDdkVITU0qIGVobW0gKTsKCi8qIERvZXMgbWl4dHVyZSBzZWdtZW50YXRpb24gb2YgdGhlIHN0YXRlcyBvZiBlbWJlZGRlZCBITU0gKi8KQ1ZBUEkodm9pZCkgIGN2SW5pdE1peFNlZ20oIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICk7CgovKiBGdW5jdGlvbiBjYWxjdWxhdGVzIG1lYW5zLCB2YXJpYW5jZXMsIHdlaWdodHMgb2YgZXZlcnkgR2F1c3NpYW4gbWl4dHVyZQogICBvZiBldmVyeSBsb3ctbGV2ZWwgc3RhdGUgb2YgZW1iZWRkZWQgSE1NICovCkNWQVBJKHZvaWQpICBjdkVzdGltYXRlSE1NU3RhdGVQYXJhbXMoIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0gKTsKCi8qIEZ1bmN0aW9uIGNvbXB1dGVzIHRyYW5zaXRpb24gcHJvYmFiaWxpdHkgbWF0cmljZXMgb2YgZW1iZWRkZWQgSE1NCiAgIGdpdmVuIG9ic2VydmF0aW9ucyBzZWdtZW50YXRpb24gKi8KQ1ZBUEkodm9pZCkgIGN2RXN0aW1hdGVUcmFuc1Byb2IoIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICk7CgovKiBGdW5jdGlvbiBjb21wdXRlcyBwcm9iYWJpbGl0aWVzIG9mIGFwcGVhcmluZyBvYnNlcnZhdGlvbnMgYXQgYW55IHN0YXRlCiAgIChpLmUuIGNvbXB1dGVzIFAob2JzfHN0YXRlKSBmb3IgZXZlcnkgcGFpcihvYnMsc3RhdGUpKSAqLwpDVkFQSSh2b2lkKSAgY3ZFc3RpbWF0ZU9ic1Byb2IoIEN2SW1nT2JzSW5mbyogb2JzX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZFSE1NKiBobW0gKTsKCi8qIFJ1bnMgVml0ZXJiaSBhbGdvcml0aG0gZm9yIGVtYmVkZGVkIEhNTSAqLwpDVkFQSShmbG9hdCkgIGN2RVZpdGVyYmkoIEN2SW1nT2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogaG1tICk7CgoKLyogRnVuY3Rpb24gY2x1c3RlcnMgb2JzZXJ2YXRpb24gdmVjdG9ycyBmcm9tIHNldmVyYWwgaW1hZ2VzCiAgIGdpdmVuIG9ic2VydmF0aW9ucyBzZWdtZW50YXRpb24uCiAgIEV1Y2xpZGVhbiBkaXN0YW5jZSB1c2VkIGZvciBjbHVzdGVyaW5nIHZlY3RvcnMuCiAgIENlbnRlcnMgb2YgY2x1c3RlcnMgYXJlIGdpdmVuIG1lYW5zIG9mIGV2ZXJ5IG1peHR1cmUgKi8KQ1ZBUEkodm9pZCkgIGN2TWl4U2VnbUwyKCBDdkltZ09ic0luZm8qKiBvYnNfaW5mb19hcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0gKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgQSBmZXcgZnVuY3Rpb25zIGZyb20gb2xkIHN0ZXJlbyBnZXN0dXJlIHJlY29nbml0aW9uIGRlbW9zaW9ucyAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDcmVhdGVzIGhhbmQgbWFzayBpbWFnZSBnaXZlbiBzZXZlcmFsIHBvaW50cyBvbiB0aGUgaGFuZCAqLwpDVkFQSSh2b2lkKSAgY3ZDcmVhdGVIYW5kTWFzayggQ3ZTZXEqIGhhbmRfcG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlICppbWdfbWFzaywgQ3ZSZWN0ICpyb2kpOwoKLyogRmluZHMgaGFuZCByZWdpb24gaW4gcmFuZ2UgaW1hZ2UgZGF0YSAqLwpDVkFQSSh2b2lkKSAgY3ZGaW5kSGFuZFJlZ2lvbiAoQ3ZQb2ludDNEMzJmKiBwb2ludHMsIGludCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSogaW5kZXhzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsaW5lLCBDdlNpemUyRDMyZiBzaXplLCBpbnQgZmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0QzMmYqIGNlbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIEN2U2VxICoqbnVtYmVycyk7CgovKiBGaW5kcyBoYW5kIHJlZ2lvbiBpbiByYW5nZSBpbWFnZSBkYXRhIChhZHZhbmNlZCB2ZXJzaW9uKSAqLwpDVkFQSSh2b2lkKSAgY3ZGaW5kSGFuZFJlZ2lvbkEoIEN2UG9pbnQzRDMyZiogcG9pbnRzLCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIGluZGV4cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGluZSwgQ3ZTaXplMkQzMmYgc2l6ZSwgaW50IGpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiogY2VudGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTZXEgKipudW1iZXJzKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBvcGVyYXRpb25zIG9uIFN1YmRpdmlzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLyBwYWludHMgdm9yb25vaSBkaWFncmFtOiBqdXN0IGRlbW8gZnVuY3Rpb24KQ1ZBUEkodm9pZCkgIGljdkRyYXdNb3NhaWMoIEN2U3ViZGl2MkQqIHN1YmRpdiwgSXBsSW1hZ2UqIHNyYywgSXBsSW1hZ2UqIGRzdCApOwoKLy8gY2hlY2tzIHBsYW5hciBzdWJkaXZpc2lvbiBmb3IgY29ycmVjdG5lc3MuIEl0IGlzIG5vdCBhbiBhYnNvbHV0ZSBjaGVjaywKLy8gYnV0IGl0IHZlcmlmaWVzIHNvbWUgcmVsYXRpb25zIGJldHdlZW4gcXVhZC1lZGdlcwpDVkFQSShpbnQpICAgaWN2U3ViZGl2MkRDaGVjayggQ3ZTdWJkaXYyRCogc3ViZGl2ICk7CgovLyByZXR1cm5zIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gMkQgcG9pbnRzIHdpdGggZmxvYXRpbmctcG9pbnQgY29vcmRpbmF0ZXMuCkNWX0lOTElORSBkb3VibGUgaWN2U3FEaXN0MkQzMmYoIEN2UG9pbnQyRDMyZiBwdDEsIEN2UG9pbnQyRDMyZiBwdDIgKQp7CiAgICBkb3VibGUgZHggPSBwdDEueCAtIHB0Mi54OwogICAgZG91YmxlIGR5ID0gcHQxLnkgLSBwdDIueTsKCiAgICByZXR1cm4gZHgqZHggKyBkeSpkeTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9yZSBvcGVyYXRpb25zIG9uIHNlcXVlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIENWX0NVUlJFTlRfSU5UKCByZWFkZXIgKSAoKigoaW50ICopKHJlYWRlcikucHRyKSkKI2RlZmluZSBDVl9QUkVWX0lOVCggcmVhZGVyICkgKCooKGludCAqKShyZWFkZXIpLnByZXZfZWxlbSkpCgojZGVmaW5lICBDVl9HUkFQSF9XRUlHSFRFRF9WRVJURVhfRklFTERTKCkgQ1ZfR1JBUEhfVkVSVEVYX0ZJRUxEUygpXAogICAgZmxvYXQgd2VpZ2h0OwoKI2RlZmluZSAgQ1ZfR1JBUEhfV0VJR0hURURfRURHRV9GSUVMRFMoKSBDVl9HUkFQSF9FREdFX0ZJRUxEUygpCgp0eXBlZGVmIHN0cnVjdCBDdkdyYXBoV2VpZ2h0ZWRWdHgKewogICAgQ1ZfR1JBUEhfV0VJR0hURURfVkVSVEVYX0ZJRUxEUygpCn0KQ3ZHcmFwaFdlaWdodGVkVnR4OwoKdHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaFdlaWdodGVkRWRnZQp7CiAgICBDVl9HUkFQSF9XRUlHSFRFRF9FREdFX0ZJRUxEUygpCn0KQ3ZHcmFwaFdlaWdodGVkRWRnZTsKCnR5cGVkZWYgZW51bSBDdkdyYXBoV2VpZ2h0VHlwZQp7CiAgICBDVl9OT1RfV0VJR0hURUQsCiAgICBDVl9XRUlHSFRFRF9WVFgsCiAgICBDVl9XRUlHSFRFRF9FREdFLAogICAgQ1ZfV0VJR0hURURfQUxMCn0gQ3ZHcmFwaFdlaWdodFR5cGU7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqU3RlcmVvIGNvcnJlc3BvbmRlbmNlKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgc3RydWN0IEN2Q2xpcXVlRmluZGVyCnsgICAKICAgIEN2R3JhcGgqIGdyYXBoOwogICAgaW50KiogICAgYWRqX21hdHI7CiAgICBpbnQgTjsgLy9ncmFwaCBzaXplCgogICAgLy8gc3RhY2tzLCBjb3VudGVycyBldGMvCiAgICBpbnQgazsgLy9zdGFjayBzaXplCiAgICBpbnQqIGN1cnJlbnRfY29tcDsKICAgIGludCoqIEFsbDsKICAgIAogICAgaW50KiBuZTsKICAgIGludCogY2U7CiAgICBpbnQqIGZpeHA7IC8vbm9kZSB3aXRoIG1pbmltYWwgZGlzY29ubmVjdGlvbnMKICAgIGludCogbm9kOwogICAgaW50KiBzOyAvL2ZvciBzZWxlY3RlZCBjYW5kaWRhdGUKICAgIGludCBzdGF0dXM7CiAgICBpbnQgYmVzdF9zY29yZTsKICAgIGludCB3ZWlnaHRlZDsKICAgIGludCB3ZWlnaHRlZF9lZGdlczsgICAgCiAgICBmbG9hdCBiZXN0X3dlaWdodDsKICAgIGZsb2F0KiBlZGdlX3dlaWdodHM7CiAgICBmbG9hdCogdmVydGV4X3dlaWdodHM7CiAgICBmbG9hdCogY3VyX3dlaWdodDsKICAgIGZsb2F0KiBjYW5kX3dlaWdodDsKCn0gQ3ZDbGlxdWVGaW5kZXI7CgojZGVmaW5lIENMSVFVRV9USU1FX09GRiAyCiNkZWZpbmUgQ0xJUVVFX0ZPVU5EIDEKI2RlZmluZSBDTElRVUVfRU5EICAgMAoKLypDVkFQSSh2b2lkKSBjdlN0YXJ0RmluZENsaXF1ZXMoIEN2R3JhcGgqIGdyYXBoLCBDdkNsaXF1ZUZpbmRlciogZmluZGVyLCBpbnQgcmV2ZXJzZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodGVkIENWX0RFRkFVTFQoMCksICBpbnQgd2VpZ2h0ZWRfZWRnZXMgQ1ZfREVGQVVMVCgwKSk7CkNWQVBJKGludCkgY3ZGaW5kTmV4dE1heGltYWxDbGlxdWUoIEN2Q2xpcXVlRmluZGVyKiBmaW5kZXIsIGludCogY2xvY2tfcmVzdCBDVl9ERUZBVUxUKDApICk7IApDVkFQSSh2b2lkKSBjdkVuZEZpbmRDbGlxdWVzKCBDdkNsaXF1ZUZpbmRlciogZmluZGVyICk7CgpDVkFQSSh2b2lkKSBjdkJyb25LZXJib3NjaCggQ3ZHcmFwaCogZ3JhcGggKTsqLwoKCi8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyAgICBOYW1lOiAgICBjdlN1YmdyYXBoV2VpZ2h0Ci8vICAgIFB1cnBvc2U6IGZpbmRzIHdlaWdodCBvZiBzdWJncmFwaCBpbiBhIGdyYXBoCi8vICAgIENvbnRleHQ6Ci8vICAgIFBhcmFtZXRlcnM6Ci8vICAgICAgZ3JhcGggLSBpbnB1dCBncmFwaC4KLy8gICAgICBzdWJncmFwaCAtIHNlcXVlbmNlIG9mIHBhaXJ3aXNlIGRpZmZlcmVudCBpbnRzLiAgVGhlc2UgYXJlIGluZGljZXMgb2YgdmVydGljZXMgb2Ygc3ViZ3JhcGguCi8vICAgICAgd2VpZ2h0X3R5cGUgLSBkZXNjcmliZXMgdGhlIHdheSB3ZSBtZWFzdXJlIHdlaWdodC4KLy8gICAgICAgICAgICBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLy8gICAgICAgICAgICBDVl9OT1RfV0VJR0hURUQgLSB3ZWlnaHQgb2YgYSBjbGlxdWUgaXMgc2ltcGx5IGl0cyBzaXplCi8vICAgICAgICAgICAgQ1ZfV0VJR0hURURfVlRYIC0gd2VpZ2h0IG9mIGEgY2xpcXVlIGlzIHRoZSBzdW0gb2Ygd2VpZ2h0cyBvZiBpdHMgdmVydGljZXMKLy8gICAgICAgICAgICBDVl9XRUlHSFRFRF9FREdFIC0gdGhlIHNhbWUgYnV0IGVkZ2VzCi8vICAgICAgICAgICAgQ1ZfV0VJR0hURURfQUxMIC0gdGhlIHNhbWUgYnV0IGJvdGggZWRnZXMgYW5kIHZlcnRpY2VzCi8vICAgICAgd2VpZ2h0X3Z0eCAtIG9wdGlvbmFsIHZlY3RvciBvZiBmbG9hdHMsIHdpdGggc2l6ZSA9IGdyYXBoLT50b3RhbC4KLy8gICAgICAgICAgICBJZiB3ZWlnaHRfdHlwZSBpcyBlaXRoZXIgQ1ZfV0VJR0hURURfVlRYIG9yIENWX1dFSUdIVEVEX0FMTAovLyAgICAgICAgICAgIHdlaWdodHMgb2YgdmVydGljZXMgbXVzdCBiZSBwcm92aWRlZC4gIElmIHdlaWdodF92dHggbm90IHplcm8KLy8gICAgICAgICAgICB0aGVzZSB3ZWlnaHRzIGNvbnNpZGVyZWQgdG8gYmUgaGVyZSwgb3RoZXJ3aXNlIGZ1bmN0aW9uIGFzc3VtZXMKLy8gICAgICAgICAgICB0aGF0IHZlcnRpY2VzIG9mIGdyYXBoIGFyZSBpbmhlcml0ZWQgZnJvbSBDdkdyYXBoV2VpZ2h0ZWRWdHguCi8vICAgICAgd2VpZ2h0X2VkZ2UgLSBvcHRpb25hbCBtYXRyaXggb2YgZmxvYXRzLCBvZiB3aWR0aCBhbmQgaGVpZ2h0ID0gZ3JhcGgtPnRvdGFsLgovLyAgICAgICAgICAgIElmIHdlaWdodF90eXBlIGlzIGVpdGhlciBDVl9XRUlHSFRFRF9FREdFIG9yIENWX1dFSUdIVEVEX0FMTAovLyAgICAgICAgICAgIHdlaWdodHMgb2YgZWRnZXMgb3VnaHQgdG8gYmUgc3VwcGxpZWQuICBJZiB3ZWlnaHRfZWRnZSBpcyBub3QgemVybwovLyAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRzIHRoZW0gaGVyZSwgb3RoZXJ3aXNlIGZ1bmN0aW9uIGV4cGVjdHMKLy8gICAgICAgICAgICBlZGdlcyBvZiBncmFwaCB0byBiZSBpbmhlcml0ZWQgZnJvbSBDdkdyYXBoV2VpZ2h0ZWRFZGdlLgovLyAgICAgICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCB6ZXJvIHN0cnVjdHVyZSBvZiB0aGUgZ3JhcGggaXMgZGV0ZXJtaW5lZCBmcm9tIG1hdHJpeAovLyAgICAgICAgICAgIHJhdGhlciB0aGFuIGZyb20gQ3ZHcmFwaEVkZ2Uncy4gIEluIHBhcnRpY3VsYXIsIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8KLy8gICAgICAgICAgICBhYnNlbnQgZWRnZXMgc2hvdWxkIGJlIHplcm8uCi8vICAgIFJldHVybnM6Ci8vICAgICAgd2VpZ2h0IG9mIHN1YmdyYXBoLgovLyAgICBOb3RlczoKLy9GKi8KLypDVkFQSShmbG9hdCkgY3ZTdWJncmFwaFdlaWdodCggQ3ZHcmFwaCAqZ3JhcGgsIEN2U2VxICpzdWJncmFwaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhXZWlnaHRUeXBlIHdlaWdodF90eXBlIENWX0RFRkFVTFQoQ1ZfTk9UX1dFSUdIVEVEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiB3ZWlnaHRfdnR4IENWX0RFRkFVTFQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgd2VpZ2h0X2VkZ2UgQ1ZfREVGQVVMVCgwKSApOyovCgoKLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vICAgIE5hbWU6ICAgIGN2RmluZENsaXF1ZUV4Ci8vICAgIFB1cnBvc2U6IHRyaWVzIHRvIGZpbmQgY2xpcXVlIHdpdGggbWF4aW11bSBwb3NzaWJsZSB3ZWlnaHQgaW4gYSBncmFwaAovLyAgICBDb250ZXh0OgovLyAgICBQYXJhbWV0ZXJzOgovLyAgICAgIGdyYXBoIC0gaW5wdXQgZ3JhcGguCi8vICAgICAgc3RvcmFnZSAtIG1lbW9yeSBzdG9yYWdlIHRvIGJlIHVzZWQgYnkgdGhlIHJlc3VsdC4KLy8gICAgICBpc19jb21wbGVtZW50YXJ5IC0gb3B0aW9uYWwgZmxhZyBzaG93aW5nIHdoZXRoZXIgZnVuY3Rpb24gc2hvdWxkIHNlZWsgZm9yIGNsaXF1ZQovLyAgICAgICAgICAgIGluIGNvbXBsZW1lbnRhcnkgZ3JhcGguCi8vICAgICAgd2VpZ2h0X3R5cGUgLSBkZXNjcmliZXMgb3VyIG5vdGlvbiBhYm91dCB3ZWlnaHQuCi8vICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci8vICAgICAgICAgICAgQ1ZfTk9UX1dFSUdIVEVEIC0gd2VpZ2h0IG9mIGEgY2xpcXVlIGlzIHNpbXBseSBpdHMgc2l6ZQovLyAgICAgICAgICAgIENWX1dFSUdIVEVEX1ZUWCAtIHdlaWdodCBvZiBhIGNsaXF1ZSBpcyB0aGUgc3VtIG9mIHdlaWdodHMgb2YgaXRzIHZlcnRpY2VzCi8vICAgICAgICAgICAgQ1ZfV0VJR0hURURfRURHRSAtIHRoZSBzYW1lIGJ1dCBlZGdlcwovLyAgICAgICAgICAgIENWX1dFSUdIVEVEX0FMTCAtIHRoZSBzYW1lIGJ1dCBib3RoIGVkZ2VzIGFuZCB2ZXJ0aWNlcwovLyAgICAgIHdlaWdodF92dHggLSBvcHRpb25hbCB2ZWN0b3Igb2YgZmxvYXRzLCB3aXRoIHNpemUgPSBncmFwaC0+dG90YWwuCi8vICAgICAgICAgICAgSWYgd2VpZ2h0X3R5cGUgaXMgZWl0aGVyIENWX1dFSUdIVEVEX1ZUWCBvciBDVl9XRUlHSFRFRF9BTEwKLy8gICAgICAgICAgICB3ZWlnaHRzIG9mIHZlcnRpY2VzIG11c3QgYmUgcHJvdmlkZWQuICBJZiB3ZWlnaHRfdnR4IG5vdCB6ZXJvCi8vICAgICAgICAgICAgdGhlc2Ugd2VpZ2h0cyBjb25zaWRlcmVkIHRvIGJlIGhlcmUsIG90aGVyd2lzZSBmdW5jdGlvbiBhc3N1bWVzCi8vICAgICAgICAgICAgdGhhdCB2ZXJ0aWNlcyBvZiBncmFwaCBhcmUgaW5oZXJpdGVkIGZyb20gQ3ZHcmFwaFdlaWdodGVkVnR4LgovLyAgICAgIHdlaWdodF9lZGdlIC0gb3B0aW9uYWwgbWF0cml4IG9mIGZsb2F0cywgb2Ygd2lkdGggYW5kIGhlaWdodCA9IGdyYXBoLT50b3RhbC4KLy8gICAgICAgICAgICBJZiB3ZWlnaHRfdHlwZSBpcyBlaXRoZXIgQ1ZfV0VJR0hURURfRURHRSBvciBDVl9XRUlHSFRFRF9BTEwKLy8gICAgICAgICAgICB3ZWlnaHRzIG9mIGVkZ2VzIG91Z2h0IHRvIGJlIHN1cHBsaWVkLiAgSWYgd2VpZ2h0X2VkZ2UgaXMgbm90IHplcm8KLy8gICAgICAgICAgICBmdW5jdGlvbiBmaW5kcyB0aGVtIGhlcmUsIG90aGVyd2lzZSBmdW5jdGlvbiBleHBlY3RzCi8vICAgICAgICAgICAgZWRnZXMgb2YgZ3JhcGggdG8gYmUgaW5oZXJpdGVkIGZyb20gQ3ZHcmFwaFdlaWdodGVkRWRnZS4KLy8gICAgICAgICAgICBOb3RlIHRoYXQgaW4gY2FzZSBvZiBDVl9XRUlHSFRFRF9FREdFIG9yIENWX1dFSUdIVEVEX0FMTAovLyAgICAgICAgICAgIG5vbnplcm8gaXNfY29tcGxlbWVudGFyeSBpbXBsaWVzIG5vbnplcm8gd2VpZ2h0X2VkZ2UuCi8vICAgICAgc3RhcnRfY2xpcXVlIC0gb3B0aW9uYWwgc2VxdWVuY2Ugb2YgcGFpcndpc2UgZGlmZmVyZW50IGludHMuICBUaGV5IGFyZSBpbmRpY2VzIG9mCi8vICAgICAgICAgICAgdmVydGljZXMgdGhhdCBzaGFsbCBiZSBwcmVzZW50IGluIHRoZSBvdXRwdXQgY2xpcXVlLgovLyAgICAgIHN1YmdyYXBoX29mX2JhbiAtIG9wdGlvbmFsIHNlcXVlbmNlIG9mIChtYXliZSBlcXVhbCkgaW50cy4gIFRoZXkgYXJlIGluZGljZXMgb2YKLy8gICAgICAgICAgICB2ZXJ0aWNlcyB0aGF0IHNoYWxsIG5vdCBiZSBwcmVzZW50IGluIHRoZSBvdXRwdXQgY2xpcXVlLgovLyAgICAgIGNsaXF1ZV93ZWlnaHRfcHRyIC0gb3B0aW9uYWwgb3V0cHV0IHBhcmFtZXRlci4gIFdlaWdodCBvZiBmb3VuZCBjbGlxdWUgc3RvcmVkIGhlcmUuCi8vICAgICAgbnVtX2dlbmVyYXRpb25zIC0gb3B0aW9uYWwgbnVtYmVyIG9mIGdlbmVyYXRpb25zIGluIGV2b2x1dGlvbmFyeSBwYXJ0IG9mIGFsZ29yaXRobSwKLy8gICAgICAgICAgICB6ZXJvIGZvcmNlcyB0byByZXR1cm4gZmlyc3QgZm91bmQgY2xpcXVlLgovLyAgICAgIHF1YWxpdHkgLSBvcHRpb25hbCBwYXJhbWV0ZXIgZGV0ZXJtaW5pbmcgZGVncmVlIG9mIHJlcXVpcmVkIHF1YWxpdHkvc3BlZWQgdHJhZGVvZmYuCi8vICAgICAgICAgICAgTXVzdCBiZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDkuCi8vICAgICAgICAgICAgMCBpcyBmYXN0IGFuZCBkaXJ0eSwgOSBpcyBzbG93IGJ1dCBob3BlZnVsbHkgeWllbGRzIGdvb2QgY2xpcXVlLgovLyAgICBSZXR1cm5zOgovLyAgICAgIHNlcXVlbmNlIG9mIHBhaXJ3aXNlIGRpZmZlcmVudCBpbnRzLgovLyAgICAgIFRoZXNlIGFyZSBpbmRpY2VzIG9mIHZlcnRpY2VzIHRoYXQgZm9ybSBmb3VuZCBjbGlxdWUuCi8vICAgIE5vdGVzOgovLyAgICAgIGluIGNhc2VzIG9mIENWX1dFSUdIVEVEX0VER0UgYW5kIENWX1dFSUdIVEVEX0FMTCB3ZWlnaHRzIHNob3VsZCBiZSBub25uZWdhdGl2ZS4KLy8gICAgICBzdGFydF9jbGlxdWUgaGFzIGEgcHJpb3JpdHkgb3ZlciBzdWJncmFwaF9vZl9iYW4uCi8vRiovCi8qQ1ZBUEkoQ3ZTZXEqKSBjdkZpbmRDbGlxdWVFeCggQ3ZHcmFwaCAqZ3JhcGgsIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2NvbXBsZW1lbnRhcnkgQ1ZfREVGQVVMVCgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaFdlaWdodFR5cGUgd2VpZ2h0X3R5cGUgQ1ZfREVGQVVMVChDVl9OT1RfV0VJR0hURUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgd2VpZ2h0X3Z0eCBDVl9ERUZBVUxUKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgd2VpZ2h0X2VkZ2UgQ1ZfREVGQVVMVCgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEgKnN0YXJ0X2NsaXF1ZSBDVl9ERUZBVUxUKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSAqc3ViZ3JhcGhfb2ZfYmFuIENWX0RFRkFVTFQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjbGlxdWVfd2VpZ2h0X3B0ciBDVl9ERUZBVUxUKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2dlbmVyYXRpb25zIENWX0RFRkFVTFQoMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5IENWX0RFRkFVTFQoMikgKTsqLwoKCiNkZWZpbmUgQ1ZfVU5ERUZfU0NfUEFSQU0gICAgICAgICAxMjM0NSAvL2RlZmF1bHQgdmFsdWUgb2YgcGFyYW1ldGVycwoKI2RlZmluZSBDVl9JRFBfQklSQ0hGSUVMRF9QQVJBTTEgIDI1ICAgIAojZGVmaW5lIENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNMiAgNQojZGVmaW5lIENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNMyAgMTIKI2RlZmluZSBDVl9JRFBfQklSQ0hGSUVMRF9QQVJBTTQgIDE1CiNkZWZpbmUgQ1ZfSURQX0JJUkNIRklFTERfUEFSQU01ICAyNQoKCiNkZWZpbmUgIENWX0RJU1BBUklUWV9CSVJDSEZJRUxEICAwICAgIAoKCi8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyAgICBOYW1lOiAgICBjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZQovLyAgICBQdXJwb3NlOiBmaW5kIHN0ZXJlbyBjb3JyZXNwb25kZW5jZSBvbiBzdGVyZW8tcGFpcgovLyAgICBDb250ZXh0OgovLyAgICBQYXJhbWV0ZXJzOgovLyAgICAgIGxlZnRJbWFnZSAtIGxlZnQgaW1hZ2Ugb2Ygc3RlcmVvLXBhaXIgKGZvcm1hdCA4dUMxKS4KLy8gICAgICByaWdodEltYWdlIC0gcmlnaHQgaW1hZ2Ugb2Ygc3RlcmVvLXBhaXIgKGZvcm1hdCA4dUMxKS4KLy8gICBtb2RlIC0gbW9kZSBvZiBjb3JyZXNwb25kZW5jZSByZXRyaWV2YWwgKG5vdyBDVl9ESVNQQVJJVFlfQklSQ0hGSUVMRCBvbmx5KQovLyAgICAgIGRpc3BJbWFnZSAtIGRlc3RpbmF0aW9uIGRpc3Bhcml0eSBpbWFnZQovLyAgICAgIG1heERpc3Bhcml0eSAtIG1heGltYWwgZGlzcGFyaXR5IAovLyAgICAgIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01IC0gcGFyYW1ldGVycyBvZiBhbGdvcml0aG0KLy8gICAgUmV0dXJuczoKLy8gICAgTm90ZXM6Ci8vICAgICAgSW1hZ2VzIG11c3QgYmUgcmVjdGlmaWVkLgovLyAgICAgIEFsbCBpbWFnZXMgbXVzdCBoYXZlIGZvcm1hdCA4dUMxLgovL0YqLwpDVkFQSSh2b2lkKSAKY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2UoIAogICAgICAgICAgICAgICAgICAgY29uc3QgIEN2QXJyKiBsZWZ0SW1hZ2UsIGNvbnN0ICBDdkFyciogcmlnaHRJbWFnZSwKICAgICAgICAgICAgICAgICAgIGludCAgICAgbW9kZSwKICAgICAgICAgICAgICAgICAgIEN2QXJyKiAgZGlzcEltYWdlLAogICAgICAgICAgICAgICAgICAgaW50ICAgICBtYXhEaXNwYXJpdHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW0xIENWX0RFRkFVTFQoQ1ZfVU5ERUZfU0NfUEFSQU0pLCAKICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW0yIENWX0RFRkFVTFQoQ1ZfVU5ERUZfU0NfUEFSQU0pLCAKICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW0zIENWX0RFRkFVTFQoQ1ZfVU5ERUZfU0NfUEFSQU0pLCAKICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW00IENWX0RFRkFVTFQoQ1ZfVU5ERUZfU0NfUEFSQU0pLCAKICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW01IENWX0RFRkFVTFQoQ1ZfVU5ERUZfU0NfUEFSQU0pICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKiogRXBpbGluZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKi8KCgoKdHlwZWRlZiBzdHJ1Y3QgQ3ZTdGVyZW9MaW5lQ29lZmYKewogICAgZG91YmxlIFhjb2VmOwogICAgZG91YmxlIFhjb2VmQTsKICAgIGRvdWJsZSBYY29lZkI7CiAgICBkb3VibGUgWGNvZWZBQjsKCiAgICBkb3VibGUgWWNvZWY7CiAgICBkb3VibGUgWWNvZWZBOwogICAgZG91YmxlIFljb2VmQjsKICAgIGRvdWJsZSBZY29lZkFCOwoKICAgIGRvdWJsZSBaY29lZjsKICAgIGRvdWJsZSBaY29lZkE7CiAgICBkb3VibGUgWmNvZWZCOwogICAgZG91YmxlIFpjb2VmQUI7Cn1DdlN0ZXJlb0xpbmVDb2VmZjsKCgp0eXBlZGVmIHN0cnVjdCBDdkNhbWVyYQp7CiAgICBmbG9hdCAgIGltZ1NpemVbMl07IC8qIHNpemUgb2YgdGhlIGNhbWVyYSB2aWV3LCB1c2VkIGR1cmluZyBjYWxpYnJhdGlvbiAqLwogICAgZmxvYXQgICBtYXRyaXhbOV07IC8qIGludGluc2ljIGNhbWVyYSBwYXJhbWV0ZXJzOiAgWyBmeCAwIGN4OyAwIGZ5IGN5OyAwIDAgMSBdICovCiAgICBmbG9hdCAgIGRpc3RvcnRpb25bNF07IC8qIGRpc3RvcnRpb24gY29lZmZpY2llbnRzIC0gdHdvIGNvZWZmaWNpZW50cyBmb3IgcmFkaWFsIGRpc3RvcnRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFub3RoZXIgdHdvIGZvciB0YW5nZW50aWFsOiBbIGsxIGsyIHAxIHAyIF0gKi8KICAgIGZsb2F0ICAgcm90TWF0cls5XTsKICAgIGZsb2F0ICAgdHJhbnNWZWN0WzNdOyAvKiByb3RhdGlvbiBtYXRyaXggYW5kIHRyYW5zaXRpb24gdmVjdG9yIHJlbGF0aXZlbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzb21lIHJlZmVyZW5jZSBwb2ludCBpbiB0aGUgc3BhY2UuICovCn0KQ3ZDYW1lcmE7Cgp0eXBlZGVmIHN0cnVjdCBDdlN0ZXJlb0NhbWVyYQp7CiAgICBDdkNhbWVyYSogY2FtZXJhWzJdOyAvKiB0d28gaW5kaXZpZHVhbCBjYW1lcmEgcGFyYW1ldGVycyAqLwogICAgZmxvYXQgZnVuZE1hdHJbOV07IC8qIGZ1bmRhbWVudGFsIG1hdHJpeCAqLwoKICAgIC8qIE5ldyBwYXJ0IGZvciBzdGVyZW8gKi8KICAgIEN2UG9pbnQzRDMyZiBlcGlwb2xlWzJdOwogICAgQ3ZQb2ludDJEMzJmIHF1YWRbMl1bNF07IC8qIGNvb3JkaW5hdGVzIG9mIGRlc3RpbmF0aW9uIHF1YWRyYW5nbGUgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlwb2xhciBnZW9tZXRyeSByZWN0aWZpY2F0aW9uICovCiAgICBkb3VibGUgY29lZmZzWzJdWzNdWzNdOy8qIGNvZWZmaWNpZW50cyBmb3IgdHJhbnNmb3JtYXRpb24gKi8KICAgIEN2UG9pbnQyRDMyZiBib3JkZXJbMl1bNF07CiAgICBDdlNpemUgd2FycFNpemU7CiAgICBDdlN0ZXJlb0xpbmVDb2VmZiogbGluZUNvZWZmczsKICAgIGludCBuZWVkU3dhcENhbWVyYXM7LyogZmxhZyBzZXQgdG8gMSBpZiBuZWVkIHRvIHN3YXAgY2FtZXJhcyBmb3IgZ29vZCByZWNvbnN0cnVjdGlvbiAqLwogICAgZmxvYXQgcm90TWF0cml4WzldOwogICAgZmxvYXQgdHJhbnNWZWN0b3JbM107Cn0KQ3ZTdGVyZW9DYW1lcmE7CgoKdHlwZWRlZiBzdHJ1Y3QgQ3ZDb250b3VyT3JpZW50YXRpb24KewogICAgZmxvYXQgZWd2YWxzWzJdOwogICAgZmxvYXQgZWd2ZWN0c1s0XTsKCiAgICBmbG9hdCBtYXgsIG1pbjsgLy8gbWluaW11bSBhbmQgbWF4aW11bSBwcm9qZWN0aW9ucwogICAgaW50IGltYXgsIGltaW47Cn0gQ3ZDb250b3VyT3JpZW50YXRpb247CgojZGVmaW5lIENWX0NBTUVSQV9UT19XQVJQIDEKI2RlZmluZSBDVl9XQVJQX1RPX0NBTUVSQSAyCgpDVkFQSShpbnQpIGljdkNvbnZlcnRXYXJwQ29vcmRpbmF0ZXMoZG91YmxlIGNvZWZmc1szXVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGNhbWVyYVBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogd2FycFBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pOwoKQ1ZBUEkoaW50KSBpY3ZHZXRTeW1Qb2ludDNEKCAgQ3ZQb2ludDNENjRmIHBvaW50Q29ybmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmIHBvaW50MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiBwb2ludDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGYgKnBvaW50U3ltMik7CgpDVkFQSSh2b2lkKSBpY3ZHZXRQaWVjZUxlbmd0aDNEKEN2UG9pbnQzRDY0ZiBwb2ludDEsQ3ZQb2ludDNENjRmIHBvaW50Mixkb3VibGUqIGRpc3QpOwoKQ1ZBUEkoaW50KSBpY3ZDb21wdXRlM0RQb2ludCggICAgZG91YmxlIGFscGhhLGRvdWJsZSBiZXR0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvTGluZUNvZWZmKiBjb2VmZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGYqIHBvaW50KTsKCkNWQVBJKGludCkgaWN2Q3JlYXRlQ29udmVydE1hdHJWZWN0KCBDdk1hdHI2NGQgICAgIHJvdE1hdHIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgdHJhbnNWZWN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIHJvdE1hdHIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgdHJhbnNWZWN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGNvbnZSb3RNYXRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgY29udlRyYW5zVmVjdCk7CgpDVkFQSShpbnQpIGljdkNvbnZlcnRQb2ludFN5c3RlbShDdlBvaW50M0Q2NGYgIE0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBNMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgcm90TWF0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgdHJhbnNWZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKQ1ZBUEkoaW50KSBpY3ZDb21wdXRlQ29lZmZGb3JTdGVyZW8oICBDdlN0ZXJlb0NhbWVyYSogc3RlcmVvQ2FtZXJhKTsKCkNWQVBJKGludCkgaWN2R2V0Q3Jvc3NQaWVjZVZlY3RvcihDdlBvaW50MkQzMmYgcDFfc3RhcnQsQ3ZQb2ludDJEMzJmIHAxX2VuZCxDdlBvaW50MkQzMmYgdjJfc3RhcnQsQ3ZQb2ludDJEMzJmIHYyX2VuZCxDdlBvaW50MkQzMmYgKmNyb3NzKTsKQ1ZBUEkoaW50KSBpY3ZHZXRDcm9zc0xpbmVEaXJlY3QoQ3ZQb2ludDJEMzJmIHAxLEN2UG9pbnQyRDMyZiBwMixmbG9hdCBhLGZsb2F0IGIsZmxvYXQgYyxDdlBvaW50MkQzMmYqIGNyb3NzKTsKQ1ZBUEkoZmxvYXQpIGljdkRlZmluZVBvaW50UG9zaXRpb24oQ3ZQb2ludDJEMzJmIHBvaW50MSxDdlBvaW50MkQzMmYgcG9pbnQyLEN2UG9pbnQyRDMyZiBwb2ludCk7CkNWQVBJKGludCkgaWN2U3RlcmVvQ2FsaWJyYXRpb24oIGludCBudW1JbWFnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgaW1hZ2VTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBpbWFnZVBvaW50czEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGltYWdlUG9pbnRzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiogb2JqZWN0UG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdGVyZW9DYW1lcmEqIHN0ZXJlb3BhcmFtcwogICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKCkNWQVBJKGludCkgaWN2Q29tcHV0ZVJlc3RTdGVyZW9QYXJhbXMoQ3ZTdGVyZW9DYW1lcmEgKnN0ZXJlb3BhcmFtcyk7CgpDVkFQSSh2b2lkKSBjdkNvbXB1dGVQZXJzcGVjdGl2ZU1hcCggY29uc3QgZG91YmxlIGNvZWZmc1szXVszXSwgQ3ZBcnIqIHJlY3RNYXBYLCBDdkFyciogcmVjdE1hcFkgKTsKCkNWQVBJKGludCkgaWN2Q29tQ29lZmZGb3JMaW5lKCAgIEN2UG9pbnQyRDY0ZiBwb2ludDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgcG9pbnQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIHBvaW50MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiBwb2ludDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgY2FtTWF0cjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgcm90TWF0cjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgdHJhbnNWZWN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICBjYW1NYXRyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICByb3RNYXRyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICB0cmFuc1ZlY3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdGVyZW9MaW5lQ29lZmYqICAgIGNvZWZmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbmVlZFN3YXBDYW1lcmFzKTsKCkNWQVBJKGludCkgaWN2R2V0RGlyZWN0aW9uRm9yUG9pbnQoICBDdlBvaW50MkQ2NGYgcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkIGNhbU1hdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBkaXJlY3QpOwoKQ1ZBUEkoaW50KSBpY3ZHZXRDcm9zc0xpbmVzKEN2UG9pbnQzRDY0ZiBwb2ludDExLEN2UG9pbnQzRDY0ZiBwb2ludDEyLAogICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiBwb2ludDIxLEN2UG9pbnQzRDY0ZiBwb2ludDIyLAogICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiogbWlkUG9pbnQpOwoKQ1ZBUEkoaW50KSBpY3ZDb21wdXRlU3RlcmVvTGluZUNvZWZmcyggICBDdlBvaW50M0Q2NGYgcG9pbnRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGYgcG9pbnRCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGYgcG9pbnRDYW0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZ2FtbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvTGluZUNvZWZmKiAgICBjb2VmZnMpOwoKLypDVkFQSShpbnQpIGljdkNvbXB1dGVGdW5kTWF0ckVwaXBvbGVzICggQ3ZNYXRyNjRkIGNhbU1hdHIxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCAgICAgdHJhbnNWZWN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBjYW1NYXRyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0NjRkICAgICB0cmFuc1ZlY3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIGVwaXBvbGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIGVwaXBvbGUyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGZ1bmRNYXRyKTsqLwoKQ1ZBUEkoaW50KSBpY3ZHZXRBbmdsZUxpbmUoIEN2UG9pbnQyRDY0ZiBzdGFydFBvaW50LCBDdlNpemUgaW1hZ2VTaXplLEN2UG9pbnQyRDY0ZiAqcG9pbnQxLEN2UG9pbnQyRDY0ZiAqcG9pbnQyKTsKCkNWQVBJKHZvaWQpIGljdkdldENvZWZGb3JQaWVjZSggICBDdlBvaW50MkQ2NGYgcF9zdGFydCxDdlBvaW50MkQ2NGYgcF9lbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqYSxkb3VibGUgKmIsZG91YmxlICpjLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlc3VsdCk7CgovKkNWQVBJKHZvaWQpIGljdkdldENvbW1vbkFyZWEoIEN2U2l6ZSBpbWFnZVNpemUsCiAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIGVwaXBvbGUxLEN2UG9pbnQyRDY0ZiBlcGlwb2xlMiwKICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgZnVuZE1hdHIsCiAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0NjRkIGNvZWZmMTEsQ3ZWZWN0NjRkIGNvZWZmMTIsCiAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0NjRkIGNvZWZmMjEsQ3ZWZWN0NjRkIGNvZWZmMjIsCiAgICAgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpOyovCgpDVkFQSSh2b2lkKSBpY3ZDb21wdXRlZUluZmluaXRlUHJvamVjdDEoQ3ZNYXRyNjRkICAgIHJvdE1hdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgY2FtTWF0cjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgY2FtTWF0cjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgcG9pbnQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmICpwb2ludDIpOwoKQ1ZBUEkodm9pZCkgaWN2Q29tcHV0ZWVJbmZpbml0ZVByb2plY3QyKEN2TWF0cjY0ZCAgICByb3RNYXRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIGNhbU1hdHIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIGNhbU1hdHIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBwb2ludDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgcG9pbnQyKTsKCkNWQVBJKHZvaWQpIGljdkdldENyb3NzRGlyZWN0RGlyZWN0KCAgQ3ZWZWN0NjRkIGRpcmVjdDEsQ3ZWZWN0NjRkIGRpcmVjdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgKmNyb3NzLGludCogcmVzdWx0KTsKCkNWQVBJKHZvaWQpIGljdkdldENyb3NzUGllY2VEaXJlY3QoICAgQ3ZQb2ludDJENjRmIHBfc3RhcnQsQ3ZQb2ludDJENjRmIHBfZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsZG91YmxlIGIsZG91YmxlIGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgKmNyb3NzLGludCogcmVzdWx0KTsKCkNWQVBJKHZvaWQpIGljdkdldENyb3NzUGllY2VQaWVjZSggQ3ZQb2ludDJENjRmIHAxX3N0YXJ0LEN2UG9pbnQyRDY0ZiBwMV9lbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgcDJfc3RhcnQsQ3ZQb2ludDJENjRmIHAyX2VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiogY3Jvc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKQ1ZBUEkodm9pZCkgaWN2R2V0UGllY2VMZW5ndGgoQ3ZQb2ludDJENjRmIHBvaW50MSxDdlBvaW50MkQ2NGYgcG9pbnQyLGRvdWJsZSogZGlzdCk7CgpDVkFQSSh2b2lkKSBpY3ZHZXRDcm9zc1JlY3REaXJlY3QoICAgIEN2U2l6ZSBpbWFnZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSxkb3VibGUgYixkb3VibGUgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiAqc3RhcnQsQ3ZQb2ludDJENjRmICplbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlc3VsdCk7CgpDVkFQSSh2b2lkKSBpY3ZQcm9qZWN0UG9pbnRUb0ltYWdlKCAgIEN2UG9pbnQzRDY0ZiBwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCBjYW1NYXRyLEN2TWF0cjY0ZCByb3RNYXRyLEN2VmVjdDY0ZCB0cmFuc1ZlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIHByb2pQb2ludCk7CgpDVkFQSSh2b2lkKSBpY3ZHZXRRdWFkc1RyYW5zZm9ybSggQ3ZTaXplICAgICAgICBpbWFnZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgY2FtTWF0cjEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgcm90TWF0cjEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCAgICAgdHJhbnNWZWN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBjYW1NYXRyMiwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyMiwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0NjRkICAgICB0cmFuc1ZlY3QyLAogICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUqICAgICAgIHdhcnBTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhZDFbNF1bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBxdWFkMls0XVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBmdW5kTWF0ciwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBlcGlwb2xlMSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBlcGlwb2xlMgogICAgICAgICAgICAgICAgICAgICAgICApOwoKQ1ZBUEkodm9pZCkgaWN2R2V0UXVhZHNUcmFuc2Zvcm1TdHJ1Y3QoICBDdlN0ZXJlb0NhbWVyYSogc3RlcmVvQ2FtZXJhKTsKCkNWQVBJKHZvaWQpIGljdkNvbXB1dGVTdGVyZW9QYXJhbXNGb3JDYW1lcmFzKEN2U3RlcmVvQ2FtZXJhKiBzdGVyZW9DYW1lcmEpOwoKQ1ZBUEkodm9pZCkgaWN2R2V0Q3V0UGllY2UoICAgQ3ZWZWN0NjRkIGFyZWFMaW5lQ29lZjEsQ3ZWZWN0NjRkIGFyZWFMaW5lQ29lZjIsCiAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIGVwaXBvbGUsCiAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGltYWdlU2l6ZSwKICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIHBvaW50MTEsQ3ZQb2ludDJENjRmKiBwb2ludDEyLAogICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiogcG9pbnQyMSxDdlBvaW50MkQ2NGYqIHBvaW50MjIsCiAgICAgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpOwoKQ1ZBUEkodm9pZCkgaWN2R2V0TWlkZGxlQW5nbGVQb2ludCggICBDdlBvaW50MkQ2NGYgYmFzZVBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIHBvaW50MSxDdlBvaW50MkQ2NGYgcG9pbnQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmKiBtaWRQb2ludCk7CgpDVkFQSSh2b2lkKSBpY3ZHZXROb3JtYWxEaXJlY3QoQ3ZWZWN0NjRkIGRpcmVjdCxDdlBvaW50MkQ2NGYgcG9pbnQsQ3ZWZWN0NjRkIG5vcm1EaXJlY3QpOwoKQ1ZBUEkoZG91YmxlKSBpY3ZHZXRWZWN0KEN2UG9pbnQyRDY0ZiBiYXNlUG9pbnQsQ3ZQb2ludDJENjRmIHBvaW50MSxDdlBvaW50MkQ2NGYgcG9pbnQyKTsKCkNWQVBJKHZvaWQpIGljdlByb2plY3RQb2ludFRvRGlyZWN0KCAgQ3ZQb2ludDJENjRmIHBvaW50LEN2VmVjdDY0ZCBsaW5lQ29lZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIHByb2plY3RQb2ludCk7CgpDVkFQSSh2b2lkKSBpY3ZHZXREaXN0YW5jZUZyb21Qb2ludFRvRGlyZWN0KCBDdlBvaW50MkQ2NGYgcG9pbnQsQ3ZWZWN0NjRkIGxpbmVDb2VmLGRvdWJsZSpkaXN0KTsKCkNWQVBJKElwbEltYWdlKikgaWN2Q3JlYXRlSXNvbWV0cmljSW1hZ2UoIElwbEltYWdlKiBzcmMsIElwbEltYWdlKiBkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNpcmVkX2RlcHRoLCBpbnQgZGVzaXJlZF9udW1fY2hhbm5lbHMgKTsKCkNWQVBJKHZvaWQpIGN2RGVJbnRlcmxhY2UoIGNvbnN0IEN2QXJyKiBmcmFtZSwgQ3ZBcnIqIGZpZWxkRXZlbiwgQ3ZBcnIqIGZpZWxkT2RkICk7CgovKkNWQVBJKGludCkgaWN2U2VsZWN0QmVzdFJ0KCAgICAgICAgICAgaW50ICAgICAgICAgICBudW1JbWFnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgbnVtUG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgICAgICAgIGltYWdlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBpbWFnZVBvaW50czEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogaW1hZ2VQb2ludHMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0QzMmYqIG9iamVjdFBvaW50cywKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICAgY2FtZXJhTWF0cml4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0MzJmICAgICBkaXN0b3J0aW9uMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgICByb3RNYXRyczEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiAgICAgdHJhbnNWZWN0czEsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIGNhbWVyYU1hdHJpeDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiAgICAgZGlzdG9ydGlvbjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICAgcm90TWF0cnMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIHRyYW5zVmVjdHMyLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgICBiZXN0Um90TWF0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0MzJmICAgICBiZXN0VHJhbnNWZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250b3VyIE1vcnBoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBmaW5kcyBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHR3byBjb250b3VycyAqLwpDdlNlcSogY3ZDYWxjQ29udG91cnNDb3JyZXNwb25kZW5jZSggY29uc3QgQ3ZTZXEqIGNvbnRvdXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTZXEqIGNvbnRvdXIyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSk7CgovKiBtb3JwaHMgY29udG91cnMgdXNpbmcgdGhlIHByZS1jYWxjdWxhdGVkIGNvcnJlc3BvbmRlbmNlOgogICBhbHBoYT0wIH4gY29udG91cjEsIGFscGhhPTEgfiBjb250b3VyMiAqLwpDdlNlcSogY3ZNb3JwaENvbnRvdXJzKCBjb25zdCBDdlNlcSogY29udG91cjEsIGNvbnN0IEN2U2VxKiBjb250b3VyMiwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIGNvcnIsIGRvdWJsZSBhbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHR1cmUgRGVzY3JpcHRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2RlZmluZSBDVl9HTENNX09QVElNSVpBVElPTl9OT05FICAgICAgICAgICAgICAgICAgIC0yCiNkZWZpbmUgQ1ZfR0xDTV9PUFRJTUlaQVRJT05fTFVUICAgICAgICAgICAgICAgICAgICAtMQojZGVmaW5lIENWX0dMQ01fT1BUSU1JWkFUSU9OX0hJU1RPR1JBTSAgICAgICAgICAgICAgMAoKI2RlZmluZSBDVl9HTENNREVTQ19PUFRJTUlaQVRJT05fQUxMT1dET1VCTEVORVNUICAgIDEwCiNkZWZpbmUgQ1ZfR0xDTURFU0NfT1BUSU1JWkFUSU9OX0FMTE9XVFJJUExFTkVTVCAgICAxMQojZGVmaW5lIENWX0dMQ01ERVNDX09QVElNSVpBVElPTl9ISVNUT0dSQU0gICAgICAgICAgNAoKI2RlZmluZSBDVl9HTENNREVTQ19FTlRST1BZICAgICAgICAgICAgICAgICAgICAgICAgIDAKI2RlZmluZSBDVl9HTENNREVTQ19FTkVSR1kgICAgICAgICAgICAgICAgICAgICAgICAgIDEKI2RlZmluZSBDVl9HTENNREVTQ19IT01PR0VOSVRZICAgICAgICAgICAgICAgICAgICAgIDIKI2RlZmluZSBDVl9HTENNREVTQ19DT05UUkFTVCAgICAgICAgICAgICAgICAgICAgICAgIDMKI2RlZmluZSBDVl9HTENNREVTQ19DTFVTVEVSVEVOREVOQ1kgICAgICAgICAgICAgICAgIDQKI2RlZmluZSBDVl9HTENNREVTQ19DTFVTVEVSU0hBREUgICAgICAgICAgICAgICAgICAgIDUKI2RlZmluZSBDVl9HTENNREVTQ19DT1JSRUxBVElPTiAgICAgICAgICAgICAgICAgICAgIDYKI2RlZmluZSBDVl9HTENNREVTQ19DT1JSRUxBVElPTklORk8xICAgICAgICAgICAgICAgIDcKI2RlZmluZSBDVl9HTENNREVTQ19DT1JSRUxBVElPTklORk8yICAgICAgICAgICAgICAgIDgKI2RlZmluZSBDVl9HTENNREVTQ19NQVhJTVVNUFJPQkFCSUxJVFkgICAgICAgICAgICAgIDkKCiNkZWZpbmUgQ1ZfR0xDTV9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiNkZWZpbmUgQ1ZfR0xDTV9HTENNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiNkZWZpbmUgQ1ZfR0xDTV9ERVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCgp0eXBlZGVmIHN0cnVjdCBDdkdMQ00gQ3ZHTENNOwoKQ1ZBUEkoQ3ZHTENNKikgY3ZDcmVhdGVHTENNKCBjb25zdCBJcGxJbWFnZSogc3JjSW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXBNYWduaXR1ZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzdGVwRGlyZWN0aW9ucyBDVl9ERUZBVUxUKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1TdGVwRGlyZWN0aW9ucyBDVl9ERUZBVUxUKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpbWl6YXRpb25UeXBlIENWX0RFRkFVTFQoQ1ZfR0xDTV9PUFRJTUlaQVRJT05fTk9ORSkpOwoKQ1ZBUEkodm9pZCkgY3ZSZWxlYXNlR0xDTSggQ3ZHTENNKiogR0xDTSwgaW50IGZsYWcgQ1ZfREVGQVVMVChDVl9HTENNX0FMTCkpOwoKQ1ZBUEkodm9pZCkgY3ZDcmVhdGVHTENNRGVzY3JpcHRvcnMoIEN2R0xDTSogZGVzdEdMQ00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzY3JpcHRvck9wdGltaXphdGlvblR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0RFRkFVTFQoQ1ZfR0xDTURFU0NfT1BUSU1JWkFUSU9OX0FMTE9XRE9VQkxFTkVTVCkpOwoKQ1ZBUEkoZG91YmxlKSBjdkdldEdMQ01EZXNjcmlwdG9yKCBDdkdMQ00qIEdMQ00sIGludCBzdGVwLCBpbnQgZGVzY3JpcHRvciApOwoKQ1ZBUEkodm9pZCkgY3ZHZXRHTENNRGVzY3JpcHRvclN0YXRpc3RpY3MoIEN2R0xDTSogR0xDTSwgaW50IGRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGF2ZXJhZ2UsIGRvdWJsZSogc3RhbmRhcmREZXZpYXRpb24gKTsKCkNWQVBJKElwbEltYWdlKikgY3ZDcmVhdGVHTENNSW1hZ2UoIEN2R0xDTSogR0xDTSwgaW50IHN0ZXAgKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2UgZXllcyZtb3V0aCB0cmFja2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKdHlwZWRlZiBzdHJ1Y3QgQ3ZGYWNlVHJhY2tlciBDdkZhY2VUcmFja2VyOwoKI2RlZmluZSBDVl9OVU1fRkFDRV9FTEVNRU5UUyAgICAzIAplbnVtIENWX0ZBQ0VfRUxFTUVOVFMKewogICAgQ1ZfRkFDRV9NT1VUSCA9IDAsCiAgICBDVl9GQUNFX0xFRlRfRVlFID0gMSwKICAgIENWX0ZBQ0VfUklHSFRfRVlFID0gMgp9OwoKQ1ZBUEkoQ3ZGYWNlVHJhY2tlciopIGN2SW5pdEZhY2VUcmFja2VyKEN2RmFjZVRyYWNrZXIqIHBGYWNlVHJhY2tpbmcsIGNvbnN0IElwbEltYWdlKiBpbWdHcmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QqIHBSZWN0cywgaW50IG5SZWN0cyk7CkNWQVBJKGludCkgY3ZUcmFja0ZhY2UoIEN2RmFjZVRyYWNrZXIqIHBGYWNlVHJhY2tlciwgSXBsSW1hZ2UqIGltZ0dyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCogcFJlY3RzLCBpbnQgblJlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50KiBwdFJvdGF0ZSwgZG91YmxlKiBkYkFuZ2xlUm90YXRlKTsKQ1ZBUEkodm9pZCkgY3ZSZWxlYXNlRmFjZVRyYWNrZXIoQ3ZGYWNlVHJhY2tlcioqIHBwRmFjZVRyYWNrZXIpOwoKCnR5cGVkZWYgc3RydWN0IEN2RmFjZQp7CiAgICBDdlJlY3QgTW91dGhSZWN0OwogICAgQ3ZSZWN0IExlZnRFeWVSZWN0OwogICAgQ3ZSZWN0IFJpZ2h0RXllUmVjdDsKfSBDdkZhY2VEYXRhOwoKQ3ZTZXEgKiBjdkZpbmRGYWNlKElwbEltYWdlICogSW1hZ2UsQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlKTsKQ3ZTZXEgKiBjdlBvc3RCb29zdGluZ0ZpbmRGYWNlKElwbEltYWdlICogSW1hZ2UsQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM0QgVHJhY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEN2Qm9vbDsKCnR5cGVkZWYgc3RydWN0CnsKICAgIGludCBpZDsKICAgIEN2UG9pbnQyRDMyZiBwOyAvLyBwZ3J1ZWJlbGU6IFNvIHdlIGRvIG5vdCBsb29zZSBwcmVjaXNpb24sIHRoaXMgbmVlZHMgdG8gYmUgZmxvYXQKfSBDdjNkVHJhY2tlcjJkVHJhY2tlZE9iamVjdDsKCkNWX0lOTElORSBDdjNkVHJhY2tlcjJkVHJhY2tlZE9iamVjdCBjdjNkVHJhY2tlcjJkVHJhY2tlZE9iamVjdChpbnQgaWQsIEN2UG9pbnQyRDMyZiBwKQp7CiAgICBDdjNkVHJhY2tlcjJkVHJhY2tlZE9iamVjdCByOwogICAgci5pZCA9IGlkOwogICAgci5wID0gcDsKICAgIHJldHVybiByOwp9Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBpbnQgaWQ7CiAgICBDdlBvaW50M0QzMmYgcDsgICAgICAgICAgICAgLy8gbG9jYXRpb24gb2YgdGhlIHRyYWNrZWQgb2JqZWN0Cn0gQ3YzZFRyYWNrZXJUcmFja2VkT2JqZWN0OwoKQ1ZfSU5MSU5FIEN2M2RUcmFja2VyVHJhY2tlZE9iamVjdCBjdjNkVHJhY2tlclRyYWNrZWRPYmplY3QoaW50IGlkLCBDdlBvaW50M0QzMmYgcCkKewogICAgQ3YzZFRyYWNrZXJUcmFja2VkT2JqZWN0IHI7CiAgICByLmlkID0gaWQ7CiAgICByLnAgPSBwOwogICAgcmV0dXJuIHI7Cn0KCnR5cGVkZWYgc3RydWN0CnsKICAgIEN2Qm9vbCB2YWxpZDsKICAgIGZsb2F0IG1hdFs0XVs0XTsgICAgICAgICAgICAgIC8qIG1hcHMgY2FtZXJhIGNvb3JkaW5hdGVzIHRvIHdvcmxkIGNvb3JkaW5hdGVzICovCiAgICBDdlBvaW50MkQzMmYgcHJpbmNpcGFsX3BvaW50OyAvKiBjb3BpZWQgZnJvbSBpbnRyaW5zaWNzIHNvIHRoaXMgc3RydWN0dXJlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXMgYWxsIHRoZSBpbmZvIHdlIG5lZWQgKi8KfSBDdjNkVHJhY2tlckNhbWVyYUluZm87Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBDdlBvaW50MkQzMmYgcHJpbmNpcGFsX3BvaW50OwogICAgZmxvYXQgZm9jYWxfbGVuZ3RoWzJdOwogICAgZmxvYXQgZGlzdG9ydGlvbls0XTsKfSBDdjNkVHJhY2tlckNhbWVyYUludHJpbnNpY3M7CgpDVkFQSShDdkJvb2wpIGN2M2RUcmFja2VyQ2FsaWJyYXRlQ2FtZXJhcyhpbnQgbnVtX2NhbWVyYXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2M2RUcmFja2VyQ2FtZXJhSW50cmluc2ljcyBjYW1lcmFfaW50cmluc2ljc1tdLCAvKiBzaXplIGlzIG51bV9jYW1lcmFzICovCiAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBldGFsb25fc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3F1YXJlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlICpzYW1wbGVzW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIGlzIG51bV9jYW1lcmFzICovCiAgICAgICAgICAgICAgICAgICAgIEN2M2RUcmFja2VyQ2FtZXJhSW5mbyBjYW1lcmFfaW5mb1tdKTsgICAgICAgICAgICAgICAgICAvKiBzaXplIGlzIG51bV9jYW1lcmFzICovCgpDVkFQSShpbnQpICBjdjNkVHJhY2tlckxvY2F0ZU9iamVjdHMoaW50IG51bV9jYW1lcmFzLCBpbnQgbnVtX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICBjb25zdCBDdjNkVHJhY2tlckNhbWVyYUluZm8gY2FtZXJhX2luZm9bXSwgICAgICAgIC8qIHNpemUgaXMgbnVtX2NhbWVyYXMgKi8KICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2M2RUcmFja2VyMmRUcmFja2VkT2JqZWN0IHRyYWNraW5nX2luZm9bXSwgLyogc2l6ZSBpcyBudW1fb2JqZWN0cypudW1fY2FtZXJhcyAqLwogICAgICAgICAgICAgICAgICAgQ3YzZFRyYWNrZXJUcmFja2VkT2JqZWN0IHRyYWNrZWRfb2JqZWN0c1tdKTsgICAgICAvKiBzaXplIGlzIG51bV9vYmplY3RzICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiB0cmFja2luZ19pbmZvIGlzIGEgcmVjdGFuZ3VsYXIgYXJyYXk7IG9uZSByb3cgcGVyIGNhbWVyYSwgbnVtX29iamVjdHMgZWxlbWVudHMgcGVyIHJvdy4KIFRoZSBpZCBmaWVsZCBvZiBhbnkgdW51c2VkIHNsb3RzIG11c3QgYmUgLTEuIElkcyBuZWVkIG5vdCBiZSBvcmRlcmVkIG9yIGNvbnNlY3V0aXZlLiBPbgogY29tcGxldGlvbiwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgbG9jYXRlZDsgaS5lLiwgdGhlIG51bWJlciBvZiBvYmplY3RzCiB2aXNpYmxlIGJ5IG1vcmUgdGhhbiBvbmUgY2FtZXJhLiBUaGUgaWQgZmllbGQgb2YgYW55IHVudXNlZCBzbG90cyBpbiB0cmFja2VkIG9iamVjdHMgaXMKIHNldCB0byAtMS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrZWxldG9ucyBhbmQgTGluZWFyLUNvbnRvdXIgTW9kZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAqClwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdHlwZWRlZiBlbnVtIEN2TGVlUGFyYW1ldGVycwp7CiAgICBDVl9MRUVfSU5UID0gMCwKICAgIENWX0xFRV9GTE9BVCA9IDEsCiAgICBDVl9MRUVfRE9VQkxFID0gMiwKICAgIENWX0xFRV9BVVRPID0gLTEsCiAgICBDVl9MRUVfRVJPREUgPSAwLAogICAgQ1ZfTEVFX1pPT00gPSAxLAogICAgQ1ZfTEVFX05PTiA9IDIKfSBDdkxlZVBhcmFtZXRlcnM7CgojZGVmaW5lIENWX05FWFRfVk9ST05PSVNJVEUyRCggU0lURSApICgoU0lURSktPmVkZ2VbMF0tPnNpdGVbKChTSVRFKS0+ZWRnZVswXS0+c2l0ZVswXSA9PSAoU0lURSkpXSkKI2RlZmluZSBDVl9QUkVWX1ZPUk9OT0lTSVRFMkQoIFNJVEUgKSAoKFNJVEUpLT5lZGdlWzFdLT5zaXRlWygoU0lURSktPmVkZ2VbMV0tPnNpdGVbMF0gPT0gKFNJVEUpKV0pCiNkZWZpbmUgQ1ZfRklSU1RfVk9ST05PSUVER0UyRCggU0lURSApICgoU0lURSktPmVkZ2VbMF0pCiNkZWZpbmUgQ1ZfTEFTVF9WT1JPTk9JRURHRTJEKCBTSVRFICkgKChTSVRFKS0+ZWRnZVsxXSkKI2RlZmluZSBDVl9ORVhUX1ZPUk9OT0lFREdFMkQoIEVER0UsIFNJVEUgKSAoKEVER0UpLT5uZXh0WyhFREdFKS0+c2l0ZVswXSAhPSAoU0lURSldKQojZGVmaW5lIENWX1BSRVZfVk9ST05PSUVER0UyRCggRURHRSwgU0lURSApICgoRURHRSktPm5leHRbMiArICgoRURHRSktPnNpdGVbMF0gIT0gKFNJVEUpKV0pCiNkZWZpbmUgQ1ZfVk9ST05PSUVER0UyRF9CRUdJTk5PREUoIEVER0UsIFNJVEUgKSAoKEVER0UpLT5ub2RlWygoRURHRSktPnNpdGVbMF0gIT0gKFNJVEUpKV0pCiNkZWZpbmUgQ1ZfVk9ST05PSUVER0UyRF9FTkROT0RFKCBFREdFLCBTSVRFICkgKChFREdFKS0+bm9kZVsoKEVER0UpLT5zaXRlWzBdID09IChTSVRFKSldKQojZGVmaW5lIENWX1RXSU5fVk9ST05PSVNJVEUyRCggU0lURSwgRURHRSApICggKEVER0UpLT5zaXRlWygoRURHRSktPnNpdGVbMF0gPT0gKFNJVEUpKV0pIAoKI2RlZmluZSBDVl9WT1JPTk9JU0lURTJEX0ZJRUxEUygpICAgIFwKICAgIHN0cnVjdCBDdlZvcm9ub2lOb2RlMkQgKm5vZGVbMl07IFwKICAgIHN0cnVjdCBDdlZvcm9ub2lFZGdlMkQgKmVkZ2VbMl07Cgp0eXBlZGVmIHN0cnVjdCBDdlZvcm9ub2lTaXRlMkQKewogICAgQ1ZfVk9ST05PSVNJVEUyRF9GSUVMRFMoKQogICAgc3RydWN0IEN2Vm9yb25vaVNpdGUyRCAqbmV4dFsyXTsKfSBDdlZvcm9ub2lTaXRlMkQ7CgojZGVmaW5lIENWX1ZPUk9OT0lFREdFMkRfRklFTERTKCkgICAgXAogICAgc3RydWN0IEN2Vm9yb25vaU5vZGUyRCAqbm9kZVsyXTsgXAogICAgc3RydWN0IEN2Vm9yb25vaVNpdGUyRCAqc2l0ZVsyXTsgXAogICAgc3RydWN0IEN2Vm9yb25vaUVkZ2UyRCAqbmV4dFs0XTsKCnR5cGVkZWYgc3RydWN0IEN2Vm9yb25vaUVkZ2UyRAp7CiAgICBDVl9WT1JPTk9JRURHRTJEX0ZJRUxEUygpCn0gQ3ZWb3Jvbm9pRWRnZTJEOwoKI2RlZmluZSBDVl9WT1JPTk9JTk9ERTJEX0ZJRUxEUygpICAgICAgIFwKICAgIENWX1NFVF9FTEVNX0ZJRUxEUyhDdlZvcm9ub2lOb2RlMkQpIFwKICAgIEN2UG9pbnQyRDMyZiBwdDsgICAgICAgICAgICAgICAgICAgIFwKICAgIGZsb2F0IHJhZGl1czsKCnR5cGVkZWYgc3RydWN0IEN2Vm9yb25vaU5vZGUyRAp7CiAgICBDVl9WT1JPTk9JTk9ERTJEX0ZJRUxEUygpCn0gQ3ZWb3Jvbm9pTm9kZTJEOwoKI2RlZmluZSBDVl9WT1JPTk9JRElBR1JBTTJEX0ZJRUxEUygpIFwKICAgIENWX0dSQVBIX0ZJRUxEUygpICAgICAgICAgICAgICAgIFwKICAgIEN2U2V0ICpzaXRlczsKCnR5cGVkZWYgc3RydWN0IEN2Vm9yb25vaURpYWdyYW0yRAp7CiAgICBDVl9WT1JPTk9JRElBR1JBTTJEX0ZJRUxEUygpCn0gQ3ZWb3Jvbm9pRGlhZ3JhbTJEOwoKLyogQ29tcHV0ZXMgVm9yb25vaSBEaWFncmFtIGZvciBnaXZlbiBwb2x5Z29ucyB3aXRoIGhvbGVzICovCkNWQVBJKGludCkgIGN2Vm9yb25vaURpYWdyYW1Gcm9tQ29udG91cihDdlNlcSogQ29udG91clNlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW0yRCoqIFZvcm9ub2lEaWFncmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TGVlUGFyYW1ldGVycyBjb250b3VyX3R5cGUgQ1ZfREVGQVVMVChDVl9MRUVfSU5UKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250b3VyX29yaWVudGF0aW9uIENWX0RFRkFVTFQoLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRfbnVtYmVyIENWX0RFRkFVTFQoMTApKTsKCi8qIENvbXB1dGVzIFZvcm9ub2kgRGlhZ3JhbSBmb3IgZG9tYWlucyBpbiBnaXZlbiBpbWFnZSAqLwpDVkFQSShpbnQpICBjdlZvcm9ub2lEaWFncmFtRnJvbUltYWdlKElwbEltYWdlKiBwSW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqKiBDb250b3VyU2VxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW0yRCoqIFZvcm9ub2lEaWFncmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogVm9yb25vaVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMZWVQYXJhbWV0ZXJzIHJlZ3VsYXJpemF0aW9uX21ldGhvZCBDVl9ERUZBVUxUKENWX0xFRV9OT04pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcHJveF9wcmVjaXNpb24gQ1ZfREVGQVVMVChDVl9MRUVfQVVUTykpOwoKLyogRGVhbGxvY2F0ZXMgdGhlIHN0b3JhZ2UgKi8KQ1ZBUEkodm9pZCkgY3ZSZWxlYXNlVm9yb25vaVN0b3JhZ2UoQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiogcFZvcm9ub2lTdG9yYWdlKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKiBMaW5lYXItQ29udG91ciBNb2RlbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IEN2TENNRWRnZTsKc3RydWN0IEN2TENNTm9kZTsKCnR5cGVkZWYgc3RydWN0IEN2TENNRWRnZQp7CiAgICBDVl9HUkFQSF9FREdFX0ZJRUxEUygpIAogICAgQ3ZTZXEqIGNoYWluOwogICAgZmxvYXQgd2lkdGg7CiAgICBpbnQgaW5kZXgxOwogICAgaW50IGluZGV4MjsKfSBDdkxDTUVkZ2U7Cgp0eXBlZGVmIHN0cnVjdCBDdkxDTU5vZGUKewogICAgQ1ZfR1JBUEhfVkVSVEVYX0ZJRUxEUygpCiAgICBDdkNvbnRvdXIqIGNvbnRvdXI7IAp9IEN2TENNTm9kZTsKCgovKiBDb21wdXRlcyBoeWJyaWQgbW9kZWwgZnJvbSBWb3Jvbm9pIERpYWdyYW0gKi8KQ1ZBUEkoQ3ZHcmFwaCopIGN2TGluZWFyQ29udG9yTW9kZWxGcm9tVm9yb25vaURpYWdyYW0oQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4V2lkdGgpOwoKLyogUmVsZWFzZXMgaHlicmlkIG1vZGVsIHN0b3JhZ2UgKi8KQ1ZBUEkoaW50KSBjdlJlbGVhc2VMaW5lYXJDb250b3JNb2RlbFN0b3JhZ2UoQ3ZHcmFwaCoqIEdyYXBoKTsKCgovKiB0d28gc3RlcmVvLXJlbGF0ZWQgZnVuY3Rpb25zICovCgpDVkFQSSh2b2lkKSBjdkluaXRQZXJzcGVjdGl2ZVRyYW5zZm9ybSggQ3ZTaXplIHNpemUsIGNvbnN0IEN2UG9pbnQyRDMyZiB2ZXJ0ZXhbNF0sIGRvdWJsZSBtYXRyaXhbM11bM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogcmVjdE1hcCApOwoKLypDVkFQSSh2b2lkKSBjdkluaXRTdGVyZW9SZWN0aWZpY2F0aW9uKCBDdlN0ZXJlb0NhbWVyYSogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogcmVjdE1hcDEsIEN2QXJyKiByZWN0TWFwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3VuZGlzdG9ydGlvbiApOyovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZpZXcgTW9ycGhpbmcgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFRoZSBvcmRlciBvZiB0aGUgZnVuY3Rpb24gY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyIHRoZXkgc2hvdWxkIGFwcGVhciBpbgogICB0aGUgdmlldyBtb3JwaGluZyBwaXBlbGluZSAqLyAKCi8qIEZpbmRzIGVuZGluZyBwb2ludHMgb2Ygc2NhbmxpbmVzIG9uIGxlZnQgYW5kIHJpZ2h0IGltYWdlcyBvZiBzdGVyZW8tcGFpciAqLwpDVkFQSSh2b2lkKSAgY3ZNYWtlU2NhbmxpbmVzKCBjb25zdCBDdk1hdHJpeDMqIG1hdHJpeCwgQ3ZTaXplICBpbWdfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgc2NhbmxpbmVzMSwgaW50KiAgc2NhbmxpbmVzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgbGVuZ3RoczEsIGludCogIGxlbmd0aHMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBsaW5lX2NvdW50ICk7CgovKiBHcmFiIHBpeGVsIHZhbHVlcyBmcm9tIHNjYW5saW5lcyBhbmQgc3RvcmVzIHRoZW0gc2VxdWVudGlhbGx5CiAgIChzb21lIHNvcnQgb2YgcGVyc3BlY3RpdmUgaW1hZ2UgdHJhbnNmb3JtKSAqLwpDVkFQSSh2b2lkKSAgY3ZQcmVXYXJwSW1hZ2UoIGludCAgICAgICBsaW5lX2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiBpbWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqICAgIGRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgZHN0X251bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgIHNjYW5saW5lcyk7CgovKiBBcHByb3hpbWF0ZSBlYWNoIGdyYWJiZWQgc2NhbmxpbmUgYnkgYSBzZXF1ZW5jZSBvZiBydW5zCiAgIChsb3NzeSBydW4tbGVuZ3RoIGNvbXByZXNzaW9uKSAqLwpDVkFQSSh2b2lkKSAgY3ZGaW5kUnVucyggaW50ICAgIGxpbmVfY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogcHJld2FycDEsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogcHJld2FycDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgbGluZV9sZW5ndGhzMSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICBsaW5lX2xlbmd0aHMyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHJ1bnMxLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHJ1bnMyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIG51bV9ydW5zMSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICBudW1fcnVuczIpOwoKLyogQ29tcGFyZXMgdHdvIHNldHMgb2YgY29tcHJlc3NlZCBzY2FubGluZXMgKi8KQ1ZBUEkodm9pZCkgIGN2RHluYW1pY0NvcnJlc3BvbmRNdWx0aSggaW50ICBsaW5lX2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZpcnN0X3J1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNlY29uZF9ydW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZpcnN0X2NvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2Vjb25kX2NvcnIpOwoKLyogRmluZHMgc2NhbmxpbmUgZW5kaW5nIGNvb3JkaW5hdGVzIGZvciBzb21lIGludGVybWVkaWF0ZSAidmlydHVhbCIgY2FtZXJhIHBvc2l0aW9uICovCkNWQVBJKHZvaWQpICBjdk1ha2VBbHBoYVNjYW5saW5lcyggaW50KiAgc2NhbmxpbmVzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBzY2FubGluZXMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogIHNjYW5saW5lc0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgbGVuZ3RocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBsaW5lX2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhKTsKCi8qIEJsZW5kcyBkYXRhIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBpbWFnZSBzY2FubGluZXMgdG8gZ2V0CiAgIHBpeGVsIHZhbHVlcyBvZiAidmlydHVhbCIgaW1hZ2Ugc2NhbmxpbmVzICovCkNWQVBJKHZvaWQpICBjdk1vcnBoRXBpbGluZXNNdWx0aSggaW50ICAgIGxpbmVfY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGZpcnN0X3BpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgZmlyc3RfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBzZWNvbmRfcGl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICBzZWNvbmRfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3RfcGl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICBkc3RfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICBhbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIGZpcnN0X3J1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHNlY29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgc2Vjb25kX3J1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIGZpcnN0X2NvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHNlY29uZF9jb3JyKTsKCi8qIERvZXMgcmV2ZXJzZSB3YXJwaW5nIG9mIHRoZSBtb3JwaGluZyByZXN1bHQgdG8gbWFrZQogICBpdCBmaWxsIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSByZWN0YW5nbGUgKi8KQ1ZBUEkodm9pZCkgIGN2UG9zdFdhcnBJbWFnZSggaW50ICAgICAgIGxpbmVfY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiAgICBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICBzcmNfbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqIGltZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgIHNjYW5saW5lcyk7CgovKiBEZWxldGVzIE1vaXJlIChtaXNzZWQgcGl4ZWxzIHRoYXQgYXBwZWFyIGR1ZSB0byBkaXNjcmV0aXphdGlvbikgKi8KQ1ZBUEkodm9pZCkgIGN2RGVsZXRlTW9pcmUoIElwbEltYWdlKiAgaW1nICk7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCiogICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kL2ZvcmVncm91bmQgc2VnbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFdlIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgcGl4ZWxzCiAqIGJ5IGJ1aWxkaW5nIGFuZCBtYWludGFpbmluZyBhIG1vZGVsIG9mIHRoZSBiYWNrZ3JvdW5kLgogKiBBbnkgcGl4ZWwgd2hpY2ggZG9lcyBub3QgZml0IHRoaXMgbW9kZWwgaXMgdGhlbiBkZWVtZWQKICogdG8gYmUgZm9yZWdyb3VuZC4KICoKICogQXQgcHJlc2VudCB3ZSBzdXBwb3J0IHR3byBjb3JlIGJhY2tncm91bmQgbW9kZWxzLAogKiBvbmUgb2Ygd2hpY2ggaGFzIHR3byB2YXJpYXRpb25zOgogKgogKiAgbyBDVl9CR19NT0RFTF9GR0Q6IGxhdGVzdCBhbmQgZ3JlYXRlc3QgYWxnb3JpdGhtLCBkZXNjcmliZWQgaW4KICogICAgCiAqCSBGb3JlZ3JvdW5kIE9iamVjdCBEZXRlY3Rpb24gZnJvbSBWaWRlb3MgQ29udGFpbmluZyBDb21wbGV4IEJhY2tncm91bmQuCiAqCSBMaXl1YW4gTGksIFdlaW1pbiBIdWFuZywgSXJlbmUgWS5ILiBHdSwgYW5kIFFpIFRpYW4uIAogKgkgQUNNIE1NMjAwMyA5cAogKgogKiAgbyBDVl9CR19NT0RFTF9GR0RfU0lNUExFOgogKiAgICAgICBBIGNvZGUgY29tbWVudCBkZXNjcmliZXMgdGhpcyBhcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgYWJvdmUsCiAqICAgICAgIGJ1dCB0aGUgY29kZSBpcyBpbiBmYWN0IGN1cnJlbnRseSBpZGVudGljYWwKICoKICogIG8gQ1ZfQkdfTU9ERUxfTU9HOiAiTWl4dHVyZSBvZiBHYXVzc2lhbnMiLCBvbGRlciBhbGdvcml0aG0sIGRlc2NyaWJlZCBpbgogKgogKiAgICAgICBNb3ZpbmcgdGFyZ2V0IGNsYXNzaWZpY2F0aW9uIGFuZCB0cmFja2luZyBmcm9tIHJlYWwtdGltZSB2aWRlby4KICogICAgICAgQSBMaXB0b24sIEggRnVqaWpvc2hpLCBSIFBhdGlsCiAqICAgICAgIFByb2NlZWRpbmdzIElFRUUgV29ya3Nob3Agb24gQXBwbGljYXRpb24gb2YgQ29tcHV0ZXIgVmlzaW9uIHBwIDgtMTQgMTk5OAogKgogKiAgICAgICBMZWFybmluZyBwYXR0ZXJucyBvZiBhY3Rpdml0eSB1c2luZyByZWFsLXRpbWUgdHJhY2tpbmcKICogICAgICAgQyBTdGF1ZmZlciBhbmQgVyBHcmltc29uICBBdWd1c3QgMjAwMAogKiAgICAgICBJRUVFIFRyYW5zYWN0aW9ucyBvbiBQYXR0ZXJuIEFuYWx5c2lzIGFuZCBNYWNoaW5lIEludGVsbGlnZW5jZSAyMig4KTo3NDctNzU3CiAqLwoKCiNkZWZpbmUgQ1ZfQkdfTU9ERUxfRkdECQkwCiNkZWZpbmUgQ1ZfQkdfTU9ERUxfTU9HCQkxCQkJLyogIk1peHR1cmUgb2YgR2F1c3NpYW5zIi4JKi8KI2RlZmluZSBDVl9CR19NT0RFTF9GR0RfU0lNUExFCTIKCnN0cnVjdCBDdkJHU3RhdE1vZGVsOwoKdHlwZWRlZiB2b2lkIChDVl9DREVDTCAqIEN2UmVsZWFzZUJHU3RhdE1vZGVsKSggc3RydWN0IEN2QkdTdGF0TW9kZWwqKiBiZ19tb2RlbCApOwp0eXBlZGVmIGludCAoQ1ZfQ0RFQ0wgKiBDdlVwZGF0ZUJHU3RhdE1vZGVsKSggSXBsSW1hZ2UqIGN1cnJfZnJhbWUsIHN0cnVjdCBDdkJHU3RhdE1vZGVsKiBiZ19tb2RlbCApOwoKI2RlZmluZSBDVl9CR19TVEFUX01PREVMX0ZJRUxEUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50ICAgICAgICAgICAgIHR5cGU7IC8qdHlwZSBvZiBCRyBtb2RlbCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBDdlJlbGVhc2VCR1N0YXRNb2RlbCByZWxlYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIEN2VXBkYXRlQkdTdGF0TW9kZWwgdXBkYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgSXBsSW1hZ2UqICAgICAgIGJhY2tncm91bmQ7ICAgLyo4VUMzIHJlZmVyZW5jZSBiYWNrZ3JvdW5kIGltYWdlKi8gICAgICAgICAgICAgICBcCiAgICBJcGxJbWFnZSogICAgICAgZm9yZWdyb3VuZDsgICAvKjhVQzEgZm9yZWdyb3VuZCBpbWFnZSovICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIElwbEltYWdlKiogICAgICBsYXllcnM7ICAgICAgIC8qOFVDMyByZWZlcmVuY2UgYmFja2dyb3VuZCBpbWFnZSwgY2FuIGJlIG51bGwgKi8gXAogICAgaW50ICAgICAgICAgICAgIGxheWVyX2NvdW50OyAgLyogY2FuIGJlIHplcm8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBDdk1lbVN0b3JhZ2UqICAgc3RvcmFnZTsgICAgICAvKnN0b3JhZ2UgZm9yIJNmb3JlZ3JvdW5kX3JlZ2lvbnOUKi8gICAgICAgICAgICAgIFwKICAgIEN2U2VxKiAgICAgICAgICBmb3JlZ3JvdW5kX3JlZ2lvbnMgLypmb3JlZ3JvdW5kIG9iamVjdCBjb250b3VycyovCgp0eXBlZGVmIHN0cnVjdCBDdkJHU3RhdE1vZGVsCnsKICAgIENWX0JHX1NUQVRfTU9ERUxfRklFTERTKCk7Cn0KQ3ZCR1N0YXRNb2RlbDsKCi8vIAoKLy8gUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgQkdTdGF0TW9kZWwKQ1ZfSU5MSU5FIHZvaWQgY3ZSZWxlYXNlQkdTdGF0TW9kZWwoIEN2QkdTdGF0TW9kZWwqKiBiZ19tb2RlbCApCnsKICAgIGlmKCBiZ19tb2RlbCAmJiAqYmdfbW9kZWwgJiYgKCpiZ19tb2RlbCktPnJlbGVhc2UgKQogICAgICAgICgqYmdfbW9kZWwpLT5yZWxlYXNlKCBiZ19tb2RlbCApOwp9CgovLyBVcGRhdGVzIHN0YXRpc3RpY2FsIG1vZGVsIGFuZCByZXR1cm5zIG51bWJlciBvZiBmb3VuZCBmb3JlZ3JvdW5kIHJlZ2lvbnMKQ1ZfSU5MSU5FIGludCBjdlVwZGF0ZUJHU3RhdE1vZGVsKCBJcGxJbWFnZSogY3VycmVudF9mcmFtZSwgQ3ZCR1N0YXRNb2RlbCogIGJnX21vZGVsICkKewogICAgcmV0dXJuIGJnX21vZGVsICYmIGJnX21vZGVsLT51cGRhdGUgPyBiZ19tb2RlbC0+dXBkYXRlKCBjdXJyZW50X2ZyYW1lLCBiZ19tb2RlbCApIDogMDsKfQoKLy8gUGVyZm9ybXMgRkcgcG9zdC1wcm9jZXNzaW5nIHVzaW5nIHNlZ21lbnRhdGlvbgovLyAoYWxsIHBpeGVscyBvZiBhIHJlZ2lvbiB3aWxsIGJlIGNsYXNzaWZpZWQgYXMgZm9yZWdyb3VuZCBpZiBtYWpvcml0eSBvZiBwaXhlbHMgb2YgdGhlIHJlZ2lvbiBhcmUgRkcpLgovLyBwYXJhbWV0ZXJzOgovLyAgICAgIHNlZ21lbnRzIC0gcG9pbnRlciB0byByZXN1bHQgb2Ygc2VnbWVudGF0aW9uIChmb3IgZXhhbXBsZSBNZWFuU2hpZnRTZWdtZW50YXRpb24pCi8vICAgICAgYmdfbW9kZWwgLSBwb2ludGVyIHRvIEN2QkdTdGF0TW9kZWwgc3RydWN0dXJlCkNWQVBJKHZvaWQpIGN2UmVmaW5lRm9yZWdyb3VuZE1hc2tCeVNlZ20oIEN2U2VxKiBzZWdtZW50cywgQ3ZCR1N0YXRNb2RlbCogIGJnX21vZGVsICk7CgovKiBDb21tb24gdXNlIGNoYW5nZSBkZXRlY3Rpb24gZnVuY3Rpb24gKi8KQ1ZBUEkoaW50KSAgY3ZDaGFuZ2VEZXRlY3Rpb24oIElwbEltYWdlKiAgcHJldl9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiAgY3Vycl9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiAgY2hhbmdlX21hc2sgKTsKCi8qCiAgSW50ZXJmYWNlIG9mIEFDTSBNTTIwMDMgYWxnb3JpdGhtCiovCgovKiBEZWZhdWx0IHBhcmFtZXRlcnMgb2YgZm9yZWdyb3VuZCBkZXRlY3Rpb24gYWxnb3JpdGhtOiAqLwojZGVmaW5lICBDVl9CR0ZHX0ZHRF9MQyAgICAgICAgICAgICAgMTI4CiNkZWZpbmUgIENWX0JHRkdfRkdEX04xQyAgICAgICAgICAgICAxNQojZGVmaW5lICBDVl9CR0ZHX0ZHRF9OMkMgICAgICAgICAgICAgMjUKCiNkZWZpbmUgIENWX0JHRkdfRkdEX0xDQyAgICAgICAgICAgICA2NAojZGVmaW5lICBDVl9CR0ZHX0ZHRF9OMUNDICAgICAgICAgICAgMjUKI2RlZmluZSAgQ1ZfQkdGR19GR0RfTjJDQyAgICAgICAgICAgIDQwCgovKiBCYWNrZ3JvdW5kIHJlZmVyZW5jZSBpbWFnZSB1cGRhdGUgcGFyYW1ldGVyOiAqLwojZGVmaW5lICBDVl9CR0ZHX0ZHRF9BTFBIQV8xICAgICAgICAgMC4xZgoKLyogc3RhdCBtb2RlbCB1cGRhdGUgcGFyYW1ldGVyCiAqIDAuMDAyZiB+IDFLIGZyYW1lKH40NXNlYyksIDAuMDA1IH4gMThzZWMgKGlmIDI1ZnBzIGFuZCBhYnNvbHV0ZWx5IHN0YXRpYyBCRykKICovCiNkZWZpbmUgIENWX0JHRkdfRkdEX0FMUEhBXzIgICAgICAgICAwLjAwNWYKCi8qIHN0YXJ0IHZhbHVlIGZvciBhbHBoYSBwYXJhbWV0ZXIgKHRvIGZhc3QgaW5pdGlhdGUgc3RhdGlzdGljIG1vZGVsKSAqLwojZGVmaW5lICBDVl9CR0ZHX0ZHRF9BTFBIQV8zICAgICAgICAgMC4xZgoKI2RlZmluZSAgQ1ZfQkdGR19GR0RfREVMVEEgICAgICAgICAgIDIKCiNkZWZpbmUgIENWX0JHRkdfRkdEX1QgICAgICAgICAgICAgICAwLjlmCgojZGVmaW5lICBDVl9CR0ZHX0ZHRF9NSU5BUkVBICAgICAgICAgMTUuZgoKI2RlZmluZSAgQ1ZfQkdGR19GR0RfQkdfVVBEQVRFX1RSRVNIIDAuNWYKCi8qIFNlZSB0aGUgYWJvdmUtcmVmZXJlbmNlZCBMaS9IdWFuZy9HdS9UaWFuIHBhcGVyCiAqIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlc2UgYmFja2dyb3VuZC1tb2RlbAogKiB0dW5pbmcgcGFyYW1ldGVycy4KICoKICogTm9tZW5jbGF0dXJlOiAgJ2MnICA9PSAiY29sb3IiLCBhIHRocmVlLWNvbXBvbmVudCByZWQvZ3JlZW4vYmx1ZSB2ZWN0b3IuCiAqICAgICAgICAgICAgICAgICAgICAgICAgIFdlIHVzZSBoaXN0b2dyYW1zIG9mIHRoZXNlIHRvIG1vZGVsIHRoZSByYW5nZSBvZgogKiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMgd2UndmUgc2VlbiBhdCBhIGdpdmVuIGJhY2tncm91bmQgcGl4ZWwuCiAqCiAqICAgICAgICAgICAgICAgICdjYycgPT0gImNvbG9yIGNvLW9jY3VycmVuY2UiLCBhIHNpeC1jb21wb25lbnQgdmVjdG9yIGdpdmluZwogKiAgICAgICAgICAgICAgICAgICAgICAgICBSR0IgY29sb3IgZm9yIGJvdGggdGhpcyBmcmFtZSBhbmQgcHJlY2VkaW5nIGZyYW1lLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UgdXNlIGhpc3RvZ3JhbXMgb2YgdGhlc2UgdG8gbW9kZWwgdGhlIHJhbmdlIG9mCiAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIENIQU5HRVMgd2UndmUgc2VlbiBhdCBhIGdpdmVuIGJhY2tncm91bmQgcGl4ZWwuCiAqLwp0eXBlZGVmIHN0cnVjdCBDdkZHRFN0YXRNb2RlbFBhcmFtcwp7CiAgICBpbnQgICAgTGM7CQkJLyogUXVhbnRpemVkIGxldmVscyBwZXIgJ2NvbG9yJyBjb21wb25lbnQuIFBvd2VyIG9mIHR3bywgdHlwaWNhbGx5IDMyLCA2NCBvciAxMjguCQkJCSovCiAgICBpbnQgICAgTjFjOwkJCS8qIE51bWJlciBvZiBjb2xvciB2ZWN0b3JzIHVzZWQgdG8gbW9kZWwgbm9ybWFsIGJhY2tncm91bmQgY29sb3IgdmFyaWF0aW9uIGF0IGEgZ2l2ZW4gcGl4ZWwuCQkJKi8KICAgIGludCAgICBOMmM7CQkJLyogTnVtYmVyIG9mIGNvbG9yIHZlY3RvcnMgcmV0YWluZWQgYXQgZ2l2ZW4gcGl4ZWwuICBNdXN0IGJlID4gTjFjLCB0eXBpY2FsbHkgfiA1LzMgb2YgTjFjLgkJCSovCgkJCQkvKiBVc2VkIHRvIGFsbG93IHRoZSBmaXJzdCBOMWMgdmVjdG9ycyB0byBhZGFwdCBvdmVyIHRpbWUgdG8gY2hhbmdpbmcgYmFja2dyb3VuZC4JCQkJKi8KCiAgICBpbnQgICAgTGNjOwkJCS8qIFF1YW50aXplZCBsZXZlbHMgcGVyICdjb2xvciBjby1vY2N1cnJlbmNlJyBjb21wb25lbnQuICBQb3dlciBvZiB0d28sIHR5cGljYWxseSAxNiwgMzIgb3IgNjQuCQkJKi8KICAgIGludCAgICBOMWNjOwkJLyogTnVtYmVyIG9mIGNvbG9yIGNvLW9jY3VycmVuY2UgdmVjdG9ycyB1c2VkIHRvIG1vZGVsIG5vcm1hbCBiYWNrZ3JvdW5kIGNvbG9yIHZhcmlhdGlvbiBhdCBhIGdpdmVuIHBpeGVsLgkqLwogICAgaW50ICAgIE4yY2M7CQkvKiBOdW1iZXIgb2YgY29sb3IgY28tb2NjdXJyZW5jZSB2ZWN0b3JzIHJldGFpbmVkIGF0IGdpdmVuIHBpeGVsLiAgTXVzdCBiZSA+IE4xY2MsIHR5cGljYWxseSB+IDUvMyBvZiBOMWNjLgkqLwoJCQkJLyogVXNlZCB0byBhbGxvdyB0aGUgZmlyc3QgTjFjYyB2ZWN0b3JzIHRvIGFkYXB0IG92ZXIgdGltZSB0byBjaGFuZ2luZyBiYWNrZ3JvdW5kLgkJCQkqLwoKICAgIGludCAgICBpc19vYmpfd2l0aG91dF9ob2xlczsvKiBJZiBUUlVFIHdlIGlnbm9yZSBob2xlcyB3aXRoaW4gZm9yZWdyb3VuZCBibG9icy4gRGVmYXVsdHMgdG8gVFJVRS4JCQkJCQkqLwogICAgaW50ICAgIHBlcmZvcm1fbW9ycGhpbmc7CS8qIE51bWJlciBvZiBlcm9kZS1kaWxhdGUtZXJvZGUgZm9yZWdyb3VuZC1ibG9iIGNsZWFudXAgaXRlcmF0aW9ucy4JCQkJCQkqLwoJCQkJLyogVGhlc2UgZXJhc2Ugb25lLXBpeGVsIGp1bmsgYmxvYnMgYW5kIG1lcmdlIGFsbW9zdC10b3VjaGluZyBibG9icy4gRGVmYXVsdCB2YWx1ZSBpcyAxLgkJCSovCgogICAgZmxvYXQgIGFscGhhMTsJCS8qIEhvdyBxdWlja2x5IHdlIGZvcmdldCBvbGQgYmFja2dyb3VuZCBwaXhlbCB2YWx1ZXMgc2Vlbi4gIFR5cGljYWxseSBzZXQgdG8gMC4xICAJCQkJKi8KICAgIGZsb2F0ICBhbHBoYTI7CQkvKiAiQ29udHJvbHMgc3BlZWQgb2YgZmVhdHVyZSBsZWFybmluZyIuIERlcGVuZHMgb24gVC4gVHlwaWNhbCB2YWx1ZSBjaXJjYSAwLjAwNS4gCQkJCSovCiAgICBmbG9hdCAgYWxwaGEzOwkJLyogQWx0ZXJuYXRlIHRvIGFscGhhMiwgdXNlZCAoZS5nLikgZm9yIHF1aWNrZXIgaW5pdGlhbCBjb252ZXJnZW5jZS4gVHlwaWNhbCB2YWx1ZSAwLjEuCQkJCSovCgogICAgZmxvYXQgIGRlbHRhOwkJLyogQWZmZWN0cyBjb2xvciBhbmQgY29sb3IgY28tb2NjdXJyZW5jZSBxdWFudGl6YXRpb24sIHR5cGljYWxseSBzZXQgdG8gMi4JCQkJCSovCiAgICBmbG9hdCAgVDsJCQkvKiAiQSBwZXJjZW50YWdlIHZhbHVlIHdoaWNoIGRldGVybWluZXMgd2hlbiBuZXcgZmVhdHVyZXMgY2FuIGJlIHJlY29nbml6ZWQgYXMgbmV3IGJhY2tncm91bmQuIiAoVHlwaWNhbGx5IDAuOSkuKi8KICAgIGZsb2F0ICBtaW5BcmVhOwkJLyogRGlzY2FyZCBmb3JlZ3JvdW5kIGJsb2JzIHdob3NlIGJvdW5kaW5nIGJveCBpcyBzbWFsbGVyIHRoYW4gdGhpcyB0aHJlc2hvbGQuCQkJCQkqLwp9CkN2RkdEU3RhdE1vZGVsUGFyYW1zOwoKdHlwZWRlZiBzdHJ1Y3QgQ3ZCR1BpeGVsQ1N0YXRUYWJsZQp7CiAgICBmbG9hdCAgICAgICAgICBQdiwgUHZiOwogICAgdWNoYXIgICAgICAgICAgdlszXTsKfQpDdkJHUGl4ZWxDU3RhdFRhYmxlOwoKdHlwZWRlZiBzdHJ1Y3QgQ3ZCR1BpeGVsQ0NTdGF0VGFibGUKewogICAgZmxvYXQgICAgICAgICAgUHYsIFB2YjsKICAgIHVjaGFyICAgICAgICAgIHZbNl07Cn0KQ3ZCR1BpeGVsQ0NTdGF0VGFibGU7Cgp0eXBlZGVmIHN0cnVjdCBDdkJHUGl4ZWxTdGF0CnsKICAgIGZsb2F0ICAgICAgICAgICAgICAgICBQYmM7CiAgICBmbG9hdCAgICAgICAgICAgICAgICAgUGJjYzsKICAgIEN2QkdQaXhlbENTdGF0VGFibGUqICBjdGFibGU7CiAgICBDdkJHUGl4ZWxDQ1N0YXRUYWJsZSogY2N0YWJsZTsKICAgIHVjaGFyICAgICAgICAgICAgICAgICBpc190cmFpbmVkX3N0X21vZGVsOwogICAgdWNoYXIgICAgICAgICAgICAgICAgIGlzX3RyYWluZWRfZHluX21vZGVsOwp9CkN2QkdQaXhlbFN0YXQ7CgoKdHlwZWRlZiBzdHJ1Y3QgQ3ZGR0RTdGF0TW9kZWwKewogICAgQ1ZfQkdfU1RBVF9NT0RFTF9GSUVMRFMoKTsKICAgIEN2QkdQaXhlbFN0YXQqICAgICAgICAgcGl4ZWxfc3RhdDsKICAgIElwbEltYWdlKiAgICAgICAgICAgICAgRnRkOwogICAgSXBsSW1hZ2UqICAgICAgICAgICAgICBGYmQ7CiAgICBJcGxJbWFnZSogICAgICAgICAgICAgIHByZXZfZnJhbWU7CiAgICBDdkZHRFN0YXRNb2RlbFBhcmFtcyAgIHBhcmFtczsKfQpDdkZHRFN0YXRNb2RlbDsKCi8qIENyZWF0ZXMgRkdEIG1vZGVsICovCkNWQVBJKEN2QkdTdGF0TW9kZWwqKSBjdkNyZWF0ZUZHRFN0YXRNb2RlbCggSXBsSW1hZ2UqIGZpcnN0X2ZyYW1lLAogICAgICAgICAgICAgICAgICAgIEN2RkdEU3RhdE1vZGVsUGFyYW1zKiBwYXJhbWV0ZXJzIENWX0RFRkFVTFQoTlVMTCkpOwoKLyogCiAgIEludGVyZmFjZSBvZiBHYXVzc2lhbiBtaXh0dXJlIGFsZ29yaXRobQoKICAgIkFuIGltcHJvdmVkIGFkYXB0aXZlIGJhY2tncm91bmQgbWl4dHVyZSBtb2RlbCBmb3IgcmVhbC10aW1lIHRyYWNraW5nIHdpdGggc2hhZG93IGRldGVjdGlvbiIKICAgUC4gS2FkZXdUcmFLdVBvbmcgYW5kIFIuIEJvd2RlbiwKICAgUHJvYy4gMm5kIEV1cm9wZWFuIFdvcmtzaHAgb24gQWR2YW5jZWQgVmlkZW8tQmFzZWQgU3VydmVpbGxhbmNlIFN5c3RlbXMsIDIwMDEuIgogICBodHRwOi8vcGVyc29uYWwuZWUuc3VycmV5LmFjLnVrL1BlcnNvbmFsL1IuQm93ZGVuL3B1YmxpY2F0aW9ucy9hdmJzMDEvYXZiczAxLnBkZgoqLwoKLyogTm90ZTogICJNT0ciID09ICJNaXh0dXJlIE9mIEdhdXNzaWFucyI6ICovCgojZGVmaW5lIENWX0JHRkdfTU9HX01BWF9OR0FVU1NJQU5TIDUwMAoKLyogZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIGdhdXNzaWFuIGJhY2tncm91bmQgZGV0ZWN0aW9uIGFsZ29yaXRobSAqLwojZGVmaW5lIENWX0JHRkdfTU9HX0JBQ0tHUk9VTkRfVEhSRVNIT0xEICAgICAwLjcgICAgIC8qIHRocmVzaG9sZCBzdW0gb2Ygd2VpZ2h0cyBmb3IgYmFja2dyb3VuZCB0ZXN0ICovCiNkZWZpbmUgQ1ZfQkdGR19NT0dfU1REX1RIUkVTSE9MRCAgICAgICAgICAgIDIuNSAgICAgLyogbGFtYmRhPTIuNSBpcyA5OSUgKi8KI2RlZmluZSBDVl9CR0ZHX01PR19XSU5ET1dfU0laRSAgICAgICAgICAgICAgMjAwICAgICAvKiBMZWFybmluZyByYXRlOyBhbHBoYSA9IDEvQ1ZfR0JHX1dJTkRPV19TSVpFICovCiNkZWZpbmUgQ1ZfQkdGR19NT0dfTkdBVVNTSUFOUyAgICAgICAgICAgICAgIDUgICAgICAgLyogPSBLID0gbnVtYmVyIG9mIEdhdXNzaWFucyBpbiBtaXh0dXJlICovCiNkZWZpbmUgQ1ZfQkdGR19NT0dfV0VJR0hUX0lOSVQgICAgICAgICAgICAgIDAuMDUKI2RlZmluZSBDVl9CR0ZHX01PR19TSUdNQV9JTklUICAgICAgICAgICAgICAgMzAKI2RlZmluZSBDVl9CR0ZHX01PR19NSU5BUkVBICAgICAgICAgICAgICAgICAgMTUuZgoKCiNkZWZpbmUgQ1ZfQkdGR19NT0dfTkNPTE9SUyAgICAgICAgICAgICAgICAgIDMKCnR5cGVkZWYgc3RydWN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcwp7ICAgIAogICAgaW50ICAgICB3aW5fc2l6ZTsgICAgICAgICAgICAgICAvKiA9IDEvYWxwaGEgKi8KICAgIGludCAgICAgbl9nYXVzczsKICAgIGRvdWJsZSAgYmdfdGhyZXNob2xkLCBzdGRfdGhyZXNob2xkLCBtaW5BcmVhOwogICAgZG91YmxlICB3ZWlnaHRfaW5pdCwgdmFyaWFuY2VfaW5pdDsKfUN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtczsKCnR5cGVkZWYgc3RydWN0IEN2R2F1c3NCR1ZhbHVlcwp7CiAgICBpbnQgICAgICAgICBtYXRjaF9zdW07CiAgICBkb3VibGUgICAgICB3ZWlnaHQ7CiAgICBkb3VibGUgICAgICB2YXJpYW5jZVtDVl9CR0ZHX01PR19OQ09MT1JTXTsKICAgIGRvdWJsZSAgICAgIG1lYW5bQ1ZfQkdGR19NT0dfTkNPTE9SU107Cn0KQ3ZHYXVzc0JHVmFsdWVzOwoKdHlwZWRlZiBzdHJ1Y3QgQ3ZHYXVzc0JHUG9pbnQKewogICAgQ3ZHYXVzc0JHVmFsdWVzKiBnX3ZhbHVlczsKfQpDdkdhdXNzQkdQb2ludDsKCgp0eXBlZGVmIHN0cnVjdCBDdkdhdXNzQkdNb2RlbAp7CiAgICBDVl9CR19TVEFUX01PREVMX0ZJRUxEUygpOwogICAgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICAgcGFyYW1zOyAgICAKICAgIEN2R2F1c3NCR1BvaW50KiAgICAgICAgICAgIGdfcG9pbnQ7ICAgIAogICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY291bnRGcmFtZXM7Cn0KQ3ZHYXVzc0JHTW9kZWw7CgoKLyogQ3JlYXRlcyBHYXVzc2lhbiBtaXh0dXJlIGJhY2tncm91bmQgbW9kZWwgKi8KQ1ZBUEkoQ3ZCR1N0YXRNb2RlbCopIGN2Q3JlYXRlR2F1c3NpYW5CR01vZGVsKCBJcGxJbWFnZSogZmlyc3RfZnJhbWUsCiAgICAgICAgICAgICAgICBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMqIHBhcmFtZXRlcnMgQ1ZfREVGQVVMVChOVUxMKSk7CgoKdHlwZWRlZiBzdHJ1Y3QgQ3ZCR0NvZGVCb29rRWxlbQp7CiAgICBzdHJ1Y3QgQ3ZCR0NvZGVCb29rRWxlbSogbmV4dDsKICAgIGludCB0TGFzdFVwZGF0ZTsKICAgIGludCBzdGFsZTsKICAgIHVjaGFyIGJveE1pblszXTsKICAgIHVjaGFyIGJveE1heFszXTsKICAgIHVjaGFyIGxlYXJuTWluWzNdOwogICAgdWNoYXIgbGVhcm5NYXhbM107Cn0KQ3ZCR0NvZGVCb29rRWxlbTsKCnR5cGVkZWYgc3RydWN0IEN2QkdDb2RlQm9va01vZGVsCnsKICAgIEN2U2l6ZSBzaXplOwogICAgaW50IHQ7CiAgICB1Y2hhciBjYkJvdW5kc1szXTsKICAgIHVjaGFyIG1vZE1pblszXTsKICAgIHVjaGFyIG1vZE1heFszXTsKICAgIEN2QkdDb2RlQm9va0VsZW0qKiBjYm1hcDsKICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZTsKICAgIEN2QkdDb2RlQm9va0VsZW0qIGZyZWVMaXN0Owp9CkN2QkdDb2RlQm9va01vZGVsOwoKQ1ZBUEkoQ3ZCR0NvZGVCb29rTW9kZWwqKSBjdkNyZWF0ZUJHQ29kZUJvb2tNb2RlbCgpOwpDVkFQSSh2b2lkKSBjdlJlbGVhc2VCR0NvZGVCb29rTW9kZWwoIEN2QkdDb2RlQm9va01vZGVsKiogbW9kZWwgKTsKCkNWQVBJKHZvaWQpIGN2QkdDb2RlQm9va1VwZGF0ZSggQ3ZCR0NvZGVCb29rTW9kZWwqIG1vZGVsLCBjb25zdCBDdkFyciogaW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHJvaSBDVl9ERUZBVUxUKGN2UmVjdCgwLDAsMCwwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVCgwKSApOwoKQ1ZBUEkoaW50KSBjdkJHQ29kZUJvb2tEaWZmKCBjb25zdCBDdkJHQ29kZUJvb2tNb2RlbCogbW9kZWwsIGNvbnN0IEN2QXJyKiBpbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogZmdtYXNrLCBDdlJlY3Qgcm9pIENWX0RFRkFVTFQoY3ZSZWN0KDAsMCwwLDApKSApOwoKQ1ZBUEkodm9pZCkgY3ZCR0NvZGVCb29rQ2xlYXJTdGFsZSggQ3ZCR0NvZGVCb29rTW9kZWwqIG1vZGVsLCBpbnQgc3RhbGVUaHJlc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCByb2kgQ1ZfREVGQVVMVChjdlJlY3QoMCwwLDAsMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKDApICk7CgpDVkFQSShDdlNlcSopIGN2U2VnbWVudEZHTWFzayggQ3ZBcnIgKmZnbWFzaywgaW50IHBvbHkxSHVsbDAgQ1ZfREVGQVVMVCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBlcmltU2NhbGUgQ1ZfREVGQVVMVCg0LmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlIENWX0RFRkFVTFQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IG9mZnNldCBDVl9ERUZBVUxUKGN2UG9pbnQoMCwwKSkpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxpYnJhdGlvbiBlbmdpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIGVudW0gQ3ZDYWxpYkV0YWxvblR5cGUKewogICAgQ1ZfQ0FMSUJfRVRBTE9OX1VTRVIgPSAtMSwKICAgIENWX0NBTElCX0VUQUxPTl9DSEVTU0JPQVJEID0gMCwKICAgIENWX0NBTElCX0VUQUxPTl9DSEVDS0VSQk9BUkQgPSBDVl9DQUxJQl9FVEFMT05fQ0hFU1NCT0FSRAp9CkN2Q2FsaWJFdGFsb25UeXBlOwoKY2xhc3MgQ1ZfRVhQT1JUUyBDdkNhbGliRmlsdGVyCnsKcHVibGljOgogICAgLyogQ29uc3RydWN0b3IgJiBkZXN0cnVjdG9yICovCiAgICBDdkNhbGliRmlsdGVyKCk7CiAgICB2aXJ0dWFsIH5DdkNhbGliRmlsdGVyKCk7CgogICAgLyogU2V0cyBldGFsb24gdHlwZSAtIG9uZSBmb3IgYWxsIGNhbWVyYXMuCiAgICAgICBldGFsb25QYXJhbXMgaXMgdXNlZCBpbiBjYXNlIG9mIHByZS1kZWZpbmVkIGV0YWxvbnMgKHN1Y2ggYXMgY2hlc3Nib2FyZCkuCiAgICAgICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZXRhbG9uUGFyYW1zIGlzIGRldGVybWluZWQgYnkgZXRhbG9uVHlwZS4KICAgICAgIEUuZy4sIGlmIGV0YWxvbiB0eXBlIGlzIENWX0VUQUxPTl9UWVBFX0NIRVNTQk9BUkQgdGhlbjoKICAgICAgICAgZXRhbG9uUGFyYW1zWzBdIGlzIG51bWJlciBvZiBzcXVhcmVzIHBlciBvbmUgc2lkZSBvZiBldGFsb24KICAgICAgICAgZXRhbG9uUGFyYW1zWzFdIGlzIG51bWJlciBvZiBzcXVhcmVzIHBlciBhbm90aGVyIHNpZGUgb2YgZXRhbG9uCiAgICAgICAgIGV0YWxvblBhcmFtc1syXSBpcyBsaW5lYXIgc2l6ZSBvZiBzcXVhcmVzIGluIHRoZSBib2FyZCBpbiBhcmJpdHJhcnkgdW5pdHMuCiAgICAgICBwb2ludENvdW50ICYgcG9pbnRzIGFyZSB1c2VkIGluIGNhc2Ugb2YKICAgICAgIENWX0NBTElCX0VUQUxPTl9VU0VSICh1c2VyLWRlZmluZWQpIGV0YWxvbi4gKi8KICAgIHZpcnR1YWwgYm9vbAogICAgICAgIFNldEV0YWxvbiggQ3ZDYWxpYkV0YWxvblR5cGUgZXRhbG9uVHlwZSwgZG91YmxlKiBldGFsb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgICBpbnQgcG9pbnRDb3VudCA9IDAsIEN2UG9pbnQyRDMyZiogcG9pbnRzID0gMCApOwoKICAgIC8qIFJldHJpZXZlcyBldGFsb24gcGFyYW1ldGVycy9vciBhbmQgcG9pbnRzICovCiAgICB2aXJ0dWFsIEN2Q2FsaWJFdGFsb25UeXBlCiAgICAgICAgR2V0RXRhbG9uKCBpbnQqIHBhcmFtQ291bnQgPSAwLCBjb25zdCBkb3VibGUqKiBldGFsb25QYXJhbXMgPSAwLAogICAgICAgICAgICAgICAgICAgaW50KiBwb2ludENvdW50ID0gMCwgY29uc3QgQ3ZQb2ludDJEMzJmKiogZXRhbG9uUG9pbnRzID0gMCApIGNvbnN0OwoKICAgIC8qIFNldHMgbnVtYmVyIG9mIGNhbWVyYXMgY2FsaWJyYXRlZCBzaW11bHRhbmVvdXNseS4gSXQgaXMgZXF1YWwgdG8gMSBpbml0aWFsbHkgKi8KICAgIHZpcnR1YWwgdm9pZCBTZXRDYW1lcmFDb3VudCggaW50IGNhbWVyYUNvdW50ICk7CgogICAgLyogUmV0cmlldmVzIG51bWJlciBvZiBjYW1lcmFzICovCiAgICBpbnQgR2V0Q2FtZXJhQ291bnQoKSBjb25zdCB7IHJldHVybiBjYW1lcmFDb3VudDsgfQoKICAgIC8qIFN0YXJ0cyBjYW1lcmFzIGNhbGlicmF0aW9uICovCiAgICB2aXJ0dWFsIGJvb2wgU2V0RnJhbWVzKCBpbnQgdG90YWxGcmFtZXMgKTsKICAgIAogICAgLyogU3RvcHMgY2FtZXJhcyBjYWxpYnJhdGlvbiAqLwogICAgdmlydHVhbCB2b2lkIFN0b3AoIGJvb2wgY2FsaWJyYXRlID0gZmFsc2UgKTsKCiAgICAvKiBSZXRyaWV2ZXMgbnVtYmVyIG9mIGNhbWVyYXMgKi8KICAgIGJvb2wgSXNDYWxpYnJhdGVkKCkgY29uc3QgeyByZXR1cm4gaXNDYWxpYnJhdGVkOyB9CgogICAgLyogRmVlZHMgYW5vdGhlciBzZXJpZSBvZiBzbmFwc2hvdHMgKG9uZSBwZXIgZWFjaCBjYW1lcmEpIHRvIGZpbHRlci4KICAgICAgIEV0YWxvbiBwb2ludHMgb24gdGhlc2UgaW1hZ2VzIGFyZSBmb3VuZCBhdXRvbWF0aWNhbGx5LgogICAgICAgSWYgdGhlIGZ1bmN0aW9uIGNhbid0IGxvY2F0ZSBwb2ludHMsIGl0IHJldHVybnMgZmFsc2UgKi8KICAgIHZpcnR1YWwgYm9vbCBGaW5kRXRhbG9uKCBJcGxJbWFnZSoqIGltZ3MgKTsKCiAgICAvKiBUaGUgc2FtZSBidXQgdGFrZXMgbWF0cmljZXMgKi8KICAgIHZpcnR1YWwgYm9vbCBGaW5kRXRhbG9uKCBDdk1hdCoqIGltZ3MgKTsKCiAgICAvKiBMb3dlci1sZXZlbCBmdW5jdGlvbiBmb3IgZmVlZGluZyBmaWx0ZXIgd2l0aCBhbHJlYWR5IGZvdW5kIGV0YWxvbiBwb2ludHMuCiAgICAgICBBcnJheSBvZiBwb2ludCBhcnJheXMgZm9yIGVhY2ggY2FtZXJhIGlzIHBhc3NlZC4gKi8KICAgIHZpcnR1YWwgYm9vbCBQdXNoKCBjb25zdCBDdlBvaW50MkQzMmYqKiBwb2ludHMgPSAwICk7CgogICAgLyogUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgYWNjZXB0ZWQgZnJhbWVzIGFuZCwgb3B0aW9uYWxseSwKICAgICAgIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgdG8gY29sbGVjdCAqLwogICAgdmlydHVhbCBpbnQgR2V0RnJhbWVDb3VudCggaW50KiBmcmFtZXNUb3RhbCA9IDAgKSBjb25zdDsKCiAgICAvKiBSZXRyaWV2ZXMgY2FtZXJhIHBhcmFtZXRlcnMgZm9yIHNwZWNpZmllZCBjYW1lcmEuCiAgICAgICBJZiBjYW1lcmEgaXMgbm90IGNhbGlicmF0ZWQgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCAqLwogICAgdmlydHVhbCBjb25zdCBDdkNhbWVyYSogR2V0Q2FtZXJhUGFyYW1zKCBpbnQgaWR4ID0gMCApIGNvbnN0OwoKICAgIHZpcnR1YWwgY29uc3QgQ3ZTdGVyZW9DYW1lcmEqIEdldFN0ZXJlb1BhcmFtcygpIGNvbnN0OwoKICAgIC8qIFNldHMgY2FtZXJhIHBhcmFtZXRlcnMgZm9yIGFsbCBjYW1lcmFzICovCiAgICB2aXJ0dWFsIGJvb2wgU2V0Q2FtZXJhUGFyYW1zKCBDdkNhbWVyYSogcGFyYW1zICk7CgogICAgLyogU2F2ZXMgYWxsIGNhbWVyYSBwYXJhbWV0ZXJzIHRvIGZpbGUgKi8KICAgIHZpcnR1YWwgYm9vbCBTYXZlQ2FtZXJhUGFyYW1zKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOwogICAgCiAgICAvKiBMb2FkcyBhbGwgY2FtZXJhIHBhcmFtZXRlcnMgZnJvbSBmaWxlICovCiAgICB2aXJ0dWFsIGJvb2wgTG9hZENhbWVyYVBhcmFtcyggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKCiAgICAvKiBVbmRpc3RvcnRzIGltYWdlcyB1c2luZyBjYW1lcmEgcGFyYW1ldGVycy4gU29tZSBvZiBzcmMgcG9pbnRlcnMgY2FuIGJlIE5VTEwuICovCiAgICB2aXJ0dWFsIGJvb2wgVW5kaXN0b3J0KCBJcGxJbWFnZSoqIHNyYywgSXBsSW1hZ2UqKiBkc3QgKTsKCiAgICAvKiBVbmRpc3RvcnRzIGltYWdlcyB1c2luZyBjYW1lcmEgcGFyYW1ldGVycy4gU29tZSBvZiBzcmMgcG9pbnRlcnMgY2FuIGJlIE5VTEwuICovCiAgICB2aXJ0dWFsIGJvb2wgVW5kaXN0b3J0KCBDdk1hdCoqIHNyYywgQ3ZNYXQqKiBkc3QgKTsKCiAgICAvKiBSZXR1cm5zIGFycmF5IG9mIGV0YWxvbiBwb2ludHMgZGV0ZWN0ZWQvcGFydGFsbHkgZGV0ZWN0ZWQKICAgICAgIG9uIHRoZSBsYXRlc3QgZnJhbWUgZm9yIGlkeC10aCBjYW1lcmEgKi8KICAgIHZpcnR1YWwgYm9vbCBHZXRMYXRlc3RQb2ludHMoIGludCBpZHgsIEN2UG9pbnQyRDMyZioqIHB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvdW50LCBib29sKiBmb3VuZCApOwoKICAgIC8qIERyYXcgdGhlIGxhdGVzdCBkZXRlY3RlZC9wYXJ0aWFsbHkgZGV0ZWN0ZWQgZXRhbG9uICovCiAgICB2aXJ0dWFsIHZvaWQgRHJhd1BvaW50cyggSXBsSW1hZ2UqKiBkc3QgKTsKCiAgICAvKiBEcmF3IHRoZSBsYXRlc3QgZGV0ZWN0ZWQvcGFydGlhbGx5IGRldGVjdGVkIGV0YWxvbiAqLwogICAgdmlydHVhbCB2b2lkIERyYXdQb2ludHMoIEN2TWF0KiogZHN0ICk7CgogICAgdmlydHVhbCBib29sIFJlY3RpZnkoIElwbEltYWdlKiogc3JjYXJyLCBJcGxJbWFnZSoqIGRzdGFyciApOwogICAgdmlydHVhbCBib29sIFJlY3RpZnkoIEN2TWF0Kiogc3JjYXJyLCBDdk1hdCoqIGRzdGFyciApOwoKcHJvdGVjdGVkOgoKICAgIGVudW0geyBNQVhfQ0FNRVJBUyA9IDMgfTsKCiAgICAvKiBldGFsb24gZGF0YSAqLwogICAgQ3ZDYWxpYkV0YWxvblR5cGUgIGV0YWxvblR5cGU7CiAgICBpbnQgICAgIGV0YWxvblBhcmFtQ291bnQ7CiAgICBkb3VibGUqIGV0YWxvblBhcmFtczsKICAgIGludCAgICAgZXRhbG9uUG9pbnRDb3VudDsKICAgIEN2UG9pbnQyRDMyZiogZXRhbG9uUG9pbnRzOwogICAgQ3ZTaXplICBpbWdTaXplOwogICAgQ3ZNYXQqICBncmF5SW1nOwogICAgQ3ZNYXQqICB0ZW1wSW1nOwogICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlOwoKICAgIC8qIGNhbWVyYSBkYXRhICovCiAgICBpbnQgICAgIGNhbWVyYUNvdW50OwogICAgQ3ZDYW1lcmEgY2FtZXJhUGFyYW1zW01BWF9DQU1FUkFTXTsKICAgIEN2U3RlcmVvQ2FtZXJhIHN0ZXJlbzsKICAgIEN2UG9pbnQyRDMyZiogcG9pbnRzW01BWF9DQU1FUkFTXTsKICAgIEN2TWF0KiAgdW5kaXN0TWFwW01BWF9DQU1FUkFTXVsyXTsKICAgIEN2TWF0KiAgdW5kaXN0SW1nOwogICAgaW50ICAgICBsYXRlc3RDb3VudHNbTUFYX0NBTUVSQVNdOwogICAgQ3ZQb2ludDJEMzJmKiBsYXRlc3RQb2ludHNbTUFYX0NBTUVSQVNdOwogICAgQ3ZNYXQqICByZWN0TWFwW01BWF9DQU1FUkFTXVsyXTsKCiAgICAvKiBBZGRlZCBieSBWYWxlcnkgKi8KICAgIC8vQ3ZTdGVyZW9DYW1lcmEgc3RlcmVvUGFyYW1zOwoKICAgIGludCAgICAgbWF4UG9pbnRzOwogICAgaW50ICAgICBmcmFtZXNUb3RhbDsKICAgIGludCAgICAgZnJhbWVzQWNjZXB0ZWQ7CiAgICBib29sICAgIGlzQ2FsaWJyYXRlZDsKfTsKCiNpbmNsdWRlICJjdmF1eC5ocHAiCiNpbmNsdWRlICJjdnZpZHN1cnYuaHBwIgovKiNpbmNsdWRlICJjdm1hdC5ocHAiKi8KI2VuZGlmCgojZW5kaWYKCi8qIEVuZCBvZiBmaWxlLiAqLwo=