Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCiAqCiAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9ucyByZWxhdGVkIHRvIFdFUCBrZXkgY29kaW5nL2RlY29kaW5nLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KCiNpbmNsdWRlIDx3bF9lbmMuaD4KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBnbG9iYWwgZGVmaW5pdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIERCRwoKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CgojZW5kaWYgIC8qIERCRyAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2VwX2NvZGUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGEgc2V0IG9mIHdlcCBrZXlzIGZvciBwcml2YWN5CiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHN6Q3J5cHQgLQogKiAgICAgIHN6RGVzdCAgLQogKiAgICAgIERhdGEgICAgLQogKiAgICAgIG5MZW4gICAgLQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBPSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfd2VwX2NvZGUoIGNoYXIgKnN6Q3J5cHQsIGNoYXIgKnN6RGVzdCwgdm9pZCAqRGF0YSwgaW50IG5MZW4gKQp7CiAgICBpbnQgICAgIGk7CiAgICBpbnQgICAgIHQ7CiAgICBpbnQgICAgIGsgOwogICAgY2hhciAgICBiaXRzOwogICAgY2hhciAgICAqc3pEYXRhID0gKGNoYXIgKikgRGF0YTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgZm9yKCBpID0gYml0cyA9IDAgOyBpIDwgTUFDQUREUkVTU19TVFJfTEVOOyBpKysgKSB7CgkgICAgYml0cyBePSBzekNyeXB0W2ldOwoJICAgIGJpdHMgKz0gc3pDcnlwdFtpXTsKICAgIH0KCiAgICBmb3IoIGkgPSB0ID0gKnN6RGVzdCA9IDA7IGkgPCBuTGVuOyBpKyssIHQrKyApIHsKCSAgICBrID0gc3pEYXRhW2ldIF4gKCBiaXRzICsgaSApOwoKCiAgICAgICAgc3dpdGNoKCBpICUgMyApIHsKCiAgICAgICAgY2FzZSAwIDoKCiAgICAgICAgICAgIHN6RGVzdFt0XSAgID0gKChrICYgMHhGQykgPj4gMikgKyBDSF9TVEFSVCA7CgkJCXN6RGVzdFt0KzFdID0gKChrICYgMHgwMykgPDwgNCkgKyBDSF9TVEFSVCA7CgkgICAgICAgIHN6RGVzdFt0KzJdID0gJ1wwJzsKCiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgY2FzZSAxIDoKCiAgICAgICAgICAgIHN6RGVzdFt0XSAgKz0gKCggayAmIDB4RjAgKSA+PiA0ICk7CgkJCXN6RGVzdFt0KzFdID0gKCggayAmIDB4MEYgKSA8PCAyICkgKyBDSF9TVEFSVCA7CgkgICAgICAgIHN6RGVzdFt0KzJdID0gJ1wwJzsKCiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgY2FzZSAyIDoKCiAgICAgICAgICAgIHN6RGVzdFt0XSAgKz0gKCggayAmIDB4QzAgKSA+PiA2ICk7CgkJCXN6RGVzdFt0KzFdID0gKCBrICYgMHgzRiApICsgQ0hfU1RBUlQgOwoJICAgICAgICBzekRlc3RbdCsyXSA9ICdcMCc7CgkgICAgICAgIHQrKzsKCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4oIHN0cmxlbiggc3pEZXN0ICkpIDsKCn0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dlcF9kZWNvZGUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGEgc2V0IG9mIFdFUCBrZXlzIGZvciB1c2UgYnkgdGhlIGNhcmQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHN6Q3J5cHQgLQogKiAgICAgIHN6RGVzdCAgLQogKiAgICAgIERhdGEgICAgLQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBPSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfd2VwX2RlY29kZSggY2hhciAqc3pDcnlwdCwgdm9pZCAqRGVzdCwgY2hhciAqc3pEYXRhICkKewogICAgaW50ICAgICBpOwogICAgaW50ICAgICB0OwogICAgaW50ICAgICBuTGVuOwogICAgY2hhciAgICBiaXRzOwogICAgY2hhciAgICAqc3pEZXN0ID0gRGVzdDsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICBmb3IoIGkgPSBiaXRzID0gMCA7IGkgPCAxMjsgaSsrICkgewogICAgICBiaXRzIF49IHN6Q3J5cHRbaV0gOwogICAgICBiaXRzICs9IHN6Q3J5cHRbaV0gOwogIH0KCiAgbkxlbiA9ICggc3RybGVuKCBzekRhdGEgKSAqIDMpIC8gNCA7CgogIGZvciggaSA9IHQgPSAwOyBpIDwgbkxlbjsgaSsrLCB0KysgKSB7CiAgICAgIHN3aXRjaCggaSAlIDMgKSB7CiAgICAgIGNhc2UgMCA6CgogICAgICAgICAgc3pEZXN0W2ldID0gKCgoIHN6RGF0YVt0XS1DSF9TVEFSVCApICYgMHgzZiApIDw8IDIgKSArCiAgICAgICAgICAgICAgICAgICAgICAoKCggc3pEYXRhW3QrMV0tQ0hfU1RBUlQgKSAmIDB4MzAgKSA+PiA0ICk7CgkgICAgICBicmVhazsKCgogICAgICBjYXNlIDEgOgogICAgICAgICAgc3pEZXN0W2ldID0gKCgoIHN6RGF0YVt0XS1DSF9TVEFSVCApICYgMHgwZiApIDw8IDQgKSArCiAgICAgICAgICAgICAgICAgICAgICAoKCggc3pEYXRhW3QrMV0tQ0hfU1RBUlQgKSAmIDB4M2MgKSA+PiAyICk7CgkgICAgICBicmVhazsKCgogICAgICBjYXNlIDIgOgogICAgICAgICAgc3pEZXN0W2ldID0gKCgoIHN6RGF0YVt0XS1DSF9TVEFSVCApICYgMHgwMyApIDw8IDYgKSArCiAgICAgICAgICAgICAgICAgICAgICAgKCggc3pEYXRhW3QrMV0tQ0hfU1RBUlQgKSAmIDB4M2YgKTsKCSAgICAgIHQrKzsKCSAgICAgIGJyZWFrOwogICAgICB9CgoJc3pEZXN0W2ldIF49ICggYml0cyArIGkgKSA7CgogIH0KCiAgcmV0dXJuKCBpICkgOwoKfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoK