From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24423 invoked by alias); 14 Dec 2012 11:37:52 -0000 Received: (qmail 24413 invoked by uid 22791); 14 Dec 2012 11:37:51 -0000 X-SWARE-Spam-Status: No, hits=-3.8 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KAM_STOCKGEN,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_CP,TW_EG,TW_RV,TW_TR X-Spam-Check-By: sourceware.org Received: from mail-bk0-f41.google.com (HELO mail-bk0-f41.google.com) (209.85.214.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 14 Dec 2012 11:37:35 +0000 Received: by mail-bk0-f41.google.com with SMTP id jg9so1603938bkc.0 for ; Fri, 14 Dec 2012 03:37:33 -0800 (PST) Received: by 10.204.153.197 with SMTP id l5mr2580440bkw.80.1355485053619; Fri, 14 Dec 2012 03:37:33 -0800 (PST) MIME-Version: 1.0 Received: by 10.204.226.140 with HTTP; Fri, 14 Dec 2012 03:36:52 -0800 (PST) In-Reply-To: <878v9k5g46.fsf@fleche.redhat.com> References: <50AC3217.6040608@mentor.com> <878v9k5g46.fsf@fleche.redhat.com> From: Hui Zhu Date: Fri, 14 Dec 2012 11:37:00 -0000 Message-ID: Subject: Re: [PATCH] Add CTF support to GDB [1/4] Add "-ctf" to tsave command To: Tom Tromey Cc: Hui Zhu , gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary=0015175d072a1e8db204d0ce7528 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-12/txt/msg00492.txt.bz2 --0015175d072a1e8db204d0ce7528 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 9920 On Fri, Nov 30, 2012 at 4:06 AM, Tom Tromey wrote: >>>>>> "Hui" == Hui Zhu writes: > > Hui> This patch is for the CTF write. > Hui> It add "-ctf" to tsave command. With this option, tsave can save > Hui> current trace frame to CTF file format. > > Hui> +struct ctf_save_collect_s > Hui> +{ > Hui> + struct ctf_save_collect_s *next; > Hui> + char *str; > Hui> + char *ctf_str; > Hui> + int align_size; > Hui> + struct expression *expr; > Hui> + struct type *type; > Hui> + int is_ret; > Hui> +}; > > Like Hafiz said -- comments would be nice. I added some comments in the new patches. > > Hui> +static void > Hui> +ctf_save_fwrite (FILE *fd, const gdb_byte *buf, size_t size) > Hui> +{ > Hui> + if (fwrite (buf, size, 1, fd) != 1) > Hui> + error (_("Unable to write file for saving trace data (%s)"), > Hui> + safe_strerror (errno)); > > Why not use the existing ui_file code? > > Then you could remove this function plus several others. > > Maybe it is because you need fseek, but that seems like a simple > addition to ui_file. I still not update this part because fseek patch is still not OK. And after discussion with Pedro, I was really worry about change to ui_file will make CTF write doesn't have error check. Could you help me with it? > > Hui> + case TYPE_CODE_ARRAY: > Hui> + for (; TYPE_CODE (type) == TYPE_CODE_ARRAY; > Hui> + type = TYPE_TARGET_TYPE (type)) > Hui> + ; > > You probably want some check_typedef calls in there. Because typedef will be handle as a type in this part, so this part doesn't need check_typedef. > > Hui> + ctf_save_type_name_write (tcsp, TYPE_FIELD_TYPE (type, biggest_id)); > > Here too. I think this part is same with array. > > Hui> + ctf_save_fwrite_format (tcsp->metadata_fd, "%s", TYPE_NAME (type)); > > What if TYPE_NAME is NULL? Add code handle it like TYPE_CODE_STRUCT. > > Hui> +static void > Hui> +ctf_save_type_size_write (struct ctf_save_s *tcsp, struct type *type) > Hui> +{ > Hui> + if (TYPE_CODE (type) == TYPE_CODE_ARRAY) > Hui> + { > Hui> + for (; TYPE_CODE (type) == TYPE_CODE_ARRAY; > Hui> + type = TYPE_TARGET_TYPE (type)) > > check_typedef This is function will call itself to post all the define of type to file. So It don't need check_typedef. > > Hui> + if (TYPE_NAME (type) && (strcmp (TYPE_NAME (type), "uint32_t") == 0 > Hui> + || strcmp (TYPE_NAME (type), "uint64_t") == 0)) > Hui> + return; > > check_typedef. > > Also it seems like this clause should go in the TYPE_CODE_INT case. > > Hui> + > Hui> + switch (TYPE_CODE (type)) > Hui> + { > Hui> + case TYPE_CODE_TYPEDEF: > Hui> + ctf_save_fwrite_format (tcsp->metadata_fd, "typedef "); > Hui> + ctf_save_var_define_write (tcsp, TYPE_TARGET_TYPE (type), > > check_typedef; though if your intent is to peel just a single layer, > then it is a bit trickier -- I think the best you can do is always call > it, then use TYPE_TARGET_TYPE if it is non-NULL or the result of > check_typedef otherwise. If use check_typedef, this part will generate the define that different with the type descriptor of the code. For example: Following is the define in the code: typedef char test_t1; typedef test_t1 test_t2; typedef test_t2 test_t3; If use TYPE_TARGET_TYPE, it will generate following metadata: typedef char test_t1; typedef test_t1 test_t2; typedef test_t2 test_t3; If use check_typedef, it will generate following metadata: typedef char test_t1; typedef char test_t2; typedef char test_t3; > > Hui> + tcsp->tab = tab; > [...] > Hui> + tcsp->tab = old_tab; > > No idea if it matters, but if an exception is thrown during the '...' > code, then the 'tab' field will be left set improperly. Please don't worry about this part. This tab always be set to local value in stack. So even if it is drop, it will not affect anything. For example: char tab[256]; const char *old_tab; old_tab = tcsp->tab; snprintf (tab, 256, "%s\t", old_tab); tcsp->tab = tab; [...] tcsp->tab = old_tab; > > Hui> + case TYPE_CODE_PTR: > Hui> + align_size = TYPE_LENGTH (type); > Hui> + break; > > Surely the alignment rules are ABI dependent. > I would guess that what you have will work in many cases, but definitely > not all of them. All the type will be handle and record in function ctf_save_type_check_and_write. The size align will be handle in this function too. > > Hui> + frame = get_current_frame (); > Hui> + if (!frame) > Hui> + error (_("get current frame fail")); > Hui> + frame = get_prev_frame (frame); > Hui> + if (!frame) > Hui> + error (_("get prev frame fail")); > > These messages could be improved. > > Hui> + warning (_("\ > Hui> +Not save \"%s\" of tracepoint %d to ctf file because get its value fail: %s"), > Hui> + str, tps->tp->base.number, e.message); > > Likewise. Could you help me with this part? :) > > Hui> + /* XXX: no sure about variable_length > Hui> + and need set is_variable_length if need. */ > Hui> + collect->align_size = align_size; > Hui> + if (collect->align_size > tps->align_size) > Hui> + tps->align_size = collect->align_size; > > No new FIXME comments. > Can you find the answer to this question and either fix the code or drop > the comment? Fixed. > > Hui> + char name[strlen (print_name) + 1]; > > I think you need an explicit alloca here. > Or xmalloc + xfree, which is probably better. Fixed. > > Although, this approach just seems weird, since it seems like you > already have the symbol and you want its value; constructing and parsing > an expression to get this is very roundabout. > > I'm not sure I really understand the goal here; but the parsing approach > is particularly fragile if you have shadowing. Function ctf_save_collect_get will parse the collect string and add them to struct. Each tracepoint will call this function just once. The code that try to get the value is in function ctf_save: back_chain = make_cleanup (null_cleanup, NULL); TRY_CATCH (e, RETURN_MASK_ERROR) { val = evaluate_expression (collect->expr); content = value_contents (val); } Could you tell me some better way? > > Hui> + iterate_over_block_local_vars (block, > Hui> + tsv_save_do_loc_arg_collect, > Hui> + &cb_data); > > Why just iterate over this block and not the enclosing ones as well? > > Hmm, a lot of this code looks like code from tracepoint.c. > I think it would be better to share the code if that is possible. I tried to share code with function add_local_symbols. But it is not a big function and use different way to get block. > > Hui> +static char * > Hui> +ctf_save_metadata_change_char (struct ctf_save_s *tcsp, char *ctf_str, > Hui> + int i, const char *str) > Hui> +{ > Hui> + char *new; > Hui> + > Hui> + new = xmalloc (strlen (ctf_str) + (i ? 1 : 0) + strlen (str) + 1 - 1); > Hui> + ctf_str[i] = '\0'; > Hui> + sprintf (new, "%s%s%s_%s", ctf_str, (i ? "_" : ""), str, ctf_str + i + 1); > > Just use xstrprintf. Fixed. > > Hui> +static void > Hui> +ctf_save_do_nothing (void *p) > Hui> +{ > Hui> +} > > Use null_cleanup instead. Fixed. > > Hui> + if (collect->expr) > Hui> + free_current_contents (&collect->expr); > > Why free_current_contents here? > That seems weird. If this collect is $_ret, it will not have collect->expr. Or maybe this collect will be free because when setup this collect get error. So check it before free it. > > Hui> + char file_name[strlen (dirname) + 1 + strlen (CTF_DATASTREAM_NAME) + 1]; > > alloca or malloc. Fixed. > > Hui> + sprintf (file_name, "%s/%s", dirname, CTF_METADATA_NAME); > Hui> + tcs.metadata_fd = fopen (file_name, "w"); > Hui> + if (!tcs.metadata_fd) > Hui> + error (_("Unable to open file '%s' for saving trace data (%s)"), > Hui> + file_name, safe_strerror (errno)); > Hui> + ctf_save_metadata_header (&tcs); > Hui> + > Hui> + sprintf (file_name, "%s/%s", dirname, CTF_DATASTREAM_NAME); > Hui> + tcs.datastream_fd = fopen (file_name, "w"); > Hui> + if (!tcs.datastream_fd) > Hui> + error (_("Unable to open file '%s' for saving trace data (%s)"), > Hui> + file_name, safe_strerror (errno)); > > On error these files will be left partially written. > Is that intentional? What my thought about this part is even if GDB get error when CTF save, the data before this error is OK. So in clean up function ctf_save_cleanup, it will not remove this file. And it will write the data that don't have error, function ctf_save_metadata (tcsp). > > Hui> +extern void ctf_save (char *dirname); > > Why not const? > This applies in a few spots in the patch. Fixed. > > Hui> @@ -2465,6 +2466,7 @@ void > Hui> mi_cmd_trace_save (char *command, char **argv, int argc) > [...] > Hui> + if (strcmp (argv[0], "-ctf") == 0) > Hui> + generate_ctf = 1; > > The 'usage' line needs an update. Fixed. > > Hui> + if (generate_ctf) > Hui> + ctf_save (filename); > Hui> + else > Hui> + trace_save (filename, target_saves); > > I don't understand why CTF isn't just an option to trace_save -- share > the trace-dependent work, separate out the formatting. > I separate read and write CTF support function because: CTF format is a complex format. I tried to support all of it but I failed. Then I changed to use libbabeltrace, it works very good with read CTF. But it doesn't supply API for CTF write. And I discussion the developer of libbabeltrace, they said they don't have plan for that. So I add CTF write function inside GDB with my hand. And because CTF is design for tracepoint support. So it is really fit with tsave command. So I add it as an option. > Hui> trace_save_command (char *args, int from_tty) > Hui> { > Tom Thanks for your comments. I post a new version. Best, Hui --0015175d072a1e8db204d0ce7528 Content-Type: text/plain; charset=US-ASCII; name="tsave-ctf.txt" Content-Disposition: attachment; filename="tsave-ctf.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hap8rrs10 Content-length: 50687 LS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTUwNiw3 ICs1MDYsOCBAQCBTRVJfSEFSRFdJUkUgPSBAU0VSX0hBUkRXSVJFQAogCiAj IFRoZSBgcmVtb3RlJyBkZWJ1Z2dpbmcgdGFyZ2V0IGlzIHN1cHBvcnRlZCBm b3IgbW9zdCBhcmNoaXRlY3R1cmVzLAogIyBidXQgbm90IGFsbCAoZS5nLiA5 NjApCi1SRU1PVEVfT0JTID0gcmVtb3RlLm8gZGNhY2hlLm8gdHJhY2Vwb2lu dC5vIGF4LWdlbmVyYWwubyBheC1nZGIubyByZW1vdGUtZmlsZWlvLm8KK1JF TU9URV9PQlMgPSByZW1vdGUubyBkY2FjaGUubyB0cmFjZXBvaW50Lm8gYXgt Z2VuZXJhbC5vIGF4LWdkYi5vIHJlbW90ZS1maWxlaW8ubyBcCisJY3RmLm8K IAogIyBUaGlzIGlzIHJlbW90ZS1zaW0ubyBpZiBhIHNpbXVsYXRvciBpcyB0 byBiZSBsaW5rZWQgaW4uCiBTSU1fT0JTID0gQFNJTV9PQlNACkBAIC03NTEs NyArNzUyLDcgQEAgU0ZJTEVTID0gYWRhLWV4cC55IGFkYS1sYW5nLmMgYWRh LXR5cGVwcgogCXJlZ3NldC5jIHNvbC10aHJlYWQuYyB3aW5kb3dzLXRlcm1j YXAuYyBcCiAJY29tbW9uL2dkYl92ZWNzLmMgY29tbW9uL2NvbW1vbi11dGls cy5jIGNvbW1vbi94bWwtdXRpbHMuYyBcCiAJY29tbW9uL3B0aWQuYyBjb21t b24vYnVmZmVyLmMgZ2RiLWRsZmNuLmMgY29tbW9uL2FnZW50LmMgXAotCWNv bW1vbi9mb3JtYXQuYworCWNvbW1vbi9mb3JtYXQuYyBjdGYuYwogCiBMSU5U RklMRVMgPSAkKFNGSUxFUykgJChZWUZJTEVTKSAkKENPTkZJR19TUkNTKSBp bml0LmMKIApAQCAtODM0LDcgKzgzNSw4IEBAIGdudWxpYi9pbXBvcnQvZXh0 cmEvc25pcHBldC93YXJuLW9uLXVzZS4KIGdudWxpYi9pbXBvcnQvc3RkZGVm LmluLmggZ251bGliL2ltcG9ydC9pbnR0eXBlcy5pbi5oIGlubGluZS1mcmFt ZS5oIHNraXAuaCBcCiBjb21tb24vY29tbW9uLXV0aWxzLmggY29tbW9uL3ht bC11dGlscy5oIGNvbW1vbi9idWZmZXIuaCBjb21tb24vcHRpZC5oIFwKIGNv bW1vbi9mb3JtYXQuaCBjb21tb24vaG9zdC1kZWZzLmggdXRpbHMuaCBcCi1j b21tb24vbGludXgtb3NkYXRhLmggZ2RiLWRsZmNuLmggYXV0by1sb2FkLmgg cHJvYmUuaCBzdGFwLXByb2JlLmggZ2RiX2JmZC5oCitjb21tb24vbGludXgt b3NkYXRhLmggZ2RiLWRsZmNuLmggYXV0by1sb2FkLmggcHJvYmUuaCBzdGFw LXByb2JlLmggZ2RiX2JmZC5oIFwKK2N0Zi5oCiAKICMgSGVhZGVyIGZpbGVz IHRoYXQgYWxyZWFkeSBoYXZlIHNyY2RpciBpbiB0aGVtLCBvciB3aGljaCBh cmUgaW4gb2JqZGlyLgogCi0tLSAvZGV2L251bGwKKysrIGIvY3RmLmMKQEAg LTAsMCArMSwxMjM3IEBACisvKiBDVEYgZm9ybWF0IHN1cHBvcnQuCisKKyAg IENvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s IEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcg d2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgor I2luY2x1ZGUgImN0Zi5oIgorI2luY2x1ZGUgInRyYWNlcG9pbnQuaCIKKyNp bmNsdWRlICJyZWdjYWNoZS5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2lu Y2x1ZGUgImV4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJzdGFjay5oIgorCisj aW5jbHVkZSA8Y3R5cGUuaD4KKworLyogRm9sbG93aW5nIHBhcnQgaXMgZm9y IHRzYXZlLiAgKi8KKworI2RlZmluZSBDVEZfTUFHSUMJCTB4QzFGQzFGQzEK KyNkZWZpbmUgQ1RGX1NBVkVfTUFKT1IJCTEKKyNkZWZpbmUgQ1RGX1NBVkVf TUlOT1IJCTgKKworI2RlZmluZSBDVEZfTUVUQURBVEFfTkFNRQkibWV0YWRh dGEiCisjZGVmaW5lIENURl9EQVRBU1RSRUFNX05BTUUJImRhdGFzdHJlYW0i CisKKyNkZWZpbmUgQ1RGX1BBQ0tFVF9TSVpFCQk0MDk2CisKKyNkZWZpbmUg QUxJR05fU0laRShzaXplLCBhbGlnbikgXAorCSgoKChhbGlnbikgKyAoc2l6 ZSkgLSAxKSAmICh+KChhbGlnbikgLSAxKSkpIC0gKHNpemUpKQorCitzdHJ1 Y3QgY3RmX3NhdmVfY29sbGVjdF9zCit7CisgIHN0cnVjdCBjdGZfc2F2ZV9j b2xsZWN0X3MgKm5leHQ7CisgIGNoYXIgKnN0cjsKKyAgY2hhciAqY3RmX3N0 cjsKKyAgaW50IGFsaWduX3NpemU7CisgIHN0cnVjdCBleHByZXNzaW9uICpl eHByOworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgaW50IGlzX3JldDsKK307 CisKK3N0cnVjdCBjdGZfc2F2ZV90cF9zCit7CisgIHN0cnVjdCBjdGZfc2F2 ZV90cF9zICpuZXh0OworICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdHA7CisgIGlu dCBzdGVwcGluZ19mcmFtZTsKKyAgc3RydWN0IGN0Zl9zYXZlX2NvbGxlY3Rf cyAqY29sbGVjdDsKKyAgaW50IGFsaWduX3NpemU7CisgIGludCBpc192YXJp YWJsZV9sZW5ndGg7CisgIGludCBpc19kcm9wcGVkOworfTsKKworc3RydWN0 IGN0Zl9zYXZlX3R5cGVfcworeworICBzdHJ1Y3QgY3RmX3NhdmVfdHlwZV9z ICpuZXh0OworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK307CisKK3N0cnVjdCBj dGZfc2F2ZV9zCit7CisgIEZJTEUgKm1ldGFkYXRhX2ZkOworICBGSUxFICpk YXRhc3RyZWFtX2ZkOworCisgIC8qIFRoaXMgaXMgdGhlIGNvbnRlbnQgc2l6 ZSBvZiBjdXJyZW50IHBhY2tldC4gICovCisgIHNpemVfdCBjb250ZW50X3Np emU7CisKKyAgLyogVGhpcyBpcyB0aGUgYmVnaW4gb2Zmc2V0IG9mIGN1cnJl bnQgcGFja2V0LiAgKi8KKyAgbG9uZyBwYWNrZXRfYmVnaW47CisKKyAgLyog SWYgdHJ1ZSwgbmVlZCBjaGVjayBpZiBjb250ZW50X3NpemUgYmlnZ2VyIHRo YW4gQ1RGX1BBQ0tFVF9TSVpFLiAgKi8KKyAgaW50IGNoZWNrX3NpemU7CisK KyAgLyogVGhpcyBpcyB0aGUgY29udGVudCBzaXplIG9mIGN1cnJlbnQgcGFj a2V0IGFuZCBldmVudCB0aGF0IGlzCisgICAgIGJlaW5nIHdyaXR0ZW4gdG8g ZmlsZS4KKyAgICAgQ2hlY2sgc2l6ZSB1c2UgaXQuICAqLworICBzaXplX3Qg Y3VycmVudF9jb250ZW50X3NpemU7CisKKyAgLyogU2F2ZSB0aGUgbnVtYmVy IG9mIHRyYWNlIGZyYW1lIGJlZm9yZSBjYWxsIGN0Zl9zYXZlLgorICAgICBT ZXQgaXQgYmFjayB3aGVuIHJldHVybiBjdGZfc2F2ZS4gICovCisgIGludCBv bGRfdHJhY2VmcmFtZV9udW07CisKKyAgLyogVHJhY2Vwb2ludCBsaXN0LiAg Ki8KKyAgc3RydWN0IGN0Zl9zYXZlX3RwX3MgKnRwOworCisgIC8qIFR5cGUg bGlzdC4gICovCisgIHN0cnVjdCBjdGZfc2F2ZV90eXBlX3MgKnR5cGU7CisK KyAgY29uc3QgY2hhciAqdGFiOworfTsKKworc3RhdGljIHZvaWQKK2N0Zl9z YXZlX2Z3cml0ZSAoRklMRSAqZmQsIGNvbnN0IGdkYl9ieXRlICpidWYsIHNp emVfdCBzaXplKQoreworICBpZiAoZndyaXRlIChidWYsIHNpemUsIDEsIGZk KSAhPSAxKQorICAgIGVycm9yIChfKCJVbmFibGUgdG8gd3JpdGUgZmlsZSBm b3Igc2F2aW5nIHRyYWNlIGRhdGEgKCVzKSIpLAorCSAgIHNhZmVfc3RyZXJy b3IgKGVycm5vKSk7Cit9CisKK3N0YXRpYyB2b2lkCitjdGZfc2F2ZV9md3Jp dGVfZm9ybWF0XzEgKEZJTEUgKmZkLCBjb25zdCBjaGFyICpmb3JtYXQsIHZh X2xpc3QgYXJncykKK3sKKyAgY2hhciAqbGluZWJ1ZmZlcjsKKyAgc3RydWN0 IGNsZWFudXAgKm9sZF9jbGVhbnVwczsKKworICBsaW5lYnVmZmVyID0geHN0 cnZwcmludGYgKGZvcm1hdCwgYXJncyk7CisgIG9sZF9jbGVhbnVwcyA9IG1h a2VfY2xlYW51cCAoeGZyZWUsIGxpbmVidWZmZXIpOworICBjdGZfc2F2ZV9m d3JpdGUgKGZkLCBsaW5lYnVmZmVyLCBzdHJsZW4gKGxpbmVidWZmZXIpKTsK KyAgZG9fY2xlYW51cHMgKG9sZF9jbGVhbnVwcyk7Cit9CisKK3N0YXRpYyB2 b2lkCitjdGZfc2F2ZV9md3JpdGVfZm9ybWF0IChGSUxFICpmZCwgY29uc3Qg Y2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICB2 YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgY3RmX3NhdmVfZndyaXRlX2Zv cm1hdF8xIChmZCwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsK K30KKworc3RhdGljIGludAorY3RmX3NhdmVfd3JpdGUgKHN0cnVjdCBjdGZf c2F2ZV9zICp0Y3NwLCBjb25zdCBnZGJfYnl0ZSAqYnVmLCBzaXplX3Qgc2l6 ZSkKK3sKKyAgaWYgKHRjc3AtPmNoZWNrX3NpemUpCisgICAgeworICAgICAg aWYgKHRjc3AtPmN1cnJlbnRfY29udGVudF9zaXplICsgc2l6ZSA+IENURl9Q QUNLRVRfU0laRSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBj dGZfc2F2ZV9md3JpdGUgKHRjc3AtPmRhdGFzdHJlYW1fZmQsIGJ1Ziwgc2l6 ZSk7CisKKyAgdGNzcC0+Y3VycmVudF9jb250ZW50X3NpemUgKz0gc2l6ZTsK KworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY3RmX3NhdmVfZnNl ZWsgKHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3NwLCBsb25nIG9mZnNldCwgaW50 IHdoZW5jZSkKK3sKKyAgaWYgKHdoZW5jZSA9PSBTRUVLX0NVUiAmJiB0Y3Nw LT5jaGVja19zaXplKQorICAgIHsKKyAgICAgIGlmICh0Y3NwLT5jdXJyZW50 X2NvbnRlbnRfc2l6ZSArIG9mZnNldCA+IENURl9QQUNLRVRfU0laRSkKKyAg ICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoZnNlZWsgKHRjc3At PmRhdGFzdHJlYW1fZmQsIG9mZnNldCwgd2hlbmNlKSkKKyAgICBlcnJvciAo XygiVW5hYmxlIHRvIHNlZWsgZmlsZSBmb3Igc2F2aW5nIHRyYWNlIGRhdGEg KCVzKSIpLAorCSAgIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgaWYg KHdoZW5jZSA9PSBTRUVLX0NVUikKKyAgICB0Y3NwLT5jdXJyZW50X2NvbnRl bnRfc2l6ZSArPSBvZmZzZXQ7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQKK2N0Zl9zYXZlX2FsaWduX3dyaXRlIChzdHJ1Y3QgY3RmX3NhdmVf cyAqdGNzcCwgY29uc3QgZ2RiX2J5dGUgKmJ1ZiwKKwkJICAgICAgc2l6ZV90 IHNpemUsIHNpemVfdCBhbGlnbl9zaXplKQoreworICBpZiAoY3RmX3NhdmVf ZnNlZWsgKHRjc3AsCisJCSAgICAgIEFMSUdOX1NJWkUodGNzcC0+Y3VycmVu dF9jb250ZW50X3NpemUsIGFsaWduX3NpemUpLAorCQkgICAgICBTRUVLX0NV UikpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChjdGZfc2F2ZV93cml0ZSAo dGNzcCwgYnVmLCBzaXplKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIGN0Zl9zYXZlX3R5cGVfZGVmaW5lX3dy aXRlIChzdHJ1Y3QgY3RmX3NhdmVfcyAqdGNzcCwKKwkJCQkJc3RydWN0IHR5 cGUgKnR5cGUpOworCitzdGF0aWMgdm9pZAorY3RmX3NhdmVfdHlwZV9uYW1l X3dyaXRlIChzdHJ1Y3QgY3RmX3NhdmVfcyAqdGNzcCwgc3RydWN0IHR5cGUg KnR5cGUpCit7CisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7 CisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICBmb3IgKDsgVFlQ RV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfQVJSQVk7CisJICAgdHlwZSA9 IFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKQorCTsKKyAgICAgIGlmIChUWVBF X05BTUUgKHR5cGUpKQorICAgICAgICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0 ICh0Y3NwLT5tZXRhZGF0YV9mZCwgIiVzIiwgVFlQRV9OQU1FICh0eXBlKSk7 CisgICAgICBlbHNlCisJY3RmX3NhdmVfdHlwZV9kZWZpbmVfd3JpdGUgKHRj c3AsIHR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09E RV9QVFI6CisgICAgICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpID09IDgpCisJ Y3RmX3NhdmVfZndyaXRlX2Zvcm1hdCAodGNzcC0+bWV0YWRhdGFfZmQsICJ1 aW50NjRfdCIpOworICAgICAgZWxzZQorCWN0Zl9zYXZlX2Z3cml0ZV9mb3Jt YXQgKHRjc3AtPm1ldGFkYXRhX2ZkLCAidWludDMyX3QiKTsKKyAgICAgIGJy ZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgIGNhc2Ug VFlQRV9DT0RFX0VOVU06CisgICAgICBpZiAoVFlQRV9UQUdfTkFNRSAodHlw ZSkpCisgICAgICAgIGN0Zl9zYXZlX2Z3cml0ZV9mb3JtYXQgKHRjc3AtPm1l dGFkYXRhX2ZkLCAiJXMgJXMiLAorCQkJCVRZUEVfQ09ERSAodHlwZSkgPT0g VFlQRV9DT0RFX1NUUlVDVCA/CisJCQkJInN0cnVjdCIgOiAiZW51bSIsCisJ CQkJVFlQRV9UQUdfTkFNRSAodHlwZSkpOworICAgICAgZWxzZQorCWN0Zl9z YXZlX3R5cGVfZGVmaW5lX3dyaXRlICh0Y3NwLCB0eXBlKTsKKyAgICAgIGJy ZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgICB7CisJ aW50IGksIGJpZ2dlc3RfaWQsIGJpZ2dlc3Rfc2l6ZSA9IDA7CisKKwlmb3Ig KGkgPSAwOyBpIDwgVFlQRV9ORklFTERTICh0eXBlKTsgKytpKQorCSAgewor CSAgICBpZiAoYmlnZ2VzdF9zaXplIDwgVFlQRV9MRU5HVEggKFRZUEVfRklF TERfVFlQRSAodHlwZSwgaSkpKQorCSAgICAgIHsKKwkJYmlnZ2VzdF9zaXpl ID0gVFlQRV9MRU5HVEggKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSkpOwor CQliaWdnZXN0X2lkID0gaTsKKwkgICAgICB9CisJICB9CisJY3RmX3NhdmVf dHlwZV9uYW1lX3dyaXRlICh0Y3NwLCBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUs IGJpZ2dlc3RfaWQpKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1 bHQ6CisgICAgICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0ICh0Y3NwLT5tZXRh ZGF0YV9mZCwgIiVzIiwgVFlQRV9OQU1FICh0eXBlKSk7CisgICAgICBicmVh azsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjdGZfc2F2ZV90eXBlX3Np emVfd3JpdGUgKHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3NwLCBzdHJ1Y3QgdHlw ZSAqdHlwZSkKK3sKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9D T0RFX0FSUkFZKQorICAgIHsKKyAgICAgIGZvciAoOyBUWVBFX0NPREUgKHR5 cGUpID09IFRZUEVfQ09ERV9BUlJBWTsKKwkgICB0eXBlID0gVFlQRV9UQVJH RVRfVFlQRSAodHlwZSkpCisJY3RmX3NhdmVfZndyaXRlX2Zvcm1hdCAodGNz cC0+bWV0YWRhdGFfZmQsICJbJWRdIiwKKwkJCQlUWVBFX0xFTkdUSCAodHlw ZSkgLworCQkJCVRZUEVfTEVOR1RIIChUWVBFX1RBUkdFVF9UWVBFICh0eXBl KSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2N0Zl9zYXZlX3Zhcl9k ZWZpbmVfd3JpdGUgKHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3NwLCBzdHJ1Y3Qg dHlwZSAqdHlwZSwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGN0 Zl9zYXZlX3R5cGVfbmFtZV93cml0ZSAodGNzcCwgdHlwZSk7CisgIGN0Zl9z YXZlX2Z3cml0ZV9mb3JtYXQgKHRjc3AtPm1ldGFkYXRhX2ZkLCAiICVzIiwg bmFtZSk7CisgIGN0Zl9zYXZlX3R5cGVfc2l6ZV93cml0ZSAodGNzcCwgdHlw ZSk7CisgIGN0Zl9zYXZlX2Z3cml0ZV9mb3JtYXQgKHRjc3AtPm1ldGFkYXRh X2ZkLCAiO1xuIik7Cit9CisKKy8qIFdyaXRlIFRZUEUgdG8gVENTUC0+bWV0 YWRhdGFfZmQuICAqLworCitzdGF0aWMgdm9pZAorY3RmX3NhdmVfdHlwZV9k ZWZpbmVfd3JpdGUgKHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3NwLCBzdHJ1Y3Qg dHlwZSAqdHlwZSkKK3sKKyAgc3RydWN0IGN0Zl9zYXZlX3R5cGVfcyAqdDsK KworICBmb3IgKHQgPSB0Y3NwLT50eXBlOyB0OyB0ID0gdC0+bmV4dCkKKyAg ICB7CisgICAgICBpZiAodC0+dHlwZSA9PSB0eXBlKQorCXJldHVybjsKKyAg ICB9CisKKyAgdCA9IChzdHJ1Y3QgY3RmX3NhdmVfdHlwZV9zICopIHhjYWxs b2MgKDEsIHNpemVvZiAoKnQpKTsKKyAgdC0+dHlwZSA9IHR5cGU7CisKKyAg dC0+bmV4dCA9IHRjc3AtPnR5cGU7CisgIHRjc3AtPnR5cGUgPSB0OworCisg IC8qIElnbm9yZSB0eXBlIHVpbnQzMl90IGFuZCB1aW50NjRfdCBiZWNhdXNl IHRoZXkgaGF2ZSB3cml0dGVuCisgICAgIGluIGZ1bmN0aW9uIGN0Zl9zYXZl X21ldGFkYXRhX2hlYWRlci4gICovCisgIGlmIChUWVBFX05BTUUgKHR5cGUp ICYmIChzdHJjbXAgKFRZUEVfTkFNRSAodHlwZSksICJ1aW50MzJfdCIpID09 IDAKKwkJCSAgIHx8IHN0cmNtcCAoVFlQRV9OQU1FICh0eXBlKSwgInVpbnQ2 NF90IikgPT0gMCkpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoVFlQRV9D T0RFICh0eXBlKSkKKyAgICB7CisgICAgICBjYXNlIFRZUEVfQ09ERV9UWVBF REVGOgorCWN0Zl9zYXZlX2Z3cml0ZV9mb3JtYXQgKHRjc3AtPm1ldGFkYXRh X2ZkLCAidHlwZWRlZiAiKTsKKwljdGZfc2F2ZV92YXJfZGVmaW5lX3dyaXRl ICh0Y3NwLCBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwKKwkJCQkgICBUWVBF X05BTUUgKHR5cGUpKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NP REVfSU5UOgorCWN0Zl9zYXZlX2Z3cml0ZV9mb3JtYXQgKHRjc3AtPm1ldGFk YXRhX2ZkLCAiXAordHlwZWFsaWFzIGludGVnZXIgeyBzaXplID0gJWQ7IGFs aWduID0gJWQ7IHNpZ25lZCA9ICVzOyB9IDo9ICVzO1xuIiwKKwkJCQlUWVBF X0xFTkdUSCh0eXBlKSAqIFRBUkdFVF9DSEFSX0JJVCwKKwkJCQlUWVBFX0xF TkdUSCh0eXBlKSAqIFRBUkdFVF9DSEFSX0JJVCwKKwkJCQkhVFlQRV9VTlNJ R05FRCAodHlwZSkgPyAidHJ1ZSIgOiAiZmFsc2UiLAorCQkJCVRZUEVfTkFN RSAodHlwZSkpOworCWJyZWFrOworCisgICAgICBjYXNlIFRZUEVfQ09ERV9T VFJVQ1Q6CisgICAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgICB7 CisJICBpbnQgaTsKKwkgIGNoYXIgdGFiWzI1Nl07CisJICBjb25zdCBjaGFy ICpvbGRfdGFiOworCisJICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0ICh0Y3Nw LT5tZXRhZGF0YV9mZCwgIiVzICVzIHtcbiIsCisJCQkJICBUWVBFX0NPREUg KHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QgPworCQkJCSAgInN0cnVjdCIg OiAiZW51bSIsCisJCQkJICBUWVBFX1RBR19OQU1FICh0eXBlKSA/IFRZUEVf VEFHX05BTUUgKHR5cGUpCisJCQkJCQkgICAgICAgOiAiIik7CisKKwkgIG9s ZF90YWIgPSB0Y3NwLT50YWI7CisJICBzbnByaW50ZiAodGFiLCAyNTYsICIl c1x0Iiwgb2xkX3RhYik7CisJICB0Y3NwLT50YWIgPSB0YWI7CisJICBmb3Ig KGkgPSAwOyBpIDwgVFlQRV9ORklFTERTICh0eXBlKTsgKytpKQorCSAgICB7 CisJICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NU UlVDVCkKKwkgICAgICAgIHsKKwkJICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0 ICh0Y3NwLT5tZXRhZGF0YV9mZCwgdGNzcC0+dGFiKTsKKwkJICBjdGZfc2F2 ZV92YXJfZGVmaW5lX3dyaXRlICh0Y3NwLCBUWVBFX0ZJRUxEX1RZUEUgKHR5 cGUsIGkpLAorCQkJCQkgICAgIFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSkp OworCQl9CisJICAgICAgZWxzZQorCQljdGZfc2F2ZV9md3JpdGVfZm9ybWF0 ICh0Y3NwLT5tZXRhZGF0YV9mZCwgIiVzJXMgPSAlcyxcbiIsCisJCQkJCXRj c3AtPnRhYiwgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwKKwkJCQkJcGxv bmdlc3QgKFRZUEVfRklFTERfRU5VTVZBTCAodHlwZSwgaSkpKTsKKwkgICAg fQorCSAgdGNzcC0+dGFiID0gb2xkX3RhYjsKKwkgIGN0Zl9zYXZlX2Z3cml0 ZV9mb3JtYXQgKHRjc3AtPm1ldGFkYXRhX2ZkLCAiJXN9IiwgdGNzcC0+dGFi KTsKKwkgIGlmIChUWVBFX1RBR19OQU1FICh0eXBlKSkKKwkgICAgY3RmX3Nh dmVfZndyaXRlX2Zvcm1hdCAodGNzcC0+bWV0YWRhdGFfZmQsICI7XG4iKTsK KwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIENoZWNrIGlmIHRoaXMg dHlwZSBpcyBzdXBwb3J0IGJ5IEdEQi4KKyAgIFJldHVybiB0aGUgYWxpZ24g c2l6ZS4gICovCisKK3N0YXRpYyBpbnQKK2N0Zl9zYXZlX3R5cGVfY2hlY2tf YW5kX3dyaXRlIChzdHJ1Y3QgY3RmX3NhdmVfcyAqdGNzcCwgc3RydWN0IHR5 cGUgKnR5cGUpCit7CisgIGludCBhbGlnbl9zaXplID0gMDsKKworICBzd2l0 Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgICAgY2FzZSBUWVBF X0NPREVfVFlQRURFRjoKKwlhbGlnbl9zaXplID0gY3RmX3NhdmVfdHlwZV9j aGVja19hbmRfd3JpdGUgKHRjc3AsCisJCQkJCQkgICAgVFlQRV9UQVJHRVRf VFlQRSAodHlwZSkpOworCWlmIChhbGlnbl9zaXplIDwgMCkKKwkgIHJldHVy biBhbGlnbl9zaXplOworCWN0Zl9zYXZlX3R5cGVfZGVmaW5lX3dyaXRlICh0 Y3NwLCB0eXBlKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVf QVJSQVk6CisJYWxpZ25fc2l6ZSA9IGN0Zl9zYXZlX3R5cGVfY2hlY2tfYW5k X3dyaXRlICh0Y3NwLAorCQkJCQkJICAgIFRZUEVfVEFSR0VUX1RZUEUgKHR5 cGUpKTsKKwlpZiAoYWxpZ25fc2l6ZSA8IDApCisJICByZXR1cm4gYWxpZ25f c2l6ZTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOgor CWN0Zl9zYXZlX3R5cGVfZGVmaW5lX3dyaXRlICh0Y3NwLCB0eXBlKTsKKwlh bGlnbl9zaXplID0gVFlQRV9MRU5HVEggKHR5cGUpOworCWJyZWFrOworCisg ICAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisJYWxpZ25fc2l6ZSA9IFRZUEVf TEVOR1RIICh0eXBlKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NP REVfU1RSVUNUOgorICAgICAgICB7CisJICBpbnQgaSwgc19hbGlnbl9zaXpl OworCisJICBmb3IgKGkgPSAwOyBpIDwgVFlQRV9ORklFTERTICh0eXBlKTsg KytpKQorCSAgICB7CisJICAgICAgc19hbGlnbl9zaXplCisJCSAgPSBjdGZf c2F2ZV90eXBlX2NoZWNrX2FuZF93cml0ZSAodGNzcCwKKwkJCQkJCSAgIFRZ UEVfRklFTERfVFlQRSAodHlwZSwgaSkpOworCSAgICAgIGlmIChzX2FsaWdu X3NpemUgPCAwKQorCQlyZXR1cm4gc19hbGlnbl9zaXplOworCisJICAgICAg aWYgKGFsaWduX3NpemUgPCBzX2FsaWduX3NpemUpCisJCWFsaWduX3NpemUg PSBzX2FsaWduX3NpemU7CisJICAgIH0KKwkgIGlmIChUWVBFX1RBR19OQU1F ICh0eXBlKSkKKwkgICAgY3RmX3NhdmVfdHlwZV9kZWZpbmVfd3JpdGUgKHRj c3AsIHR5cGUpOworCSAgYnJlYWs7CisJfQorCisgICAgICBjYXNlIFRZUEVf Q09ERV9FTlVNOgorCWFsaWduX3NpemUgPSBUWVBFX0xFTkdUSCAodHlwZSk7 CisJaWYgKFRZUEVfVEFHX05BTUUgKHR5cGUpKQorCSAgY3RmX3NhdmVfdHlw ZV9kZWZpbmVfd3JpdGUgKHRjc3AsIHR5cGUpOworCWJyZWFrOworCisgICAg ICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKKyAgICAgICAgeworCSAgaW50IGks IHNfYWxpZ25fc2l6ZTsKKworCSAgZm9yIChpID0gMDsgaSA8IFRZUEVfTkZJ RUxEUyAodHlwZSk7ICsraSkKKwkgICAgeworCSAgICAgIHNfYWxpZ25fc2l6 ZQorCQkgID0gY3RmX3NhdmVfdHlwZV9jaGVja19hbmRfd3JpdGUgKHRjc3As CisJCQkJCQkgICBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpKTsKKwkgICAg ICBpZiAoc19hbGlnbl9zaXplIDwgMCkKKwkJcmV0dXJuIHNfYWxpZ25fc2l6 ZTsKKworCSAgICAgIGlmIChhbGlnbl9zaXplIDwgc19hbGlnbl9zaXplKQor CQlhbGlnbl9zaXplID0gc19hbGlnbl9zaXplOworCSAgICB9CisJICBicmVh azsKKwl9CisKKyAgICAgIGRlZmF1bHQ6CisJYWxpZ25fc2l6ZSA9IC0xOwor CWJyZWFrOworICAgIH0KKworICByZXR1cm4gYWxpZ25fc2l6ZTsKK30KKwor c3RhdGljIHZvaWQKK2N0Zl9zYXZlX2NvbGxlY3RfZ2V0XzEgKHN0cnVjdCBj dGZfc2F2ZV9zICp0Y3NwLCBzdHJ1Y3QgY3RmX3NhdmVfdHBfcyAqdHBzLAor CQkJY2hhciAqc3RyKQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsK KyAgc3RydWN0IGN0Zl9zYXZlX2NvbGxlY3RfcyAqY29sbGVjdDsKKyAgdm9s YXRpbGUgc3RydWN0IGdkYl9leGNlcHRpb24gZTsKKyAgc3RydWN0IHR5cGUg KnR5cGU7CisgIGludCBpc19yZXQgPSAwOworICBpbnQgYWxpZ25fc2l6ZTsK KworICAvKiBDaGVjayBpZiBhY3Rpb25fZXhwIGlzIGFscmVhZHkgZXhpc3Qg aW4gdHBzLT5jb2xsZWN0LiAgKi8KKyAgZm9yIChjb2xsZWN0ID0gdHBzLT5j b2xsZWN0OyBjb2xsZWN0OyBjb2xsZWN0ID0gY29sbGVjdC0+bmV4dCkKKyAg ICB7CisgICAgICBpZiAoc3RyY21wIChjb2xsZWN0LT5zdHIsIHN0cikgPT0g MCkKKwlyZXR1cm47CisgICAgfQorCisgIGlmICgwID09IHN0cm5jYXNlY21w IChzdHIsICIkX3JldCIsIDUpKQorICAgIGlzX3JldCA9IDE7CisKKyAgVFJZ X0NBVENIIChlLCBSRVRVUk5fTUFTS19FUlJPUikKKyAgICB7CisgICAgICBp ZiAoaXNfcmV0KQorICAgICAgICB7CisJICBDT1JFX0FERFIgcGM7CisJICBz dHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisKKwkgIGZyYW1lID0gZ2V0X2N1 cnJlbnRfZnJhbWUgKCk7CisJICBpZiAoIWZyYW1lKQorCSAgICBlcnJvciAo XygiZ2V0IGN1cnJlbnQgZnJhbWUgZmFpbCIpKTsKKwkgIGZyYW1lID0gZ2V0 X3ByZXZfZnJhbWUgKGZyYW1lKTsKKwkgIGlmICghZnJhbWUpCisJICAgIGVy cm9yIChfKCJnZXQgcHJldiBmcmFtZSBmYWlsIikpOworCisJICBpZiAoIWdl dF9mcmFtZV9wY19pZl9hdmFpbGFibGUgKGZyYW1lLCAmcGMpKQorCSAgICBl cnJvciAoXygiUEMgdW5hdmFpbGFibGUiKSk7CisJfQorICAgICAgZWxzZQor ICAgICAgICB7CisJICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCSAg c3RydWN0IHZhbHVlICp2YWw7CisKKwkgIGV4cHIgPSBwYXJzZV9leHByZXNz aW9uIChzdHIpOworCSAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVl X2N1cnJlbnRfY29udGVudHMsICZleHByKTsKKwkgIHR5cGUgPSB2YWx1ZV90 eXBlIChldmFsdWF0ZV9leHByZXNzaW9uIChleHByKSk7CisJICBkb19jbGVh bnVwcyAob2xkX2NoYWluKTsKKwl9CisgICAgfQorICBpZiAoZS5yZWFzb24g PCAwKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKF8oIlwKK25vdCBzYXZlIFwi JXNcIiBvZiB0cmFjZXBvaW50ICVkIHRvIGN0ZiBmaWxlIGJlY2F1c2UgZ2V0 IGl0cyB2YWx1ZSBmYWlsOiAlcyIpLAorCSAgICAgICBzdHIsIHRwcy0+dHAt PmJhc2UubnVtYmVyLCBlLm1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAg IH0KKworICBpZiAoaXNfcmV0KQorICAgIGFsaWduX3NpemUgPSA4OworICBl bHNlCisgICAgeworICAgICAgYWxpZ25fc2l6ZSA9IGN0Zl9zYXZlX3R5cGVf Y2hlY2tfYW5kX3dyaXRlICh0Y3NwLCB0eXBlKTsKKyAgICAgIGlmIChhbGln bl9zaXplIDwgMCkKKwl7CisJICB3YXJuaW5nIChfKCJcCitub3Qgc2F2ZSBc IiVzXCIgb2YgdHJhY2Vwb2ludCAlZCB0byBjdGYgZmlsZSBiZWNhdXNlIGl0 cyB0eXBlIGlzIG5vdCBzdXBwb3J0LiIpLAorCQkgICBzdHIsIHRwcy0+dHAt PmJhc2UubnVtYmVyKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGNv bGxlY3QgPSAoc3RydWN0IGN0Zl9zYXZlX2NvbGxlY3RfcyAqKSB4Y2FsbG9j ICgxLCBzaXplb2YgKCpjb2xsZWN0KSk7CisKKyAgLyogQWRkIHRwIHRvIHRo ZSBsaXN0LiAgKi8KKyAgY29sbGVjdC0+bmV4dCA9IHRwcy0+Y29sbGVjdDsK KyAgdHBzLT5jb2xsZWN0ID0gY29sbGVjdDsKKworICBjb2xsZWN0LT5zdHIg PSB4c3RyZHVwIChzdHIpOworICBjb2xsZWN0LT5pc19yZXQgPSBpc19yZXQ7 CisKKyAgaWYgKCFpc19yZXQpCisgICAgeworICAgICAgY29sbGVjdC0+dHlw ZSA9IHR5cGU7CisKKyAgICAgIGNvbGxlY3QtPmFsaWduX3NpemUgPSBhbGln bl9zaXplOworICAgICAgaWYgKGNvbGxlY3QtPmFsaWduX3NpemUgPiB0cHMt PmFsaWduX3NpemUpCisgICAgICAgIHRwcy0+YWxpZ25fc2l6ZSA9IGNvbGxl Y3QtPmFsaWduX3NpemU7CisKKyAgICAgIGNvbGxlY3QtPmV4cHIgPSBwYXJz ZV9leHByZXNzaW9uIChzdHIpOworICAgIH0KK30KKworc3RydWN0IGxvY19h cmdfY29sbGVjdF9kYXRhCit7CisgIHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3Nw OworICBzdHJ1Y3QgY3RmX3NhdmVfdHBfcyAqdHBzOworfTsKKworc3RhdGlj IHZvaWQKK3Rzdl9zYXZlX2RvX2xvY19hcmdfY29sbGVjdCAoY29uc3QgY2hh ciAqcHJpbnRfbmFtZSwKKwkJCSAgICAgc3RydWN0IHN5bWJvbCAqc3ltLAor CQkJICAgICB2b2lkICpjYl9kYXRhKQoreworICBzdHJ1Y3QgbG9jX2FyZ19j b2xsZWN0X2RhdGEgKnAgPSBjYl9kYXRhOworICBjaGFyICpuYW1lOworCisg IG5hbWUgPSBhbGxvY2EgKHN0cmxlbiAocHJpbnRfbmFtZSkgKyAxKTsKKyAg c3RyY3B5IChuYW1lLCBwcmludF9uYW1lKTsKKyAgY3RmX3NhdmVfY29sbGVj dF9nZXRfMSAocC0+dGNzcCwgcC0+dHBzLCBuYW1lKTsKK30KKworLyogd29y a2VyIGZ1bmN0aW9uIChjbGVhbnVwKSAqLworc3RhdGljIHZvaWQKK3JlcGxh Y2VfY29tbWEgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmNvbW1hID0gZGF0 YTsKKyAgKmNvbW1hID0gJywnOworfQorCisvKiBHZXQgdmFyIHRoYXQgd2Fu dCB0byBjb2xsZWN0IGZyb20gU1RSIGFuZCBwdXQgdGhlbSB0byBUUFMtPmNv bGxlY3QuICAqLworCitzdGF0aWMgdm9pZAorY3RmX3NhdmVfY29sbGVjdF9n ZXQgKHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3NwLCBzdHJ1Y3QgY3RmX3NhdmVf dHBfcyAqdHBzLAorCQkgICAgICBjaGFyICpzdHIpCit7CisgIGNoYXIgKmFj dGlvbl9leHAgPSBzdHIsICpuZXh0X2NvbW1hOworICBzdHJ1Y3QgY2xlYW51 cCAqb2xkX2NoYWluOworCisgIGRvCisgICAgeworICAgICAgaWYgKCphY3Rp b25fZXhwID09ICcsJykKKwlhY3Rpb25fZXhwKys7CisgICAgICB3aGlsZSAo aXNzcGFjZSAoKGludCkgKmFjdGlvbl9leHApKQorCWFjdGlvbl9leHArKzsK KworICAgICAgbmV4dF9jb21tYSA9IHN0cmNociAoYWN0aW9uX2V4cCwgJywn KTsKKyAgICAgIGlmIChuZXh0X2NvbW1hKQorCXsKKwkgIG9sZF9jaGFpbiA9 IG1ha2VfY2xlYW51cCAocmVwbGFjZV9jb21tYSwgbmV4dF9jb21tYSk7CisJ ICAqbmV4dF9jb21tYSA9ICdcMCc7CisJfQorCisgICAgICBpZiAoMCA9PSBz dHJuY2FzZWNtcCAoYWN0aW9uX2V4cCwgIiRyZWciLCA0KSkKKyAgICAgICAg eworCSAgaW50IGk7CisJICBzdHJ1Y3QgZ2RiYXJjaCAqYXJjaCA9IHRwcy0+ dHAtPmJhc2UubG9jLT5nZGJhcmNoOworCisJICBmb3IgKGkgPSAwOyBpIDwg Z2RiYXJjaF9udW1fcmVncyAoYXJjaCk7IGkrKykKKwkgICAgeworCSAgICAg IGNvbnN0IGNoYXIgKm5hbWUgPSBnZGJhcmNoX3JlZ2lzdGVyX25hbWUgKGFy Y2gsIGkpOworCSAgICAgIGludCBuYW1lX3NpemUgPSBzdHJsZW4gKG5hbWUp OworCSAgICAgIGNoYXIgcmVnbmFtZVsxICsgbmFtZV9zaXplICsgMV07CisK KwkgICAgICBpZiAobmFtZV9zaXplID09IDApCisJCWNvbnRpbnVlOworCisJ ICAgICAgc3ByaW50ZiAocmVnbmFtZSwgIiQlcyIsIG5hbWUpOworCisJICAg ICAgY3RmX3NhdmVfY29sbGVjdF9nZXRfMSAodGNzcCwgdHBzLCByZWduYW1l KTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKDAgPT0gc3RybmNhc2Vj bXAgKGFjdGlvbl9leHAsICIkbG9jIiwgNCkKKwkgICAgICAgfHwgMCA9PSBz dHJuY2FzZWNtcCAoYWN0aW9uX2V4cCwgIiRhcmciLCA0KSkKKwl7CisJICBD T1JFX0FERFIgcGM7CisJICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisJ ICBzdHJ1Y3QgbG9jX2FyZ19jb2xsZWN0X2RhdGEgY2JfZGF0YTsKKwkgIHZv bGF0aWxlIHN0cnVjdCBnZGJfZXhjZXB0aW9uIGU7CisKKwkgIGNiX2RhdGEu dGNzcCA9IHRjc3A7CisJICBjYl9kYXRhLnRwcyA9IHRwczsKKworCSAgVFJZ X0NBVENIIChlLCBSRVRVUk5fTUFTS19FUlJPUikKKwkgICAgeworCSAgICAg IGZyYW1lID0gZ2V0X3NlbGVjdGVkX2ZyYW1lIChfKCJObyBmcmFtZSBzZWxl Y3RlZC4iKSk7CisJICAgICAgaWYgKCFnZXRfZnJhbWVfcGNfaWZfYXZhaWxh YmxlIChmcmFtZSwgJnBjKSkKKwkgICAgICAgIGVycm9yIChfKCJQQyB1bmF2 YWlsYWJsZSIpKTsKKwkgICAgfQorCSAgaWYgKGUucmVhc29uIDwgMCkKKwkg ICAgeworCSAgICAgIHdhcm5pbmcgKF8oIlwKK25vdCBzYXZlIFwiJXNcIiBv ZiB0cmFjZXBvaW50ICVkIHRvIGN0ZiBmaWxlIGJlY2F1c2UgZ2V0IGl0cyB2 YWx1ZSBmYWlsOiAlcyIpLAorCQkgICAgICAgYWN0aW9uX2V4cCwgdHBzLT50 cC0+YmFzZS5udW1iZXIsIGUubWVzc2FnZSk7CisJICAgICAgcmV0dXJuOwor CSAgICB9CisJICBpZiAoMCA9PSBzdHJuY2FzZWNtcCAoYWN0aW9uX2V4cCwg IiRsb2MiLCA0KSkKKwkgICAgeworCSAgICAgIHN0cnVjdCBibG9jayAqYmxv Y2s7CisKKwkgICAgICBibG9jayA9IGdldF9mcmFtZV9ibG9jayAoZnJhbWUs IDApOworCSAgICAgIGlmIChibG9jayA9PSAwKQorCQl7CisJCSAgd2Fybmlu ZyAoXygiXAorTm90IHNhdmUgXCIlc1wiIG9mIHRyYWNlcG9pbnQgJWQgdG8g Y3RmIGZpbGUgYmVjYXVzZSBubyBzeW1ib2wgdGFibGUgaW5mbyBhdmFpbGFi bGUuIiksCisJCQkgICBhY3Rpb25fZXhwLCB0cHMtPnRwLT5iYXNlLm51bWJl cik7CisJCSAgY29udGludWU7CisJCX0KKworCSAgICAgIGl0ZXJhdGVfb3Zl cl9ibG9ja19sb2NhbF92YXJzIChibG9jaywKKwkJCQkJICAgICB0c3Zfc2F2 ZV9kb19sb2NfYXJnX2NvbGxlY3QsCisJCQkJCSAgICAgJmNiX2RhdGEpOwor CSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3ltYm9s ICpmdW5jOworCisJICAgICAgZnVuYyA9IGdldF9mcmFtZV9mdW5jdGlvbiAo ZnJhbWUpOworCSAgICAgIGlmIChmdW5jID09IE5VTEwpCisJCXsKKwkJICB3 YXJuaW5nIChfKCJcCitub3Qgc2F2ZSBcIiVzXCIgb2YgdHJhY2Vwb2ludCAl ZCB0byBjdGYgZmlsZSBiZWNhdXNlIG5vIHN5bWJvbCB0YWJsZSBpbmZvIGF2 YWlsYWJsZS4iKSwKKwkJCSAgIGFjdGlvbl9leHAsIHRwcy0+dHAtPmJhc2Uu bnVtYmVyKTsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgICAgaXRlcmF0 ZV9vdmVyX2Jsb2NrX2FyZ192YXJzIChTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1 bmMpLAorCQkJCQkgICB0c3Zfc2F2ZV9kb19sb2NfYXJnX2NvbGxlY3QsCisJ CQkJCSAgICZjYl9kYXRhKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlj dGZfc2F2ZV9jb2xsZWN0X2dldF8xICh0Y3NwLCB0cHMsIGFjdGlvbl9leHAp OworCisgICAgICBpZiAobmV4dF9jb21tYSkKKwlkb19jbGVhbnVwcyAob2xk X2NoYWluKTsKKyAgICAgIGFjdGlvbl9leHAgPSBuZXh0X2NvbW1hOworICAg IH0KKyAgd2hpbGUgKGFjdGlvbl9leHAgJiYgKmFjdGlvbl9leHAgPT0gJywn KTsKK30KKworLyogQ2FsbCBmdW5jdGlvbiBjdGZfc2F2ZV9jb2xsZWN0X2dl dCBBZGQgYWN0aW9uIGxpc3QgQUNUSU9OIG9mIFRQUworICAgdG8gVFBTLT5j b2xsZWN0LgorICAgU1RFUFBJTkdfRlJBTUUgaXMgdHJ1ZSBpZiBpdCBpcyBz dGVwIGFjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitjdGZfc2F2ZV90cF9h Y3Rpb25zIChzdHJ1Y3QgY3RmX3NhdmVfcyAqdGNzcCwgc3RydWN0IGN0Zl9z YXZlX3RwX3MgKnRwcywKKwkJICAgICBzdHJ1Y3QgY29tbWFuZF9saW5lICph Y3Rpb24sIGludCBzdGVwcGluZ19mcmFtZSkKK3sKKyAgZm9yICg7IGFjdGlv biAhPSBOVUxMOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCisgICAgeworICAg ICAgY2hhciAqYWN0aW9uX2V4cDsKKyAgICAgIHN0cnVjdCBjbWRfbGlzdF9l bGVtZW50ICpjbWQ7CisKKyAgICAgIFFVSVQ7CisgICAgICBhY3Rpb25fZXhw ID0gYWN0aW9uLT5saW5lOworICAgICAgd2hpbGUgKGlzc3BhY2UgKChpbnQp ICphY3Rpb25fZXhwKSkKKwlhY3Rpb25fZXhwKys7CisgICAgICBpZiAoKmFj dGlvbl9leHAgPT0gJyMnKQorCWNvbnRpbnVlOworCisgICAgICBjbWQgPSBs b29rdXBfY21kICgmYWN0aW9uX2V4cCwgY21kbGlzdCwgIiIsIC0xLCAxKTsK KyAgICAgIGlmIChjbWQgPT0gMCkKKwllcnJvciAoXygiQmFkIGFjdGlvbiBs aXN0IGl0ZW06ICVzIiksIGFjdGlvbl9leHApOworCisgICAgICBpZiAoY21k X2NmdW5jX2VxIChjbWQsIHdoaWxlX3N0ZXBwaW5nX3BzZXVkb2NvbW1hbmQp KQorCXsKKwkgIGludCBpOworCisJICBmb3IgKGkgPSAwOyBpIDwgYWN0aW9u LT5ib2R5X2NvdW50OyArK2kpCisJICAgIGN0Zl9zYXZlX3RwX2FjdGlvbnMg KHRjc3AsIHRwcywgYWN0aW9uLT5ib2R5X2xpc3RbaV0sIDEpOworCX0KKyAg ICAgIGVsc2UgaWYgKGNtZF9jZnVuY19lcSAoY21kLCBjb2xsZWN0X3BzZXVk b2NvbW1hbmQpKQorCXsKKwkgIGlmIChzdGVwcGluZ19mcmFtZSAhPSB0cHMt PnN0ZXBwaW5nX2ZyYW1lKQorCSAgICBjb250aW51ZTsKKwkgIGlmICgqYWN0 aW9uX2V4cCA9PSAnLycpCisJICAgIGFjdGlvbl9leHAgPSBkZWNvZGVfYWdl bnRfb3B0aW9ucyAoYWN0aW9uX2V4cCk7CisJICBjdGZfc2F2ZV9jb2xsZWN0 X2dldCAodGNzcCwgdHBzLCBhY3Rpb25fZXhwKTsKKwl9CisgICAgfQorfQor CisKKy8qIFRyeSB0byBmaW5kIHRoZSBjdGZfc2F2ZV90cF9zIHN0cnVjdCBp biB0aGUgVENTUC0+dHAuCisgICBJZiBjYW5ub3QgZmluZCBpdCBpbiB0aGUg VENTUC0+dHAsIG1ha2UgYSBuZXcgb25lIGZvciBUUAorICAgYW5kIGFkZCBp dCB0byBUQ1NQLT50cC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY3RmX3NhdmVf dHBfcyAqCitjdGZfc2F2ZV90cF9maW5kIChzdHJ1Y3QgY3RmX3NhdmVfcyAq dGNzcCwgc3RydWN0IHRyYWNlcG9pbnQgKnRwKQoreworICBzdHJ1Y3QgY3Rm X3NhdmVfdHBfcyAqcmV0OworICBzdHJ1Y3QgYnBfbG9jYXRpb24gKmxvYzsK KyAgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZTsKKyAgaW50IHN0ZXBwaW5n X2ZyYW1lID0gMDsKKyAgc3RydWN0IGNvbW1hbmRfbGluZSAqYWN0aW9uOwor ICB2b2xhdGlsZSBzdHJ1Y3QgZ2RiX2V4Y2VwdGlvbiBlOworICBDT1JFX0FE RFIgcGM7CisKKyAgVFJZX0NBVENIIChlLCBSRVRVUk5fTUFTS19FUlJPUikK KyAgICB7CisgICAgICBwYyA9IHJlZ2NhY2hlX3JlYWRfcGMgKGdldF9jdXJy ZW50X3JlZ2NhY2hlICgpKTsKKyAgICB9CisgIGlmIChlLnJlYXNvbiA+PSAw KQorICAgIHsKKyAgICAgIHN0ZXBwaW5nX2ZyYW1lID0gMTsKKyAgICAgIGZv ciAobG9jID0gdHAtPmJhc2UubG9jOyBsb2M7IGxvYyA9IGxvYy0+bmV4dCkK Kwl7CisJICBpZiAobG9jLT5hZGRyZXNzID09IHBjKQorICAgICAgICAgICAg eworCSAgICAgIHN0ZXBwaW5nX2ZyYW1lID0gMDsKKwkgICAgICBicmVhazsK KwkgICAgfQorICAgICAgICB9CisgICAgfQorCisgIGZvciAocmV0ID0gdGNz cC0+dHA7IHJldDsgcmV0ID0gcmV0LT5uZXh0KQorICAgIHsKKyAgICAgIGlm IChyZXQtPnRwID09IHRwICYmIHJldC0+c3RlcHBpbmdfZnJhbWUgPT0gc3Rl cHBpbmdfZnJhbWUpCisJcmV0dXJuIHJldDsKKyAgICB9CisKKyAgcmV0ID0g KHN0cnVjdCBjdGZfc2F2ZV90cF9zICopIHhjYWxsb2MgKDEsIHNpemVvZiAo KnJldCkpOworCisgIC8qIEFkZCB0cCB0byB0aGUgbGlzdC4gICovCisgIHJl dC0+bmV4dCA9IHRjc3AtPnRwOworICB0Y3NwLT50cCA9IHJldDsKKworICBy ZXQtPnN0ZXBwaW5nX2ZyYW1lID0gc3RlcHBpbmdfZnJhbWU7CisgIHJldC0+ dHAgPSB0cDsKKworICBpZiAoIXN0ZXBwaW5nX2ZyYW1lICYmICpkZWZhdWx0 X2NvbGxlY3QpCisgICAgY3RmX3NhdmVfY29sbGVjdF9nZXQgKHRjc3AsIHJl dCwgZGVmYXVsdF9jb2xsZWN0KTsKKworICBjdGZfc2F2ZV90cF9hY3Rpb25z ICh0Y3NwLCByZXQsIGJyZWFrcG9pbnRfY29tbWFuZHMgKCZ0cC0+YmFzZSks IDApOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIExldCBUQ1NQLT5kYXRh c3RyZWFtX2ZkIHBvaW50IHRvIHRoZSBwYXJ0IGZvciBuZXh0IHBhY2tldC4g ICovCisKK3N0YXRpYyB2b2lkCitjdGZfc2F2ZV9uZXh0X3BhY2tldCAoc3Ry dWN0IGN0Zl9zYXZlX3MgKnRjc3ApCit7CisgIHRjc3AtPnBhY2tldF9iZWdp biArPSBDVEZfUEFDS0VUX1NJWkU7CisgIGN0Zl9zYXZlX2ZzZWVrICh0Y3Nw LCB0Y3NwLT5wYWNrZXRfYmVnaW4sIFNFRUtfU0VUKTsKKyAgdGNzcC0+Y29u dGVudF9zaXplID0gMDsKK30KKworLyogV3JpdGUgdGhlIGNvbnRlbnQgc2l6 ZSB0byBwYWNrZXQgaGVhZGVyIGNvbnRleHQuICovCisKK3N0YXRpYyB2b2lk CitjdGZfc2F2ZV93cml0ZV9jb250ZW50X3NpemUgKHN0cnVjdCBjdGZfc2F2 ZV9zICp0Y3NwKQoreworICB1aW50MzJfdCB1MzI7CisKKyAgY3RmX3NhdmVf ZnNlZWsgKHRjc3AsIHRjc3AtPnBhY2tldF9iZWdpbiArIDQsIFNFRUtfU0VU KTsKKyAgdTMyID0gdGNzcC0+Y29udGVudF9zaXplICogVEFSR0VUX0NIQVJf QklUOworICBjdGZfc2F2ZV93cml0ZSAodGNzcCwgKHZvaWQgKikmdTMyLCA0 KTsKK30KKworLyogV3JpdGUgdGhlIENURiBkYXRhIHBhY2tldCBoZWFkZXIg Y29udGV4dC4gICovCisKK3N0YXRpYyB2b2lkCitjdGZfc2F2ZV93cml0ZV9w YWNrZXRfaGVhZGVyX2NvbnRleHQgKHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3Nw KQoreworICB1aW50MzJfdCB1MzI7CisKKyAgLyogbWFnaWMuICAqLworICB1 MzIgPSBDVEZfTUFHSUM7CisgIGN0Zl9zYXZlX3dyaXRlICh0Y3NwLCAodm9p ZCAqKSZ1MzIsIDQpOworICB0Y3NwLT5jb250ZW50X3NpemUgKz0gNDsKKwor ICAvKiBjb250ZW50X3NpemUuICBXZSBzdGlsbCBkb24ndCBrbm93IHRoZSBz aXplLCB3cml0ZSBpdCBsYXRlci4gICovCisgIGN0Zl9zYXZlX2ZzZWVrICh0 Y3NwLCA0LCBTRUVLX0NVUik7CisgIHRjc3AtPmNvbnRlbnRfc2l6ZSArPSA0 OworCisgIC8qIHBhY2tldF9zaXplICovCisgIHUzMiA9IENURl9QQUNLRVRf U0laRSAqIFRBUkdFVF9DSEFSX0JJVDsKKyAgY3RmX3NhdmVfd3JpdGUgKHRj c3AsICh2b2lkICopJnUzMiwgNCk7CisgIHRjc3AtPmNvbnRlbnRfc2l6ZSAr PSA0OworCisgIHRjc3AtPmN1cnJlbnRfY29udGVudF9zaXplID0gdGNzcC0+ Y29udGVudF9zaXplOworCisgIC8qIE1ha2UgdGhpcyBwYWNrZXQgYWxsIGlu dG8gZmlsZS4gICovCisgIGN0Zl9zYXZlX2ZzZWVrICh0Y3NwLCB0Y3NwLT5w YWNrZXRfYmVnaW4gKyBDVEZfUEFDS0VUX1NJWkUgLSA0LCBTRUVLX1NFVCk7 CisgIHUzMiA9IDA7CisgIGN0Zl9zYXZlX3dyaXRlICh0Y3NwLCAodm9pZCAq KSZ1MzIsIDQpOworICBjdGZfc2F2ZV9mc2VlayAodGNzcCwgdGNzcC0+cGFj a2V0X2JlZ2luICsgdGNzcC0+Y29udGVudF9zaXplLCBTRUVLX1NFVCk7Cit9 CisKKy8qIENoYW5nZSBJLXRoIGNoYXIgaW4gQ1RGX1NUUiB0byBTVFIuICAq LworCitzdGF0aWMgY2hhciAqCitjdGZfc2F2ZV9tZXRhZGF0YV9jaGFuZ2Vf Y2hhciAoY2hhciAqY3RmX3N0ciwgaW50IGksIGNvbnN0IGNoYXIgKnN0cikK K3sKKyAgY2hhciAqbmV3OworCisgIGN0Zl9zdHJbaV0gPSAnXDAnOworICBu ZXcgPSB4c3RycHJpbnRmICgiJXMlcyVzXyVzIiwgY3RmX3N0ciwgKGkgPyAi XyIgOiAiIiksCisJCSAgICBzdHIsIGN0Zl9zdHIgKyBpICsgMSk7CisgIHhm cmVlIChjdGZfc3RyKTsKKworICByZXR1cm4gbmV3OworfQorCisvKiBXcml0 ZSB0aGUgaGVhZGVyIG9mIENURidzIG1ldGFkYXRhIHRvIFRDU1AtPk1FVEFE QVRBX0ZELiAgKi8KKworc3RhdGljIHZvaWQKK2N0Zl9zYXZlX21ldGFkYXRh X2hlYWRlciAoc3RydWN0IGN0Zl9zYXZlX3MgKnRjc3ApCit7CisgIGNvbnN0 IGNoYXIgbWV0YWRhdGFfZm10W10gPQorICAiXG50cmFjZSB7XG4iCisgICIJ bWFqb3IgPSAldTtcbiIKKyAgIgltaW5vciA9ICV1O1xuIgorICAiCWJ5dGVf b3JkZXIgPSAlcztcbiIJCS8qIGJlIG9yIGxlICovCisgICIJcGFja2V0Lmhl YWRlciA6PSBzdHJ1Y3Qge1xuIgorICAiCQl1aW50MzJfdCBtYWdpYztcbiIK KyAgIgl9O1xuIgorICAifTtcbiIKKyAgIlxuIgorICAic3RyZWFtIHtcbiIK KyAgIglwYWNrZXQuY29udGV4dCA6PSBzdHJ1Y3Qge1xuIgorICAiCQl1aW50 MzJfdCBjb250ZW50X3NpemU7XG4iCisgICIJCXVpbnQzMl90IHBhY2tldF9z aXplO1xuIgorICAiCX07XG4iCisgICIJZXZlbnQuaGVhZGVyIDo9IHN0cnVj dCB7XG4iCisgICIJCXVpbnQzMl90IGlkO1xuIgorICAiCX07XG4iCisgICJ9 O1xuIjsKKworICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0ICh0Y3NwLT5tZXRh ZGF0YV9mZCwgIi8qIENURiAlZC4lZCAqL1xuIiwKKwkJCSAgQ1RGX1NBVkVf TUFKT1IsIENURl9TQVZFX01JTk9SKTsKKyAgY3RmX3NhdmVfZndyaXRlX2Zv cm1hdCAodGNzcC0+bWV0YWRhdGFfZmQsICJcCit0eXBlYWxpYXMgaW50ZWdl ciB7IHNpemUgPSAzMjsgYWxpZ24gPSAzMjsgc2lnbmVkID0gZmFsc2U7IH0g Oj0gdWludDMyX3Q7XG4iKTsKKyAgY3RmX3NhdmVfZndyaXRlX2Zvcm1hdCAo dGNzcC0+bWV0YWRhdGFfZmQsICJcCit0eXBlYWxpYXMgaW50ZWdlciB7IHNp emUgPSA2NDsgYWxpZ24gPSA2NDsgc2lnbmVkID0gZmFsc2U7IH0gOj0gdWlu dDY0X3Q7XG4iKTsKKyAgY3RmX3NhdmVfZndyaXRlX2Zvcm1hdCAodGNzcC0+ bWV0YWRhdGFfZmQsICJcbiIpOworCisgIGN0Zl9zYXZlX2Z3cml0ZV9mb3Jt YXQgKHRjc3AtPm1ldGFkYXRhX2ZkLCBtZXRhZGF0YV9mbXQsCisJCQkgIENU Rl9TQVZFX01BSk9SLCBDVEZfU0FWRV9NSU5PUiwKKwkJCSAgQllURV9PUkRF UiA9PSBMSVRUTEVfRU5ESUFOID8gImxlIiA6ICJiZSIpOworICBjdGZfc2F2 ZV9md3JpdGVfZm9ybWF0ICh0Y3NwLT5tZXRhZGF0YV9mZCwgIlxuIik7Cit9 CisKKy8qIFdyaXRlIHRoZSBib2R5IG9mIENURidzIG1ldGFkYXRhIHRvIFRD U1AtPk1FVEFEQVRBX0ZELiAgKi8KKworc3RhdGljIHZvaWQKK2N0Zl9zYXZl X21ldGFkYXRhIChzdHJ1Y3QgY3RmX3NhdmVfcyAqdGNzcCkKK3sKKyAgc3Ry dWN0IGN0Zl9zYXZlX3RwX3MgKnRwczsKKyAgc3RydWN0IGN0Zl9zYXZlX2Nv bGxlY3RfcyAqY29sbGVjdDsKKyAgc3RydWN0IGN0Zl9zYXZlX3R5cGVfcyAq dDsKKworICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0ICh0Y3NwLT5tZXRhZGF0 YV9mZCwgIlxuIik7CisKKyAgLyogV3JpdGUgZXZlbnQuICAqLworICBmb3Ig KHRwcyA9IHRjc3AtPnRwOyB0cHM7IHRwcyA9IHRwcy0+bmV4dCkKKyAgICB7 CisgICAgICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0ICh0Y3NwLT5tZXRhZGF0 YV9mZCwKKwkJCSAgICAgICJldmVudCB7XG5cdG5hbWUgPSBcIiVzXCI7XG5c dGlkID0gJWQ7XG4iCisJCQkgICAgICAiXHRmaWVsZHMgOj0gc3RydWN0IHsg XG4iLAorCQkJICAgICAgdHBzLT50cC0+YmFzZS5hZGRyX3N0cmluZywgdHBz LT50cC0+YmFzZS5udW1iZXIpOworICAgICAgZm9yIChjb2xsZWN0ID0gdHBz LT5jb2xsZWN0OyBjb2xsZWN0OyBjb2xsZWN0ID0gY29sbGVjdC0+bmV4dCkK KyAgICAgICAgeworCSAgY2hhciAqdG1wOworCSAgY29uc3QgY2hhciAqb2xk X3RhYjsKKworCSAgaWYgKGNvbGxlY3QtPmlzX3JldCkKKwkgICAgY29sbGVj dC0+Y3RmX3N0ciA9IHhzdHJkdXAgKCJyZXRfcGMiKTsKKwkgIGVsc2UKKwkg ICAgeworCSAgICAgIGNoYXIgKm5ldzsKKwkgICAgICBpbnQgbmVlZF9yZWNo ZWNrOworCSAgICAgIGludCBpOworCisJICAgICAgY29sbGVjdC0+Y3RmX3N0 ciA9IHhzdHJkdXAgKGNvbGxlY3QtPnN0cik7CisJICAgICAgZm9yIChpID0g MDsgY29sbGVjdC0+Y3RmX3N0cltpXSAhPSAnXDAnOyArK2kpCisJICAgICAg ICB7CisJCSAgc3dpdGNoIChjb2xsZWN0LT5jdGZfc3RyW2ldKQorCQkgICAg eworCQkgICAgY2FzZSAnJCc6CisJCSAgICAgIGNvbGxlY3QtPmN0Zl9zdHIK KwkJCSAgPSBjdGZfc2F2ZV9tZXRhZGF0YV9jaGFuZ2VfY2hhciAoY29sbGVj dC0+Y3RmX3N0ciwKKwkJCQkJCQkgICBpLCAiZG9sbGFyIik7CisJCSAgICAg IGJyZWFrOworCQkgICAgY2FzZSAnKic6CisJCSAgICAgIGNvbGxlY3QtPmN0 Zl9zdHIKKwkJCSAgPSBjdGZfc2F2ZV9tZXRhZGF0YV9jaGFuZ2VfY2hhciAo Y29sbGVjdC0+Y3RmX3N0ciwKKwkJCQkJCQkgICBpLCAic3RhciIpOworCQkg ICAgICBicmVhazsKKwkJICAgIGNhc2UgJyAnOgorCQkgICAgICBjb2xsZWN0 LT5jdGZfc3RyW2ldID0gJ18nOworCQkgICAgICBicmVhazsKKwkJICAgIH0K KwkJfQorCSAgICB9CisKKwkgIHRtcCA9IGFsbG9jYSAoc3RybGVuIChjb2xs ZWN0LT5jdGZfc3RyKSArIDMwKTsKKwkgIHN0cmNweSAodG1wLCBjb2xsZWN0 LT5jdGZfc3RyKTsKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgc3Ry dWN0IGN0Zl9zYXZlX2NvbGxlY3RfcyAqY29sbGVjdDI7CisJICAgICAgaW50 IGkgPSAwOworCisJICAgICAgZm9yIChjb2xsZWN0MiA9IHRwcy0+Y29sbGVj dDsgY29sbGVjdDI7CisJCSAgIGNvbGxlY3QyID0gY29sbGVjdDItPm5leHQp CisJCXsKKwkJICBpZiAoY29sbGVjdDItPmN0Zl9zdHIKKwkJICAgICAgJiYg c3RyY21wIChjb2xsZWN0Mi0+Y3RmX3N0ciwgdG1wKSA9PSAwKQorCQkgICAg YnJlYWs7CisJCX0KKwkgICAgICBpZiAoY29sbGVjdDIgPT0gTlVMTCkKKwkJ YnJlYWs7CisKKwkgICAgICBzbnByaW50ZiAodG1wLCBzdHJsZW4gKGNvbGxl Y3QtPmN0Zl9zdHIpICsgMzAsCisJCQkiJXNfJWQiLCBjb2xsZWN0LT5jdGZf c3RyLCBpKyspOworCSAgICB9CisKKwkgIGlmIChzdHJjbXAgKGNvbGxlY3Qt PmN0Zl9zdHIsIGNvbGxlY3QtPnN0cikpCisJICAgIHdhcm5pbmcgKF8oIlwK K1wiJXNcIiBvZiB0cmFjZXBvaW50ICVkIHJlbmFtZSB0byBcIiVzXCIgaW4g Q1RGIGZpbGUuIiksCisJCSAgICAgICBjb2xsZWN0LT5zdHIsIHRwcy0+dHAt PmJhc2UubnVtYmVyLAorCQkgICAgICAgY29sbGVjdC0+Y3RmX3N0cik7CisK KwkgIG9sZF90YWIgPSB0Y3NwLT50YWI7CisJICB0Y3NwLT50YWIgPSAiXHRc dCI7CisJICBjdGZfc2F2ZV9md3JpdGVfZm9ybWF0ICh0Y3NwLT5tZXRhZGF0 YV9mZCwgdGNzcC0+dGFiKTsKKwkgIGlmIChjb2xsZWN0LT5pc19yZXQpCisJ ICAgIGN0Zl9zYXZlX2Z3cml0ZV9mb3JtYXQgKHRjc3AtPm1ldGFkYXRhX2Zk LCAidWludDY0X3QgJXM7XG4iLAorCQkJCSAgICBjb2xsZWN0LT5jdGZfc3Ry KTsKKwkgIGVsc2UKKwkgICAgY3RmX3NhdmVfdmFyX2RlZmluZV93cml0ZSAo dGNzcCwgY29sbGVjdC0+dHlwZSwgY29sbGVjdC0+Y3RmX3N0cik7CisJICB0 Y3NwLT50YWIgPSBvbGRfdGFiOworCX0KKyAgICAgIGN0Zl9zYXZlX2Z3cml0 ZV9mb3JtYXQgKHRjc3AtPm1ldGFkYXRhX2ZkLCAiXHR9O1xufTtcbiIpOwor ICAgIH0KK30KKworLyogQ2xlYW4gZnVuY3Rpb24gZm9yIGN0Zl9zYXZlLiAg Ki8KKworc3RhdGljIHZvaWQKK2N0Zl9zYXZlX2NsZWFudXAgKHZvaWQgKnAp Cit7CisgIHN0cnVjdCBjdGZfc2F2ZV9zICp0Y3NwID0gcDsKKyAgc3RydWN0 IGN0Zl9zYXZlX3RwX3MgKnRwLCAqdG1wX3RwOworICBzdHJ1Y3QgY3RmX3Nh dmVfdHlwZV9zICp0eXBlLCAqdG1wX3R5cGU7CisKKyAgaWYgKHRjc3AtPm1l dGFkYXRhX2ZkKQorICAgIHsKKyAgICAgIGN0Zl9zYXZlX21ldGFkYXRhICh0 Y3NwKTsKKyAgICAgIGZjbG9zZSAodGNzcC0+bWV0YWRhdGFfZmQpOworICAg IH0KKworICBpZiAodGNzcC0+ZGF0YXN0cmVhbV9mZCkKKyAgICBmY2xvc2Ug KHRjc3AtPmRhdGFzdHJlYW1fZmQpOworCisgIGZvciAodHAgPSB0Y3NwLT50 cDsgdHA7IHRwID0gdG1wX3RwKQorICAgIHsKKyAgICAgIHN0cnVjdCBjdGZf c2F2ZV9jb2xsZWN0X3MgKmNvbGxlY3QsICp0bXBfY29sbGVjdDsKKworICAg ICAgZm9yIChjb2xsZWN0ID0gdHAtPmNvbGxlY3Q7IGNvbGxlY3Q7IGNvbGxl Y3QgPSB0bXBfY29sbGVjdCkKKyAgICAgICAgeworCSAgaWYgKGNvbGxlY3Qt PmV4cHIpCisJICAgIGZyZWVfY3VycmVudF9jb250ZW50cyAoJmNvbGxlY3Qt PmV4cHIpOworCSAgaWYgKGNvbGxlY3QtPnN0cikKKwkgICAgeGZyZWUgKGNv bGxlY3QtPnN0cik7CisJICBpZiAoY29sbGVjdC0+Y3RmX3N0cikKKwkgICAg eGZyZWUgKGNvbGxlY3QtPmN0Zl9zdHIpOworCSAgdG1wX2NvbGxlY3QgPSBj b2xsZWN0LT5uZXh0OworCSAgeGZyZWUgKGNvbGxlY3QpOworICAgICAgICB9 CisgICAgICB0bXBfdHAgPSB0cC0+bmV4dDsKKyAgICAgIHhmcmVlICh0cCk7 CisgICAgfQorCisgIGZvciAodHlwZSA9IHRjc3AtPnR5cGU7IHR5cGU7IHR5 cGUgPSB0bXBfdHlwZSkKKyAgICB7CisgICAgICB0bXBfdHlwZSA9IHR5cGUt Pm5leHQ7CisgICAgICB4ZnJlZSAodHlwZSk7CisgICAgfQorCisgIHJlaW5p dF9mcmFtZV9jYWNoZSAoKTsKKyAgdGFyZ2V0X2RjYWNoZV9pbnZhbGlkYXRl ICgpOworICBzZXRfY3VycmVudF90cmFjZWZyYW1lICh0Y3NwLT5vbGRfdHJh Y2VmcmFtZV9udW0pOworfQorCisvKiBTYXZlIGN1cnJlbnQgdHJhY2UgZnJh bWUgdG8gRElSTkFNRS4gICovCisKK3ZvaWQKK2N0Zl9zYXZlIChjb25zdCBj aGFyICpkaXJuYW1lKQoreworICBzdHJ1Y3QgY3RmX3NhdmVfcyB0Y3M7Cisg IHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGludCBmcmFtZV9udW07 CisgIGNoYXIgKmZpbGVfbmFtZTsKKyAgc3RydWN0IGN0Zl9zYXZlX3R5cGVf cyAqdDsKKyAgY2hhciB0YWJbXSA9ICIiOworCisgIC8qIENyZWF0ZSBESVJO QU1FLiAgKi8KKyAgZmlsZV9uYW1lID0gYWxsb2NhIChzdHJsZW4gKGRpcm5h bWUpICsgMQorCQkgICAgICArIHN0cmxlbiAoQ1RGX0RBVEFTVFJFQU1fTkFN RSkgKyAxKTsKKyAgaWYgKG1rZGlyIChkaXJuYW1lLCBTX0lSV1hVIHwgU19J UkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USCkKKyAgICAgICYm IGVycm5vICE9IEVFWElTVCkKKyAgICBlcnJvciAoXygiVW5hYmxlIHRvIG9w ZW4gZGlyZWN0b3J5ICclcycgZm9yIHNhdmluZyB0cmFjZSBkYXRhICglcyki KSwKKwkgICBkaXJuYW1lLCBzYWZlX3N0cmVycm9yIChlcnJubykpOworCisg IG1lbXNldCAoJnRjcywgJ1wwJywgc2l6ZW9mICh0Y3MpKTsKKyAgdGNzLm9s ZF90cmFjZWZyYW1lX251bSA9IGdldF90cmFjZWZyYW1lX251bWJlciAoKTsK KyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChjdGZfc2F2ZV9jbGVhbnVw LCAmdGNzKTsKKyAgdGNzLnRhYiA9IHRhYjsKKworICBzcHJpbnRmIChmaWxl X25hbWUsICIlcy8lcyIsIGRpcm5hbWUsIENURl9NRVRBREFUQV9OQU1FKTsK KyAgdGNzLm1ldGFkYXRhX2ZkID0gZm9wZW4gKGZpbGVfbmFtZSwgInciKTsK KyAgaWYgKCF0Y3MubWV0YWRhdGFfZmQpCisgICAgZXJyb3IgKF8oIlVuYWJs ZSB0byBvcGVuIGZpbGUgJyVzJyBmb3Igc2F2aW5nIHRyYWNlIGRhdGEgKCVz KSIpLAorCSAgIGZpbGVfbmFtZSwgc2FmZV9zdHJlcnJvciAoZXJybm8pKTsK KyAgY3RmX3NhdmVfbWV0YWRhdGFfaGVhZGVyICgmdGNzKTsKKworICBzcHJp bnRmIChmaWxlX25hbWUsICIlcy8lcyIsIGRpcm5hbWUsIENURl9EQVRBU1RS RUFNX05BTUUpOworICB0Y3MuZGF0YXN0cmVhbV9mZCA9IGZvcGVuIChmaWxl X25hbWUsICJ3Iik7CisgIGlmICghdGNzLmRhdGFzdHJlYW1fZmQpCisgICAg ZXJyb3IgKF8oIlVuYWJsZSB0byBvcGVuIGZpbGUgJyVzJyBmb3Igc2F2aW5n IHRyYWNlIGRhdGEgKCVzKSIpLAorCSAgIGZpbGVfbmFtZSwgc2FmZV9zdHJl cnJvciAoZXJybm8pKTsKKworICBjdGZfc2F2ZV93cml0ZV9wYWNrZXRfaGVh ZGVyX2NvbnRleHQoJnRjcyk7CisKKyAgZm9yIChmcmFtZV9udW0gPSAwOyAx OyBmcmFtZV9udW0gKyspCisgICAgeworICAgICAgaW50IHRudW07CisgICAg ICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdHA7CisgICAgICBpbnQgdHJ5X2NvdW50 OworICAgICAgdWludDMyX3QgdTMyOworICAgICAgc3RydWN0IGN0Zl9zYXZl X3RwX3MgKnRwczsKKyAgICAgIHN0cnVjdCBjdGZfc2F2ZV9jb2xsZWN0X3Mg KmNvbGxlY3Q7CisgICAgICBpbnQgdHJhY2VmcmFtZV9pc19kcm9wcGVkID0g MDsKKworICAgICAgLyogQWxsb3cgdXNlciB0byBiYWlsIG91dCB3aXRoIF5D LiAgKi8KKyAgICAgIFFVSVQ7CisKKyAgICAgIC8qIEdvdG8gdHJhY2VmcmFt ZSBmcmFtZV9udW0gYW5kIHNldCB0cC4gICovCisgICAgICBmcmFtZV9udW0g PSB0YXJnZXRfdHJhY2VfZmluZCAodGZpbmRfbnVtYmVyLCBmcmFtZV9udW0s IDAsIDAsICZ0bnVtKTsKKyAgICAgIGlmIChmcmFtZV9udW0gPCAwKQorCWJy ZWFrOworICAgICAgdHAgPSBnZXRfdHJhY2Vwb2ludF9ieV9udW1iZXJfb25f dGFyZ2V0ICh0bnVtKTsKKyAgICAgIGlmICghdHApCisgICAgICAgIHsKKwkg IHdhcm5pbmcgKF8oImRyb3AgdHJhY2VmcmFtZSAlZCBiZWNhdXNlIGNhbm5v dCBmaW5kIHRyYWNlcG9pbnQgJWQuIiksCisJCSAgIGZyYW1lX251bSwgdG51 bSk7CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoIXRwLT5iYXNlLmxv YykKKyAgICAgICAgeworCSAgd2FybmluZyAoXygiZHJvcCB0cmFjZWZyYW1l ICVkIGJlY2F1c2UgdHJhY2Vwb2ludCAlZCBpcyBwZW5kaW5nLiIpLAorCQkg ICBmcmFtZV9udW0sIHRwLT5iYXNlLm51bWJlcik7CisJICBjb250aW51ZTsK Kwl9CisgICAgICByZWluaXRfZnJhbWVfY2FjaGUgKCk7CisgICAgICB0YXJn ZXRfZGNhY2hlX2ludmFsaWRhdGUgKCk7CisgICAgICBzZXRfY3VycmVudF90 cmFjZWZyYW1lIChmcmFtZV9udW0pOworCisgICAgICB0cHMgPSBjdGZfc2F2 ZV90cF9maW5kICgmdGNzLCB0cCk7CisKKyAgICAgIC8qIFRoZSB0cCBpcyBu b3QgdmFyaWFibGUtbGVuZ3RoIGFuZCBiaWdnZXIgdGhhbiBDVEZfUEFDS0VU X1NJWkUuCisgICAgICAgICBTbyBkcm9wIGl0LiAgKi8KKyAgICAgIGlmICh0 cHMtPmlzX2Ryb3BwZWQpCisJY29udGludWU7CisKKyAgICAgIC8qIFRyeSBj b3VudCBmb3IgY3VycmVudCB0cCB3cml0ZS4KKyAgICAgICAgIElmIHRyeSBz ZWNvbmQgdGltZSwgdGhlIGV2ZW50IHNpemUgYmlnZ2VyIHRoYW4gYSBwYWNr ZXQuCisgICAgICAgICBUaGVuIGRyb3AgdGhpcyBldmVudC4gICovCisgICAg ICB0cnlfY291bnQgPSAwOworCityZV93cml0ZV90cDoKKyAgICAgIGlmICh0 cnlfY291bnQgPiAwKQorICAgICAgICB7CisJICAvKiBIYW5kbGUgcmV0cnku ICAqLworCSAgaWYgKHRyeV9jb3VudCA+IDEgfHwgNCArIDQgKyA0ID09IHRj cy5jb250ZW50X3NpemUpCisJICAgIHsKKwkgICAgICAvKiBTZWNvbmQgcmV0 cnkgb3IgcGFja2V0IGp1c3Qgd3JpdGUgdGhhdCBwYWNrZXQgbWVhbnMKKwkg ICAgICAgICB0aGlzIFRQIGlzIHRvbyBiaWcuICBTbyBkcm9wIGl0LiAgKi8K KwkgICAgICBpZiAodHBzLT5pc192YXJpYWJsZV9sZW5ndGgpCisJICAgICAg ICB7CisJCSAgLyogVGhlIHRwIGlzIHZhcmlhYmxlLWxlbmd0aC4gICovCisJ CSAgd2FybmluZyAoXygiXAordHJhY2VmcmFtZSAlZCBvZiB0cmFjZXBvaW50 ICVkIG5lZWQgc2F2ZSBkYXRhIHRoYXQgYmlnZ2VyIHRoYW4gcGFja2V0IHNp emUgJWQuXG5cCitTbyBpdCB3aWxsIGJlIGRyb3BwZWQuIiksIGZyYW1lX251 bSwgdHBzLT50cC0+YmFzZS5udW1iZXIsIENURl9QQUNLRVRfU0laRSk7CisJ CX0KKwkgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgLyogVGhlIHRwIGlz IG5vdCB2YXJpYWJsZS1sZW5ndGguICAqLworCQkgIHdhcm5pbmcgKF8oIlwK K3RyYWNlcG9pbnQgJWQgbmVlZCBzYXZlIGRhdGEgdGhhdCBiaWdnZXIgdGhh biBwYWNrZXQgc2l6ZSAlZC5cblwKK1NvIGFsbCBvZiBpdHMgdHJhY2VmcmFt ZXMgd2lsbCBiZSBkcm9wcGVkLiIpLAorCQkJICAgdHBzLT50cC0+YmFzZS5u dW1iZXIsIENURl9QQUNLRVRfU0laRSk7CisJCSAgLyogTWFyayB0aGlzIHRw IHRvIGxldCBHREIgZHJvcCBpdHMgdHJhY2VmcmFtZXMuICAqLworCQkgIHRw cy0+aXNfZHJvcHBlZCA9IDE7CisJCX0KKwkgICAgICBjb250aW51ZTsKKwkg ICAgfQorCisJICB0Y3MuY2hlY2tfc2l6ZSA9IDA7CisJICBjdGZfc2F2ZV93 cml0ZV9jb250ZW50X3NpemUgKCZ0Y3MpOworICAgICAgICAgIGN0Zl9zYXZl X25leHRfcGFja2V0ICgmdGNzKTsKKwkgIGN0Zl9zYXZlX3dyaXRlX3BhY2tl dF9oZWFkZXJfY29udGV4dCgmdGNzKTsKKwl9CisKKyAgICAgIHRyeV9jb3Vu dCArKzsKKworICAgICAgdGNzLmN1cnJlbnRfY29udGVudF9zaXplID0gdGNz LmNvbnRlbnRfc2l6ZTsKKyAgICAgIHRjcy5jaGVja19zaXplID0gMTsKKwor ICAgICAgLyogV3JpdGUgZXZlbnQgaGVhZGVyICovCisgICAgICBpZiAodHBz LT5zdGVwcGluZ19mcmFtZSkKKyAgICAgICAgdTMyID0gKHVpbnQzMl90KSAo LXRwcy0+dHAtPmJhc2UubnVtYmVyKTsKKyAgICAgIGVsc2UKKwl1MzIgPSAo dWludDMyX3QpIHRwcy0+dHAtPmJhc2UubnVtYmVyOworICAgICAgaWYgKGN0 Zl9zYXZlX2FsaWduX3dyaXRlICgmdGNzLCAodm9pZCAqKSZ1MzIsIHNpemVv ZiAodTMyKSwKKwkJCQlzaXplb2YgKHUzMikpKQorCWdvdG8gcmVfd3JpdGVf dHA7CisKKyAgICAgIC8qIEFsaWduLiAgKi8KKyAgICAgIGlmICh0cHMtPmFs aWduX3NpemUpCisgICAgICAgIHsKKwkgIGlmIChjdGZfc2F2ZV9mc2VlayAo JnRjcywKKwkJCSAgICAgIEFMSUdOX1NJWkUodGNzLmN1cnJlbnRfY29udGVu dF9zaXplLAorCQkJCQkgdHBzLT5hbGlnbl9zaXplKSwKKwkJCSAgICAgIFNF RUtfQ1VSKSkKKwkgICAgZ290byByZV93cml0ZV90cDsKKwl9CisKKyAgICAg IGZvciAoY29sbGVjdCA9IHRwcy0+Y29sbGVjdDsgY29sbGVjdDsgY29sbGVj dCA9IGNvbGxlY3QtPm5leHQpCisgICAgICAgIHsKKwkgIHZvbGF0aWxlIHN0 cnVjdCBnZGJfZXhjZXB0aW9uIGU7CisKKwkgIGlmIChjb2xsZWN0LT5pc19y ZXQpCisJICAgIHsKKwkgICAgICBDT1JFX0FERFIgcGM7CisJICAgICAgdWlu dDY0X3QgdTY0OworCisJICAgICAgVFJZX0NBVENIIChlLCBSRVRVUk5fTUFT S19FUlJPUikKKwkJeworCQkgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsK KworCQkgIGZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisJCSAgaWYg KCFmcmFtZSkKKwkJICAgIGVycm9yIChfKCJnZXQgY3VycmVudCBmcmFtZSBm YWlsIikpOworCQkgIGZyYW1lID0gZ2V0X3ByZXZfZnJhbWUgKGZyYW1lKTsK KwkJICBpZiAoIWZyYW1lKQorCQkgICAgZXJyb3IgKF8oImdldCBwcmV2IGZy YW1lIGZhaWwiKSk7CisKKwkJICBpZiAoIWdldF9mcmFtZV9wY19pZl9hdmFp bGFibGUgKGZyYW1lLCAmcGMpKQorCQkgICAgZXJyb3IgKF8oIlBDIHVuYXZh aWxhYmxlIikpOworCQl9CisJICAgICAgaWYgKGUucmVhc29uIDwgMCkKKwkJ eworCQkgIHdhcm5pbmcgKF8oIlwKK3RyYWNlZnJhbWUgJWQgaXMgZHJvcHBl ZCBiZWNhdXNlIHRyeSB0byBnZXQgdGhlIHZhbHVlIG9mIFwiJXNcIiBnb3Qg ZXJyb3I6ICVzIiksCisJCQkgICBmcmFtZV9udW0sIGNvbGxlY3QtPnN0ciwg ZS5tZXNzYWdlKTsKKwkJICB0cmFjZWZyYW1lX2lzX2Ryb3BwZWQgPSAxOwor CQkgIGJyZWFrOworCQl9CisKKwkgICAgICB1NjQgPSBwYzsKKwkgICAgICBp ZiAoY3RmX3NhdmVfYWxpZ25fd3JpdGUgKCZ0Y3MsIChnZGJfYnl0ZSAqKSAm dTY0LAorCQkJCQlzaXplb2YgKHU2NCksIHNpemVvZiAodTY0KSkpCisJCWdv dG8gcmVfd3JpdGVfdHA7CisJICAgIH0KKwkgIGVsc2UKKyAgICAgICAgICAg IHsKKwkgICAgICBzdHJ1Y3QgdmFsdWUgKnZhbDsKKwkgICAgICBzdHJ1Y3Qg Y2xlYW51cCAqYmFja19jaGFpbjsKKwkgICAgICBjb25zdCBnZGJfYnl0ZSAq Y29udGVudDsKKworCSAgICAgIGJhY2tfY2hhaW4gPSBtYWtlX2NsZWFudXAg KG51bGxfY2xlYW51cCwgTlVMTCk7CisJICAgICAgVFJZX0NBVENIIChlLCBS RVRVUk5fTUFTS19FUlJPUikKKwkgICAgICAgIHsKKwkJICB2YWwgPSBldmFs dWF0ZV9leHByZXNzaW9uIChjb2xsZWN0LT5leHByKTsKKwkJICBjb250ZW50 ID0gdmFsdWVfY29udGVudHMgKHZhbCk7CisJCX0KKwkgICAgICBpZiAoZS5y ZWFzb24gPCAwIHx8IGNvbGxlY3QtPnR5cGUgIT0gdmFsdWVfdHlwZSAodmFs KSkKKwkJeworCQkgIGlmIChlLnJlYXNvbiA8IDApCisJCSAgICB3YXJuaW5n IChfKCJcCit0cmFjZWZyYW1lICVkIGlzIGRyb3BwZWQgYmVjYXVzZSB0cnkg dG8gZ2V0IHRoZSB2YWx1ZSBvZiBcIiVzXCIgZ290IGVycm9yOiAlcyIpLAor CQkJICAgICBmcmFtZV9udW0sIGNvbGxlY3QtPnN0ciwgZS5tZXNzYWdlKTsK KwkJICBlbHNlCisJCSAgICB3YXJuaW5nIChfKCJcCit0cmFjZWZyYW1lICVk IGlzIGRyb3BwZWQgYmVjYXVzZSB0eXBlIG9mIFwiJXNcIiBpcyB3cm9uZy4i KSwKKwkJCSAgICAgZnJhbWVfbnVtLCBjb2xsZWN0LT5zdHIpOworCQkgIHRy YWNlZnJhbWVfaXNfZHJvcHBlZCA9IDE7CisJCSAgZG9fY2xlYW51cHMgKGJh Y2tfY2hhaW4pOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBXcml0 ZSB0aGlzIHZhbCBhY2NvcmRpbmcgdG8gdHlwZS4gICovCisJICAgICAgaWYg KGN0Zl9zYXZlX2FsaWduX3dyaXRlICgmdGNzLCBjb250ZW50LAorCQkJCQlU WVBFX0xFTkdUSCAoY29sbGVjdC0+dHlwZSksCisJCQkJCWNvbGxlY3QtPmFs aWduX3NpemUpKQorCQl7CisJCSAgZG9fY2xlYW51cHMgKGJhY2tfY2hhaW4p OworCQkgIGdvdG8gcmVfd3JpdGVfdHA7CisJCX0KKworCSAgICAgIC8qIEZy ZWUgdGhlIG1lbW9yeSB0aGF0IGFsbG9jIGJ5IGV2YWx1YXRlX2V4cHJlc3Np b24uICAqLworCSAgICAgIGRvX2NsZWFudXBzIChiYWNrX2NoYWluKTsKKwkg ICAgfQorCX0KKworICAgICAgaWYgKHRyYWNlZnJhbWVfaXNfZHJvcHBlZCkK Kwljb250aW51ZTsKKworICAgICAgdGNzLmNvbnRlbnRfc2l6ZSA9IHRjcy5j dXJyZW50X2NvbnRlbnRfc2l6ZTsKKyAgICB9CisgIGN0Zl9zYXZlX3dyaXRl X2NvbnRlbnRfc2l6ZSAoJnRjcyk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9j aGFpbik7Cit9Ci0tLSAvZGV2L251bGwKKysrIGIvY3RmLmgKQEAgLTAsMCAr MSwyNSBAQAorLyogQ1RGIGZvcm1hdCBzdXBwb3J0LgorCisgICBDb3B5cmln aHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisK KyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9n cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cisg ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg ICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K KworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhp cyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBDVEZfSAorI2RlZmluZSBDVEZf SAorCitleHRlcm4gdm9pZCBjdGZfc2F2ZSAoY29uc3QgY2hhciAqZGlybmFt ZSk7CisKKyNlbmRpZgotLS0gYS9taS9taS1tYWluLmMKKysrIGIvbWkvbWkt bWFpbi5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSAib3NkYXRhLmgi CiAjaW5jbHVkZSAic3BsYXktdHJlZS5oIgogI2luY2x1ZGUgInRyYWNlcG9p bnQuaCIKKyNpbmNsdWRlICJjdGYuaCIKICNpbmNsdWRlICJhZGEtbGFuZy5o IgogI2luY2x1ZGUgImxpbmVzcGVjLmgiCiAKQEAgLTI0OTUsMTYgKzI0OTYs MTkgQEAgdm9pZAogbWlfY21kX3RyYWNlX3NhdmUgKGNoYXIgKmNvbW1hbmQs IGNoYXIgKiphcmd2LCBpbnQgYXJnYykKIHsKICAgaW50IHRhcmdldF9zYXZl cyA9IDA7CisgIGludCBnZW5lcmF0ZV9jdGYgPSAwOwogICBjaGFyICpmaWxl bmFtZTsKIAogICBpZiAoYXJnYyAhPSAxICYmIGFyZ2MgIT0gMikKLSAgICBl cnJvciAoXygiVXNhZ2U6IC10cmFjZS1zYXZlIFstcl0gZmlsZW5hbWUiKSk7 CisgICAgZXJyb3IgKF8oIlVzYWdlOiAtdHJhY2Utc2F2ZSBbLXJdIFstY3Rm XSBmaWxlbmFtZSIpKTsKIAogICBpZiAoYXJnYyA9PSAyKQogICAgIHsKICAg ICAgIGZpbGVuYW1lID0gYXJndlsxXTsKICAgICAgIGlmIChzdHJjbXAgKGFy Z3ZbMF0sICItciIpID09IDApCiAJdGFyZ2V0X3NhdmVzID0gMTsKKyAgICAg IGlmIChzdHJjbXAgKGFyZ3ZbMF0sICItY3RmIikgPT0gMCkKKwlnZW5lcmF0 ZV9jdGYgPSAxOwogICAgICAgZWxzZQogCWVycm9yIChfKCJJbnZhbGlkIG9w dGlvbjogJXMiKSwgYXJndlswXSk7CiAgICAgfQpAQCAtMjUxMyw3ICsyNTE3 LDEwIEBAIG1pX2NtZF90cmFjZV9zYXZlIChjaGFyICpjb21tYW5kLCBjaGFy ICoKICAgICAgIGZpbGVuYW1lID0gYXJndlswXTsKICAgICB9CiAKLSAgdHJh Y2Vfc2F2ZSAoZmlsZW5hbWUsIHRhcmdldF9zYXZlcyk7CisgIGlmIChnZW5l cmF0ZV9jdGYpCisgICAgY3RmX3NhdmUgKGZpbGVuYW1lKTsKKyAgZWxzZQor ICAgIHRyYWNlX3NhdmUgKGZpbGVuYW1lLCB0YXJnZXRfc2F2ZXMpOwogfQog CiB2b2lkCi0tLSBhL3RyYWNlcG9pbnQuYworKysgYi90cmFjZXBvaW50LmMK QEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlICJleGNlcHRpb25zLmgiCiAj aW5jbHVkZSAiY2xpL2NsaS11dGlscy5oIgogI2luY2x1ZGUgInByb2JlLmgi CisjaW5jbHVkZSAiY3RmLmgiCiAKIC8qIHJlYWRsaW5lIGluY2x1ZGUgZmls ZXMgKi8KICNpbmNsdWRlICJyZWFkbGluZS9yZWFkbGluZS5oIgpAQCAtNTc5 LDcgKzU4MCw3IEBAIHdoaWxlX3N0ZXBwaW5nX3BzZXVkb2NvbW1hbmQgKGNo YXIgKmFyZ3MKICAgZXJyb3IgKF8oIlRoaXMgY29tbWFuZCBjYW4gb25seSBi ZSB1c2VkIGluIGEgdHJhY2Vwb2ludCBhY3Rpb25zIGxpc3QuIikpOwogfQog Ci1zdGF0aWMgdm9pZAordm9pZAogY29sbGVjdF9wc2V1ZG9jb21tYW5kIChj aGFyICphcmdzLCBpbnQgZnJvbV90dHkpCiB7CiAgIGVycm9yIChfKCJUaGlz IGNvbW1hbmQgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHRyYWNlcG9pbnQgYWN0 aW9ucyBsaXN0LiIpKTsKQEAgLTMxNTIsNiArMzE1Myw3IEBAIHN0YXRpYyB2 b2lkCiB0cmFjZV9zYXZlX2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9t X3R0eSkKIHsKICAgaW50IHRhcmdldF9kb2VzX3NhdmUgPSAwOworICBpbnQg Z2VuZXJhdGVfY3RmID0gMDsKICAgY2hhciAqKmFyZ3Y7CiAgIGNoYXIgKmZp bGVuYW1lID0gTlVMTDsKICAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CkBA IC0zMTY2LDYgKzMxNjgsOCBAQCB0cmFjZV9zYXZlX2NvbW1hbmQgKGNoYXIg KmFyZ3MsIGludCBmcm9tCiAgICAgewogICAgICAgaWYgKHN0cmNtcCAoKmFy Z3YsICItciIpID09IDApCiAJdGFyZ2V0X2RvZXNfc2F2ZSA9IDE7CisgICAg ICBpZiAoc3RyY21wICgqYXJndiwgIi1jdGYiKSA9PSAwKQorCWdlbmVyYXRl X2N0ZiA9IDE7CiAgICAgICBlbHNlIGlmICgqKmFyZ3YgPT0gJy0nKQogCWVy cm9yIChfKCJ1bmtub3duIG9wdGlvbiBgJXMnIiksICphcmd2KTsKICAgICAg IGVsc2UKQEAgLTMxNzUsMTAgKzMxNzksMTggQEAgdHJhY2Vfc2F2ZV9jb21t YW5kIChjaGFyICphcmdzLCBpbnQgZnJvbQogICBpZiAoIWZpbGVuYW1lKQog ICAgIGVycm9yX25vX2FyZyAoXygiZmlsZSBpbiB3aGljaCB0byBzYXZlIHRy YWNlIGRhdGEiKSk7CiAKLSAgdHJhY2Vfc2F2ZSAoZmlsZW5hbWUsIHRhcmdl dF9kb2VzX3NhdmUpOworICBpZiAoZ2VuZXJhdGVfY3RmKQorICAgIHsKKyAg ICAgIGlmICh0YXJnZXRfZG9lc19zYXZlKQorCWVycm9yX25vX2FyZyAoXygi LXIgY2Fubm90IGJlIHVzZWQgd2l0aCAtY3RmLiIpKTsKKyAgICAgIGN0Zl9z YXZlIChmaWxlbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgdHJhY2Vfc2F2 ZSAoZmlsZW5hbWUsIHRhcmdldF9kb2VzX3NhdmUpOwogCiAgIGlmIChmcm9t X3R0eSkKLSAgICBwcmludGZfZmlsdGVyZWQgKF8oIlRyYWNlIGRhdGEgc2F2 ZWQgdG8gZmlsZSAnJXMnLlxuIiksIGZpbGVuYW1lKTsKKyAgICBwcmludGZf ZmlsdGVyZWQgKF8oIlRyYWNlIGRhdGEgc2F2ZWQgdG8gJXMgJyVzJy5cbiIp LAorCQkgICAgIGdlbmVyYXRlX2N0ZiA/ICJkaXJlY3RvcnkiIDogImZpbGUi LCBmaWxlbmFtZSk7CiAKICAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOwogfQpA QCAtNTE5NCw2ICs1MjA2LDcgQEAgX2luaXRpYWxpemVfdHJhY2Vwb2ludCAo dm9pZCkKICAgYWRkX2NvbSAoInRzYXZlIiwgY2xhc3NfdHJhY2UsIHRyYWNl X3NhdmVfY29tbWFuZCwgXygiXAogU2F2ZSB0aGUgdHJhY2UgZGF0YSB0byBh IGZpbGUuXG5cCiBVc2UgdGhlICctcicgb3B0aW9uIHRvIGRpcmVjdCB0aGUg dGFyZ2V0IHRvIHNhdmUgZGlyZWN0bHkgdG8gdGhlIGZpbGUsXG5cCitVc2Ug dGhlICctY3RmJyBvcHRpb24gdG8gc2F2ZSB0aGUgZGF0YSB0byBDVEYgZm9y bWF0LFxuXAogdXNpbmcgaXRzIG93biBmaWxlc3lzdGVtLiIpKTsKIAogICBj ID0gYWRkX2NvbSAoInR2YXJpYWJsZSIsIGNsYXNzX3RyYWNlLCB0cmFjZV92 YXJpYWJsZV9jb21tYW5kLF8oIlwKLS0tIGEvdHJhY2Vwb2ludC5oCisrKyBi L3RyYWNlcG9pbnQuaApAQCAtMjQ2LDYgKzI0Niw3IEBAIGV4dGVybiB2b2lk IHZhbGlkYXRlX2FjdGlvbmxpbmUgKGNoYXIgKioKIAogZXh0ZXJuIHZvaWQg ZW5kX2FjdGlvbnNfcHNldWRvY29tbWFuZCAoY2hhciAqYXJncywgaW50IGZy b21fdHR5KTsKIGV4dGVybiB2b2lkIHdoaWxlX3N0ZXBwaW5nX3BzZXVkb2Nv bW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSk7CitleHRlcm4gdm9p ZCBjb2xsZWN0X3BzZXVkb2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9t X3R0eSk7CiAKIGV4dGVybiBzdHJ1Y3QgdHJhY2Vfc3RhdGVfdmFyaWFibGUg KmZpbmRfdHJhY2Vfc3RhdGVfdmFyaWFibGUgKGNvbnN0IGNoYXIgKm5hbWUp OwogZXh0ZXJuIHN0cnVjdCB0cmFjZV9zdGF0ZV92YXJpYWJsZSAqY3JlYXRl X3RyYWNlX3N0YXRlX3ZhcmlhYmxlIChjb25zdCBjaGFyICpuYW1lKTsK --0015175d072a1e8db204d0ce7528--