From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by sourceware.org (Postfix) with ESMTPS id 9F2A6395A01E for ; Thu, 8 Dec 2022 00:23:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9F2A6395A01E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=golang.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=golang.org Received: by mail-pg1-x529.google.com with SMTP id r18so17811498pgr.12 for ; Wed, 07 Dec 2022 16:23:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=golang-org.20210112.gappssmtp.com; s=20210112; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=VIwfrYDKIfKhx1KMaBMEPLhUf1bSXDJQm6uswsrfQyA=; b=IJxAtO7YHvO+/EuFPDI3gp+IdGJbqKC9Xp4vmX6+8cEgyjzkqUwvdNjnhk820RLtAY b64bu5Z55Tnn2tyFt0RM5Q8EBlj9KJxFPeBgyE3Mjb6lb1d+E7AkFY0yK57JtGJNnWbI E348xTtnkZdwPO/yZVV7AvW9bY3UrW0OQpKKSbMsBBRJsxD3BjRhDZkW60Q0jzSTKXPX 17MA6qbvSF2niiXQzTgcMGbtCpfbcYcGgEkxStMXW/jJLKWvQtmtZRcJNYKWVtAdis18 wA/YMi1XXDQ5aLtv7MFzOocRp4NbLpZer6Ikxu7rDSRksGLLBBOAnY0zRxcq6J+H71dl TQ8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=VIwfrYDKIfKhx1KMaBMEPLhUf1bSXDJQm6uswsrfQyA=; b=mQraAqlpWS+sS+p6e9ZCKVO7nTfLvpiE+CsrwxTioRXvs3R1nCfp/XuEIzqnPION46 DC/+am49OmJiKWNuY07yyNBUbVnDsIOtGN0MZnR7/vxfHorLE35hne/9SUoAVGV5WJjq 6NDQNngUCb8lhSdBJrlsmNDbXwmwdbX82pIdzw4S9lhcaJzUaW2NkewK0rK20215Bb4r M2sKbvHP7T4YVybp52vIYtKW8dzgQyWd2Ajb+8KXJApuz0gFKKuWVDf0+FF7FPDqwC2C NTb0oIVAezfFUF6L/Z9jdo5UwLiSOtnUcyyFDuHWz07bDmoogswuV/lAMd8++I84sqjI 2tNQ== X-Gm-Message-State: ANoB5pnBVxQ5XeIgOy/NxVqRpS8EDwjoAQz8uVq4+GF6BAnSbdMIq8oA ZbWhd5NtmzG16pyxf7e2AQpR4DXX+xjqChy0cTlmALf4mIHZ0Ekm X-Google-Smtp-Source: AA0mqf6nb4YEx55KL4g5lVrleFRu2VIn6EK3P8pvMsyUpDONLH1RzdbCXONtaIGbXe+wKR5Td3XzakrVuw2+SArYKJA= X-Received: by 2002:a05:6a00:cd6:b0:576:c454:38d8 with SMTP id b22-20020a056a000cd600b00576c45438d8mr20231024pfv.49.1670458988855; Wed, 07 Dec 2022 16:23:08 -0800 (PST) MIME-Version: 1.0 From: Ian Lance Taylor Date: Wed, 7 Dec 2022 16:22:57 -0800 Message-ID: Subject: Add zstd support to libbacktrace To: gcc-patches Content-Type: multipart/mixed; boundary="000000000000a54b8b05ef460a9f" X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SCC_10_SHORT_WORD_LINES,SCC_5_SHORT_WORD_LINES,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000a54b8b05ef460a9f Content-Type: text/plain; charset="UTF-8" This patch adds zstd support to libbacktrace, to support the new linker option --compress-debug-sections=zstd. The zstd format is fairly complicated, so it's likely that there are some bugs here. It does pass the tests, at least. Unfortunately this decompressor only runs at about 1/3 the speed to the zstd library decompressor. Still, it's smaller and simpler, and I think it uses less memory. Plus of course it uses the signal-safe libbacktrace memory allocator. Perhaps people can make a bit faster over time. Bootstrapped and ran libbacktrace and Go tests while using a linker that compressed using zstd. Committed to mainline. Ian Support decompressing --compress-debug-sections=zstd. * configure.ac: Check for zstd library and --compress-debug-sections=zstd linker option. * Makefile.am (zstdtest_*): New targets. (zstdtest_alloc_*, ctestzstd_*): New targets. (BUILDTESTS): Add zstdtest, zstdtest_alloc, ctestzstd as appropriate. * elf.c (ELFCOMPRESS_ZSTD): Define. (elf_fetch_bits): Rename from elf_zlib_fetch. Update uses. (elf_fetch_bits_backward): New static function. (ZLIB_HUFFMAN_*): Rename from HUFFMAN_*. Update uses. (ZLIB_TABLE_*): Rename from ZDEBUG_TABLE_*. Update uses. (ZSTD_TABLE_*): Define. (struct elf_zstd_fse_entry): Define. (elf_zstd_read_fse): New static function. (elf_zstd_build_fse): Likewise. (lit): Define if BACKTRACE_GENERATE_ZSTD_FSE_TABLES. (match, offset, next, print_table, main): Likewise. (elf_zstd_lit_table): New static const array. (elf_zstd_match_table, elf_zstd_offset_table): Likewise. (elf_zstd_read_huff): New static function. (struct elf_zstd_seq_decode): Define. (elf_zstd_unpack_seq_decode): New static function. (ZSTD_LIT_*): Define. (struct elf_zstd_literals): Define. (elf_zstd_literal_output): New static function. (ZSTD_LITERAL_LENGTH_BASELINE_OFFSET): Define. (elf_zstd_literal_length_baseline): New static const array. (elf_zstd_literal_length_bits): Likewise. (ZSTD_MATCH_LENGTH_BASELINE_OFFSET): Define. (elf_zstd_match_length_baseline): New static const array. (elf_zstd_match_length_bits): Likewise. (elf_zstd_decompress): New static function. (ZDEBUG_TABLE_SIZE): New definition. (elf_uncompress_chdr): Support ELF_COMPRESS_ZSTD. (backtrace_uncompress_zstd): New function. (elf_add): Use ZLIB_TABLE_SIZE for zlib-gnu sections. * internal.h (backtrace_uncompress_zstd): Declare. * zstdtest.c: New file. * configure, config.h.in, Makefile.in: Regenerate. --000000000000a54b8b05ef460a9f Content-Type: text/plain; charset="US-ASCII"; name="patch.txt" Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lbec32w50 ZGlmZiAtLWdpdCBhL2xpYmJhY2t0cmFjZS9NYWtlZmlsZS5hbSBiL2xpYmJhY2t0cmFjZS9NYWtl ZmlsZS5hbQppbmRleCA5Zjg1MTZkMDBlMi4uMDQ3YjU3M2MyOWEgMTAwNjQ0Ci0tLSBhL2xpYmJh Y2t0cmFjZS9NYWtlZmlsZS5hbQorKysgYi9saWJiYWNrdHJhY2UvTWFrZWZpbGUuYW0KQEAgLTM2 OCw2ICszNjgsMjUgQEAgenRlc3RfYWxsb2NfQ0ZMQUdTID0gJCh6dGVzdF9DRkxBR1MpCiAKIEJV SUxEVEVTVFMgKz0genRlc3RfYWxsb2MKIAorenN0ZHRlc3RfU09VUkNFUyA9IHpzdGR0ZXN0LmMg dGVzdGxpYi5jCit6c3RkdGVzdF9DRkxBR1MgPSAkKGxpYmJhY2t0cmFjZV9URVNUX0NGTEFHUykg LURTUkNESVI9XCIkKHNyY2RpcilcIgorenN0ZHRlc3RfTERBREQgPSBsaWJiYWNrdHJhY2UubGEK K3pzdGR0ZXN0X2FsbG9jX0xEQUREID0gbGliYmFja3RyYWNlX2FsbG9jLmxhCisKK2lmIEhBVkVf WlNURAorenN0ZHRlc3RfTERBREQgKz0gLWx6c3RkCit6c3RkdGVzdF9hbGxvY19MREFERCArPSAt bHpzdGQKK2VuZGlmCit6c3RkdGVzdF9MREFERCArPSAkKENMT0NLX0dFVFRJTUVfTElOSykKK3pz dGR0ZXN0X2FsbG9jX0xEQUREICs9ICQoQ0xPQ0tfR0VUVElNRV9MSU5LKQorCitCVUlMRFRFU1RT ICs9IHpzdGR0ZXN0CisKK3pzdGR0ZXN0X2FsbG9jX1NPVVJDRVMgPSAkKHpzdGR0ZXN0X1NPVVJD RVMpCit6c3RkdGVzdF9hbGxvY19DRkxBR1MgPSAkKHpzdGR0ZXN0X0NGTEFHUykKKworQlVJTERU RVNUUyArPSB6c3RkdGVzdF9hbGxvYworCiBlbmRpZiBIQVZFX0VMRgogCiBlZHRlc3RfU09VUkNF UyA9IGVkdGVzdC5jIGVkdGVzdDJfYnVpbGQuYyB0ZXN0bGliLmMKQEAgLTQ1MCw2ICs0NjksMTcg QEAgY3Rlc3RhX0xEQUREID0gbGliYmFja3RyYWNlLmxhCiAKIEJVSUxEVEVTVFMgKz0gY3Rlc3Rn IGN0ZXN0YQogCitpZiBIQVZFX0NPTVBSRVNTRURfREVCVUdfWlNURAorCitjdGVzdHpzdGRfU09V UkNFUyA9IGJ0ZXN0LmMgdGVzdGxpYi5jCitjdGVzdHpzdGRfQ0ZMQUdTID0gJChsaWJiYWNrdHJh Y2VfVEVTVF9DRkxBR1MpCitjdGVzdHpzdGRfTERGTEFHUyA9IC1XbCwtLWNvbXByZXNzLWRlYnVn LXNlY3Rpb25zPXpzdGQKK2N0ZXN0enN0ZF9MREFERCA9IGxpYmJhY2t0cmFjZS5sYQorCitCVUlM RFRFU1RTICs9IGN0ZXN0enN0ZAorCitlbmRpZgorCiBjdGVzdGdfYWxsb2NfU09VUkNFUyA9ICQo Y3Rlc3RnX1NPVVJDRVMpCiBjdGVzdGdfYWxsb2NfQ0ZMQUdTID0gJChjdGVzdGdfQ0ZMQUdTKQog Y3Rlc3RnX2FsbG9jX0xERkxBR1MgPSAkKGN0ZXN0Z19MREZMQUdTKQpkaWZmIC0tZ2l0IGEvbGli YmFja3RyYWNlL2NvbmZpZ3VyZS5hYyBiL2xpYmJhY2t0cmFjZS9jb25maWd1cmUuYWMKaW5kZXgg MWRhYWEyZjYyZDIuLmQwYTA0NzVjZmE4IDEwMDY0NAotLS0gYS9saWJiYWNrdHJhY2UvY29uZmln dXJlLmFjCisrKyBiL2xpYmJhY2t0cmFjZS9jb25maWd1cmUuYWMKQEAgLTQ5NSw2ICs0OTUsMjEg QEAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgsKV0sCiBMREZMQUdTPSRMREZMQUdT X2hvbGRdKQogQU1fQ09ORElUSU9OQUwoSEFWRV9DT01QUkVTU0VEX0RFQlVHLCB0ZXN0ICIkbGli Z29fY3ZfbGRfY29tcHJlc3MiID0geWVzKQogCitBQ19DSEVDS19MSUIoW3pzdGRdLCBbWlNURF9j b21wcmVzc10sCisgICAgW0FDX0RFRklORShIQVZFX1pTVEQsIDEsIFtEZWZpbmUgaWYgLWx6c3Rk IGlzIGF2YWlsYWJsZS5dKV0pCitBTV9DT05ESVRJT05BTChIQVZFX1pTVEQsIHRlc3QgIiRhY19j dl9saWJfenN0ZF9aU1REX2NvbXByZXNzIiA9IHllcykKKworZG5sIFRlc3Qgd2hldGhlciB0aGUg bGlua2VyIHN1cHBvcnRzIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9enN0ZCBvcHRpb24uCitB Q19DQUNIRV9DSEVDSyhbd2hldGhlciAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpzdGQgaXMg c3VwcG9ydGVkXSwKK1tsaWJnb19jdl9sZF9jb21wcmVzc196c3RkXSwKK1tMREZMQUdTX2hvbGQ9 JExERkxBR1MKK0xERkxBR1M9IiRMREZMQUdTIC1XbCwtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25z PXpzdGQiCitBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCwpXSwKK1tsaWJnb19jdl9s ZF9jb21wcmVzc196c3RkPXllc10sCitbbGliZ29fY3ZfbGRfY29tcHJlc3NfenN0ZD1ub10pCitM REZMQUdTPSRMREZMQUdTX2hvbGRdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9DT01QUkVTU0VEX0RF QlVHX1pTVEQsIHRlc3QgIiRsaWJnb19jdl9sZF9jb21wcmVzc196c3RkIiA9IHllcykKKwogQUNf QVJHX1ZBUihPQkpDT1BZLCBbbG9jYXRpb24gb2Ygb2JqY29weV0pCiBBQ19DSEVDS19QUk9HKE9C SkNPUFksIG9iamNvcHksIG9iamNvcHksKQogQUNfQ0hFQ0tfUFJPRyhSRUFERUxGLCByZWFkZWxm LCByZWFkZWxmKQpkaWZmIC0tZ2l0IGEvbGliYmFja3RyYWNlL2VsZi5jIGIvbGliYmFja3RyYWNl L2VsZi5jCmluZGV4IDE4MWQxOTVmZTM1Li4xNWU2ZjI4NGRiNiAxMDA2NDQKLS0tIGEvbGliYmFj a3RyYWNlL2VsZi5jCisrKyBiL2xpYmJhY2t0cmFjZS9lbGYuYwpAQCAtMTg0LDYgKzE4NCw3IEBA IGRsX2l0ZXJhdGVfcGhkciAoaW50ICgqY2FsbGJhY2spIChzdHJ1Y3QgZGxfcGhkcl9pbmZvICos CiAjdW5kZWYgU1RUX0ZVTkMKICN1bmRlZiBOVF9HTlVfQlVJTERfSUQKICN1bmRlZiBFTEZDT01Q UkVTU19aTElCCisjdW5kZWYgRUxGQ09NUFJFU1NfWlNURAogCiAvKiBCYXNpYyB0eXBlcy4gICov CiAKQEAgLTM0MSw2ICszNDIsNyBAQCB0eXBlZGVmIHN0cnVjdAogI2VuZGlmIC8qIEJBQ0tUUkFD RV9FTEZfU0laRSAhPSAzMiAqLwogCiAjZGVmaW5lIEVMRkNPTVBSRVNTX1pMSUIgMQorI2RlZmlu ZSBFTEZDT01QUkVTU19aU1REIDIKIAogLyogTmFtZXMgb2Ygc2VjdGlvbnMsIGluZGV4ZWQgYnkg ZW51bSBkd2FyZl9zZWN0aW9uIGluIGludGVybmFsLmguICAqLwogCkBAIC0xMTEzLDcgKzExMTUs NyBAQCBlbGZfdW5jb21wcmVzc19mYWlsZWQodm9pZCkKICAgIG9uIGVycm9yLiAgKi8KIAogc3Rh dGljIGludAotZWxmX3psaWJfZmV0Y2ggKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcGluLCBjb25z dCB1bnNpZ25lZCBjaGFyICpwaW5lbmQsCitlbGZfZmV0Y2hfYml0cyAoY29uc3QgdW5zaWduZWQg Y2hhciAqKnBwaW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbmVuZCwKIAkJdWludDY0X3QgKnB2 YWwsIHVuc2lnbmVkIGludCAqcGJpdHMpCiB7CiAgIHVuc2lnbmVkIGludCBiaXRzOwpAQCAtMTE2 MCw2ICsxMTYyLDY3IEBAIGVsZl96bGliX2ZldGNoIChjb25zdCB1bnNpZ25lZCBjaGFyICoqcHBp biwgY29uc3QgdW5zaWduZWQgY2hhciAqcGluZW5kLAogICByZXR1cm4gMTsKIH0KIAorLyogVGhp cyBpcyBsaWtlIGVsZl9mZXRjaF9iaXRzLCBidXQgaXQgZmV0Y2hzIHRoZSBiaXRzIGJhY2t3YXJk LCBhbmQgZW5zdXJlcyBhdAorICAgbGVhc3QgMTYgYml0cy4gIFRoaXMgaXMgZm9yIHpzdGQuICAq LworCitzdGF0aWMgaW50CitlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoY29uc3QgdW5zaWduZWQg Y2hhciAqKnBwaW4sCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqcGluZW5kLAorCQkJIHVpbnQ2 NF90ICpwdmFsLCB1bnNpZ25lZCBpbnQgKnBiaXRzKQoreworICB1bnNpZ25lZCBpbnQgYml0czsK KyAgY29uc3QgdW5zaWduZWQgY2hhciAqcGluOworICB1aW50NjRfdCB2YWw7CisgIHVpbnQzMl90 IG5leHQ7CisKKyAgYml0cyA9ICpwYml0czsKKyAgaWYgKGJpdHMgPj0gMTYpCisgICAgcmV0dXJu IDE7CisgIHBpbiA9ICpwcGluOworICB2YWwgPSAqcHZhbDsKKworICBpZiAodW5saWtlbHkgKHBp biA8PSBwaW5lbmQpKQorICAgIHsKKyAgICAgIGlmIChiaXRzID09IDApCisJeworCSAgZWxmX3Vu Y29tcHJlc3NfZmFpbGVkICgpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgcmV0dXJuIDE7Cisg ICAgfQorCisgIHBpbiAtPSA0OworCisjaWYgZGVmaW5lZChfX0JZVEVfT1JERVJfXykgJiYgZGVm aW5lZChfX09SREVSX0xJVFRMRV9FTkRJQU5fXykgXAorICAmJiBkZWZpbmVkKF9fT1JERVJfQklH X0VORElBTl9fKQkJCQlcCisgICYmIChfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJ QU5fXwkJCVwKKyAgICAgIHx8IF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfTElUVExFX0VORElB Tl9fKQorICAvKiBXZSd2ZSBlbnN1cmVkIHRoYXQgUElOIGlzIGFsaWduZWQuICAqLworICBuZXh0 ID0gKihjb25zdCB1aW50MzJfdCAqKXBpbjsKKworI2lmIF9fQllURV9PUkRFUl9fID09IF9fT1JE RVJfQklHX0VORElBTl9fCisgIG5leHQgPSBfX2J1aWx0aW5fYnN3YXAzMiAobmV4dCk7CisjZW5k aWYKKyNlbHNlCisgIG5leHQgPSBwaW5bMF0gfCAocGluWzFdIDw8IDgpIHwgKHBpblsyXSA8PCAx NikgfCAocGluWzNdIDw8IDI0KTsKKyNlbmRpZgorCisgIHZhbCA8PD0gMzI7CisgIHZhbCB8PSBu ZXh0OworICBiaXRzICs9IDMyOworCisgIGlmICh1bmxpa2VseSAocGluIDwgcGluZW5kKSkKKyAg ICB7CisgICAgICB2YWwgPj49IChwaW5lbmQgLSBwaW4pICogODsKKyAgICAgIGJpdHMgLT0gKHBp bmVuZCAtIHBpbikgKiA4OworICAgIH0KKworICAqcHBpbiA9IHBpbjsKKyAgKnB2YWwgPSB2YWw7 CisgICpwYml0cyA9IGJpdHM7CisgIHJldHVybiAxOworfQorCiAvKiBIdWZmbWFuIGNvZGUgdGFi bGVzLCBsaWtlIHRoZSByZXN0IG9mIHRoZSB6bGliIGZvcm1hdCwgYXJlIGRlZmluZWQKICAgIGJ5 IFJGQyAxOTUxLiAgV2Ugc3RvcmUgYSBIdWZmbWFuIGNvZGUgdGFibGUgYXMgYSBzZXJpZXMgb2Yg dGFibGVzCiAgICBzdG9yZWQgc2VxdWVudGlhbGx5IGluIG1lbW9yeS4gIEVhY2ggZW50cnkgaW4g YSB0YWJsZSBpcyAxNiBiaXRzLgpAQCAtMTE5NCwxNCArMTI1NywxNCBAQCBlbGZfemxpYl9mZXRj aCAoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwaW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbmVu ZCwKIC8qIE51bWJlciBvZiBlbnRyaWVzIHdlIGFsbG9jYXRlIHRvIGZvciBvbmUgY29kZSB0YWJs ZS4gIFdlIGdldCBhIHBhZ2UKICAgIGZvciB0aGUgdHdvIGNvZGUgdGFibGVzIHdlIG5lZWQuICAq LwogCi0jZGVmaW5lIEhVRkZNQU5fVEFCTEVfU0laRSAoMTAyNCkKKyNkZWZpbmUgWkxJQl9IVUZG TUFOX1RBQkxFX1NJWkUgKDEwMjQpCiAKIC8qIEJpdCBtYXNrcyBhbmQgc2hpZnRzIGZvciB0aGUg dmFsdWVzIGluIHRoZSB0YWJsZS4gICovCiAKLSNkZWZpbmUgSFVGRk1BTl9WQUxVRV9NQVNLIDB4 MDFmZgotI2RlZmluZSBIVUZGTUFOX0JJVFNfU0hJRlQgOQotI2RlZmluZSBIVUZGTUFOX0JJVFNf TUFTSyAweDcKLSNkZWZpbmUgSFVGRk1BTl9TRUNPTkRBUllfU0hJRlQgMTIKKyNkZWZpbmUgWkxJ Ql9IVUZGTUFOX1ZBTFVFX01BU0sgMHgwMWZmCisjZGVmaW5lIFpMSUJfSFVGRk1BTl9CSVRTX1NI SUZUIDkKKyNkZWZpbmUgWkxJQl9IVUZGTUFOX0JJVFNfTUFTSyAweDcKKyNkZWZpbmUgWkxJQl9I VUZGTUFOX1NFQ09OREFSWV9TSElGVCAxMgogCiAvKiBGb3Igd29ya2luZyBtZW1vcnkgd2hpbGUg aW5mbGF0aW5nIHdlIG5lZWQgdHdvIGNvZGUgdGFibGVzLCB3ZSBuZWVkCiAgICBhbiBhcnJheSBv ZiBjb2RlIGxlbmd0aHMgKG1heCB2YWx1ZSAxNSwgc28gd2UgdXNlIHVuc2lnbmVkIGNoYXIpLApA QCAtMTIwOSwxNyArMTI3MiwxNyBAQCBlbGZfemxpYl9mZXRjaCAoY29uc3QgdW5zaWduZWQgY2hh ciAqKnBwaW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbmVuZCwKICAgIGxhdHRlciB0d28gYXJy YXlzIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIG1heGltdW0gbnVtYmVyCiAgICBv ZiBjb2RlIGxlbmd0aHMsIHdoaWNoIFJGQyAxOTUxIGRlZmluZXMgYXMgMjg2ICsgMzAuICAqLwog Ci0jZGVmaW5lIFpERUJVR19UQUJMRV9TSVpFIFwKLSAgKDIgKiBIVUZGTUFOX1RBQkxFX1NJWkUg KiBzaXplb2YgKHVpbnQxNl90KSBcCisjZGVmaW5lIFpMSUJfVEFCTEVfU0laRSBcCisgICgyICog WkxJQl9IVUZGTUFOX1RBQkxFX1NJWkUgKiBzaXplb2YgKHVpbnQxNl90KSBcCiAgICArICgyODYg KyAzMCkgKiBzaXplb2YgKHVpbnQxNl90KQkgICAgICBcCiAgICArICgyODYgKyAzMCkgKiBzaXpl b2YgKHVuc2lnbmVkIGNoYXIpKQogCi0jZGVmaW5lIFpERUJVR19UQUJMRV9DT0RFTEVOX09GRlNF VCBcCi0gICgyICogSFVGRk1BTl9UQUJMRV9TSVpFICogc2l6ZW9mICh1aW50MTZfdCkgXAorI2Rl ZmluZSBaTElCX1RBQkxFX0NPREVMRU5fT0ZGU0VUIFwKKyAgKDIgKiBaTElCX0hVRkZNQU5fVEFC TEVfU0laRSAqIHNpemVvZiAodWludDE2X3QpIFwKICAgICsgKDI4NiArIDMwKSAqIHNpemVvZiAo dWludDE2X3QpKQogCi0jZGVmaW5lIFpERUJVR19UQUJMRV9XT1JLX09GRlNFVCBcCi0gICgyICog SFVGRk1BTl9UQUJMRV9TSVpFICogc2l6ZW9mICh1aW50MTZfdCkpCisjZGVmaW5lIFpMSUJfVEFC TEVfV09SS19PRkZTRVQgXAorICAoMiAqIFpMSUJfSFVGRk1BTl9UQUJMRV9TSVpFICogc2l6ZW9m ICh1aW50MTZfdCkpCiAKICNpZmRlZiBCQUNLVFJBQ0VfR0VORVJBVEVfRklYRURfSFVGRk1BTl9U QUJMRQogCkBAIC0xMjUyLDcgKzEzMTUsNyBAQCBlbGZfemxpYl9pbmZsYXRlX3RhYmxlICh1bnNp Z25lZCBjaGFyICpjb2Rlcywgc2l6ZV90IGNvZGVzX2xlbiwKICAgICAgbmV4dCB2YWx1ZSBhZnRl ciBWQUwgd2l0aCB0aGUgc2FtZSBiaXQgbGVuZ3RoLiAgKi8KIAogICBuZXh0ID0gKHVpbnQxNl90 ICopICgoKHVuc2lnbmVkIGNoYXIgKikgemRlYnVnX3RhYmxlKQotCQkgICAgICAgKyBaREVCVUdf VEFCTEVfV09SS19PRkZTRVQpOworCQkgICAgICAgKyBaTElCX1RBQkxFX1dPUktfT0ZGU0VUKTsK IAogICBtZW1zZXQgKCZjb3VudFswXSwgMCwgMTYgKiBzaXplb2YgKHVpbnQxNl90KSk7CiAgIGZv ciAoaSA9IDA7IGkgPCBjb2Rlc19sZW47ICsraSkKQEAgLTEyODAsNyArMTM0Myw3IEBAIGVsZl96 bGliX2luZmxhdGVfdGFibGUgKHVuc2lnbmVkIGNoYXIgKmNvZGVzLCBzaXplX3QgY29kZXNfbGVu LAogICAvKiBGb3IgZWFjaCBsZW5ndGgsIGZpbGwgaW4gdGhlIHRhYmxlIGZvciB0aGUgY29kZXMg b2YgdGhhdAogICAgICBsZW5ndGguICAqLwogCi0gIG1lbXNldCAodGFibGUsIDAsIEhVRkZNQU5f VEFCTEVfU0laRSAqIHNpemVvZiAodWludDE2X3QpKTsKKyAgbWVtc2V0ICh0YWJsZSwgMCwgWkxJ Ql9IVUZGTUFOX1RBQkxFX1NJWkUgKiBzaXplb2YgKHVpbnQxNl90KSk7CiAKICAgLyogSGFuZGxl IHRoZSB2YWx1ZXMgdGhhdCBkbyBub3QgcmVxdWlyZSBhIHNlY29uZGFyeSB0YWJsZS4gICovCiAK QEAgLTEzMTQsMTMgKzEzNzcsMTMgQEAgZWxmX3psaWJfaW5mbGF0ZV90YWJsZSAodW5zaWduZWQg Y2hhciAqY29kZXMsIHNpemVfdCBjb2Rlc19sZW4sCiAJICAvKiBJbiB0aGUgY29tcHJlc3NlZCBi aXQgc3RyZWFtLCB0aGUgdmFsdWUgVkFMIGlzIGVuY29kZWQgYXMKIAkgICAgIEogYml0cyB3aXRo IHRoZSB2YWx1ZSBDLiAgKi8KIAotCSAgaWYgKHVubGlrZWx5ICgodmFsICYgfkhVRkZNQU5fVkFM VUVfTUFTSykgIT0gMCkpCisJICBpZiAodW5saWtlbHkgKCh2YWwgJiB+WkxJQl9IVUZGTUFOX1ZB TFVFX01BU0spICE9IDApKQogCSAgICB7CiAJICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgp OwogCSAgICAgIHJldHVybiAwOwogCSAgICB9CiAKLQkgIHR2YWwgPSB2YWwgfCAoKGogLSAxKSA8 PCBIVUZGTUFOX0JJVFNfU0hJRlQpOworCSAgdHZhbCA9IHZhbCB8ICgoaiAtIDEpIDw8IFpMSUJf SFVGRk1BTl9CSVRTX1NISUZUKTsKIAogCSAgLyogVGhlIHRhYmxlIGxvb2t1cCB1c2VzIDggYml0 cy4gIElmIEogaXMgbGVzcyB0aGFuIDgsIHdlCiAJICAgICBkb24ndCBrbm93IHdoYXQgdGhlIG90 aGVyIGJpdHMgd2lsbCBiZS4gIFdlIG5lZWQgdG8gZmlsbApAQCAtMTQ3MCw3ICsxNTMzLDcgQEAg ZWxmX3psaWJfaW5mbGF0ZV90YWJsZSAodW5zaWduZWQgY2hhciAqY29kZXMsIHNpemVfdCBjb2Rl c19sZW4sCiAJCXsKIAkJICAvKiBTdGFydCBhIG5ldyBzZWNvbmRhcnkgdGFibGUuICAqLwogCi0J CSAgaWYgKHVubGlrZWx5ICgobmV4dF9zZWNvbmRhcnkgJiBIVUZGTUFOX1ZBTFVFX01BU0spCisJ CSAgaWYgKHVubGlrZWx5ICgobmV4dF9zZWNvbmRhcnkgJiBaTElCX0hVRkZNQU5fVkFMVUVfTUFT SykKIAkJCQkhPSBuZXh0X3NlY29uZGFyeSkpCiAJCSAgICB7CiAJCSAgICAgIGVsZl91bmNvbXBy ZXNzX2ZhaWxlZCAoKTsKQEAgLTE0ODEsMjIgKzE1NDQsMjMgQEAgZWxmX3psaWJfaW5mbGF0ZV90 YWJsZSAodW5zaWduZWQgY2hhciAqY29kZXMsIHNpemVfdCBjb2Rlc19sZW4sCiAJCSAgc2Vjb25k YXJ5X2JpdHMgPSBqIC0gODsKIAkJICBuZXh0X3NlY29uZGFyeSArPSAxIDw8IHNlY29uZGFyeV9i aXRzOwogCQkgIHRhYmxlW3ByaW1hcnldID0gKHNlY29uZGFyeQotCQkJCSAgICArICgoaiAtIDgp IDw8IEhVRkZNQU5fQklUU19TSElGVCkKLQkJCQkgICAgKyAoMVUgPDwgSFVGRk1BTl9TRUNPTkRB UllfU0hJRlQpKTsKKwkJCQkgICAgKyAoKGogLSA4KSA8PCBaTElCX0hVRkZNQU5fQklUU19TSElG VCkKKwkJCQkgICAgKyAoMVUgPDwgWkxJQl9IVUZGTUFOX1NFQ09OREFSWV9TSElGVCkpOwogCQl9 CiAJICAgICAgZWxzZQogCQl7CiAJCSAgLyogVGhlcmUgaXMgYW4gZXhpc3RpbmcgZW50cnkuICBJ dCBoYWQgYmV0dGVyIGJlIGEKIAkJICAgICBzZWNvbmRhcnkgdGFibGUgd2l0aCBlbm91Z2ggYml0 cy4gICovCi0JCSAgaWYgKHVubGlrZWx5ICgodHByaW1hcnkgJiAoMVUgPDwgSFVGRk1BTl9TRUNP TkRBUllfU0hJRlQpKQorCQkgIGlmICh1bmxpa2VseSAoKHRwcmltYXJ5CisJCQkJICYgKDFVIDw8 IFpMSUJfSFVGRk1BTl9TRUNPTkRBUllfU0hJRlQpKQogCQkJCT09IDApKQogCQkgICAgewogCQkg ICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CiAJCSAgICAgIHJldHVybiAwOwogCQkgICAg fQotCQkgIHNlY29uZGFyeSA9IHRwcmltYXJ5ICYgSFVGRk1BTl9WQUxVRV9NQVNLOwotCQkgIHNl Y29uZGFyeV9iaXRzID0gKCh0cHJpbWFyeSA+PiBIVUZGTUFOX0JJVFNfU0hJRlQpCi0JCQkJICAg ICYgSFVGRk1BTl9CSVRTX01BU0spOworCQkgIHNlY29uZGFyeSA9IHRwcmltYXJ5ICYgWkxJQl9I VUZGTUFOX1ZBTFVFX01BU0s7CisJCSAgc2Vjb25kYXJ5X2JpdHMgPSAoKHRwcmltYXJ5ID4+IFpM SUJfSFVGRk1BTl9CSVRTX1NISUZUKQorCQkJCSAgICAmIFpMSUJfSFVGRk1BTl9CSVRTX01BU0sp OwogCQkgIGlmICh1bmxpa2VseSAoc2Vjb25kYXJ5X2JpdHMgPCBqIC0gOCkpCiAJCSAgICB7CiAJ CSAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKQEAgLTE1MDcsNyArMTU3MSw3IEBAIGVs Zl96bGliX2luZmxhdGVfdGFibGUgKHVuc2lnbmVkIGNoYXIgKmNvZGVzLCBzaXplX3QgY29kZXNf bGVuLAogCiAJICAvKiBGaWxsIGluIHNlY29uZGFyeSB0YWJsZSBlbnRyaWVzLiAgKi8KIAotCSAg dHZhbCA9IHZhbCB8ICgoaiAtIDgpIDw8IEhVRkZNQU5fQklUU19TSElGVCk7CisJICB0dmFsID0g dmFsIHwgKChqIC0gOCkgPDwgWkxJQl9IVUZGTUFOX0JJVFNfU0hJRlQpOwogCiAJICBmb3IgKGlu ZCA9IGNvZGUgPj4gODsKIAkgICAgICAgaW5kIDwgKDFVIDw8IHNlY29uZGFyeV9iaXRzKTsKQEAg LTE1NTAsNyArMTYxNCw3IEBAIGVsZl96bGliX2luZmxhdGVfdGFibGUgKHVuc2lnbmVkIGNoYXIg KmNvZGVzLCBzaXplX3QgY29kZXNfbGVuLAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotc3RhdGlj IHVpbnQxNl90IHRhYmxlW1pERUJVR19UQUJMRV9TSVpFXTsKK3N0YXRpYyB1aW50MTZfdCB0YWJs ZVtaTElCX1RBQkxFX1NJWkVdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgY29kZXNbMjg4XTsKIAog aW50CkBAIC0xNzc4LDcgKzE4NDIsNyBAQCBlbGZfemxpYl9pbmZsYXRlIChjb25zdCB1bnNpZ25l ZCBjaGFyICpwaW4sIHNpemVfdCBzaW4sIHVpbnQxNl90ICp6ZGVidWdfdGFibGUsCiAJICBjb25z dCB1aW50MTZfdCAqdGxpdDsKIAkgIGNvbnN0IHVpbnQxNl90ICp0ZGlzdDsKIAotCSAgaWYgKCFl bGZfemxpYl9mZXRjaCAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykpCisJICBpZiAoIWVsZl9m ZXRjaF9iaXRzICgmcGluLCBwaW5lbmQsICZ2YWwsICZiaXRzKSkKIAkgICAgcmV0dXJuIDA7CiAK IAkgIGxhc3QgPSB2YWwgJiAxOwpAQCAtMTg2Niw3ICsxOTMwLDcgQEAgZWxmX3psaWJfaW5mbGF0 ZSAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLCB1aW50MTZfdCAqemRlYnVn X3RhYmxlLAogCSAgICAgIC8qIFJlYWQgYSBIdWZmbWFuIGVuY29kaW5nIHRhYmxlLiAgVGhlIHZh cmlvdXMgbWFnaWMKIAkJIG51bWJlcnMgaGVyZSBhcmUgZnJvbSBSRkMgMTk1MS4gICovCiAKLQkg ICAgICBpZiAoIWVsZl96bGliX2ZldGNoICgmcGluLCBwaW5lbmQsICZ2YWwsICZiaXRzKSkKKwkg ICAgICBpZiAoIWVsZl9mZXRjaF9iaXRzICgmcGluLCBwaW5lbmQsICZ2YWwsICZiaXRzKSkKIAkJ cmV0dXJuIDA7CiAKIAkgICAgICBubGl0ID0gKHZhbCAmIDB4MWYpICsgMjU3OwpAQCAtMTg5MSw3 ICsxOTU1LDcgQEAgZWxmX3psaWJfaW5mbGF0ZSAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBz aXplX3Qgc2luLCB1aW50MTZfdCAqemRlYnVnX3RhYmxlLAogCSAgICAgIC8qIFRoZXJlIGFyZSBh bHdheXMgYXQgbGVhc3QgNCBlbGVtZW50cyBpbiB0aGUKIAkJIHRhYmxlLiAgKi8KIAotCSAgICAg IGlmICghZWxmX3psaWJfZmV0Y2ggKCZwaW4sIHBpbmVuZCwgJnZhbCwgJmJpdHMpKQorCSAgICAg IGlmICghZWxmX2ZldGNoX2JpdHMgKCZwaW4sIHBpbmVuZCwgJnZhbCwgJmJpdHMpKQogCQlyZXR1 cm4gMDsKIAogCSAgICAgIGNvZGViaXRzWzE2XSA9IHZhbCAmIDc7CkBAIC0xOTExLDcgKzE5NzUs NyBAQCBlbGZfemxpYl9pbmZsYXRlIChjb25zdCB1bnNpZ25lZCBjaGFyICpwaW4sIHNpemVfdCBz aW4sIHVpbnQxNl90ICp6ZGVidWdfdGFibGUsCiAJICAgICAgaWYgKG5jbGVuID09IDUpCiAJCWdv dG8gY29kZWJpdHNkb25lOwogCi0JICAgICAgaWYgKCFlbGZfemxpYl9mZXRjaCAoJnBpbiwgcGlu ZW5kLCAmdmFsLCAmYml0cykpCisJICAgICAgaWYgKCFlbGZfZmV0Y2hfYml0cyAoJnBpbiwgcGlu ZW5kLCAmdmFsLCAmYml0cykpCiAJCXJldHVybiAwOwogCiAJICAgICAgY29kZWJpdHNbN10gPSB2 YWwgJiA3OwpAQCAtMTk0OSw3ICsyMDEzLDcgQEAgZWxmX3psaWJfaW5mbGF0ZSAoY29uc3QgdW5z aWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLCB1aW50MTZfdCAqemRlYnVnX3RhYmxlLAogCSAg ICAgIGlmIChuY2xlbiA9PSAxMCkKIAkJZ290byBjb2RlYml0c2RvbmU7CiAKLQkgICAgICBpZiAo IWVsZl96bGliX2ZldGNoICgmcGluLCBwaW5lbmQsICZ2YWwsICZiaXRzKSkKKwkgICAgICBpZiAo IWVsZl9mZXRjaF9iaXRzICgmcGluLCBwaW5lbmQsICZ2YWwsICZiaXRzKSkKIAkJcmV0dXJuIDA7 CiAKIAkgICAgICBjb2RlYml0c1sxMV0gPSB2YWwgJiA3OwpAQCAtMTk4Nyw3ICsyMDUxLDcgQEAg ZWxmX3psaWJfaW5mbGF0ZSAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLCB1 aW50MTZfdCAqemRlYnVnX3RhYmxlLAogCSAgICAgIGlmIChuY2xlbiA9PSAxNSkKIAkJZ290byBj b2RlYml0c2RvbmU7CiAKLQkgICAgICBpZiAoIWVsZl96bGliX2ZldGNoICgmcGluLCBwaW5lbmQs ICZ2YWwsICZiaXRzKSkKKwkgICAgICBpZiAoIWVsZl9mZXRjaF9iaXRzICgmcGluLCBwaW5lbmQs ICZ2YWwsICZiaXRzKSkKIAkJcmV0dXJuIDA7CiAKIAkgICAgICBjb2RlYml0c1syXSA9IHZhbCAm IDc7CkBAIC0yMDI2LDcgKzIwOTAsNyBAQCBlbGZfemxpYl9pbmZsYXRlIChjb25zdCB1bnNpZ25l ZCBjaGFyICpwaW4sIHNpemVfdCBzaW4sIHVpbnQxNl90ICp6ZGVidWdfdGFibGUsCiAJCSBhdCB0 aGUgZW5kIG9mIHpkZWJ1Z190YWJsZSB0byBob2xkIHRoZW0uICAqLwogCiAJICAgICAgcGxlbmJh c2UgPSAoKCh1bnNpZ25lZCBjaGFyICopIHpkZWJ1Z190YWJsZSkKLQkJCSAgKyBaREVCVUdfVEFC TEVfQ09ERUxFTl9PRkZTRVQpOworCQkJICArIFpMSUJfVEFCTEVfQ09ERUxFTl9PRkZTRVQpOwog CSAgICAgIHBsZW4gPSBwbGVuYmFzZTsKIAkgICAgICBwbGVuZW5kID0gcGxlbiArIG5saXQgKyBu ZGlzdDsKIAkgICAgICB3aGlsZSAocGxlbiA8IHBsZW5lbmQpCkBAIC0yMDM1LDI0ICsyMDk5LDI1 IEBAIGVsZl96bGliX2luZmxhdGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbiwgc2l6ZV90IHNp biwgdWludDE2X3QgKnpkZWJ1Z190YWJsZSwKIAkJICB1bnNpZ25lZCBpbnQgYjsKIAkJICB1aW50 MTZfdCB2OwogCi0JCSAgaWYgKCFlbGZfemxpYl9mZXRjaCAoJnBpbiwgcGluZW5kLCAmdmFsLCAm Yml0cykpCisJCSAgaWYgKCFlbGZfZmV0Y2hfYml0cyAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0 cykpCiAJCSAgICByZXR1cm4gMDsKIAogCQkgIHQgPSB6ZGVidWdfdGFibGVbdmFsICYgMHhmZl07 CiAKIAkJICAvKiBUaGUgY29tcHJlc3Npb24gaGVyZSB1c2VzIGJpdCBsZW5ndGhzIHVwIHRvIDcs IHNvCiAJCSAgICAgYSBzZWNvbmRhcnkgdGFibGUgaXMgbmV2ZXIgbmVjZXNzYXJ5LiAgKi8KLQkJ ICBpZiAodW5saWtlbHkgKCh0ICYgKDFVIDw8IEhVRkZNQU5fU0VDT05EQVJZX1NISUZUKSkgIT0g MCkpCisJCSAgaWYgKHVubGlrZWx5ICgodCAmICgxVSA8PCBaTElCX0hVRkZNQU5fU0VDT05EQVJZ X1NISUZUKSkKKwkJCQkhPSAwKSkKIAkJICAgIHsKIAkJICAgICAgZWxmX3VuY29tcHJlc3NfZmFp bGVkICgpOwogCQkgICAgICByZXR1cm4gMDsKIAkJICAgIH0KIAotCQkgIGIgPSAodCA+PiBIVUZG TUFOX0JJVFNfU0hJRlQpICYgSFVGRk1BTl9CSVRTX01BU0s7CisJCSAgYiA9ICh0ID4+IFpMSUJf SFVGRk1BTl9CSVRTX1NISUZUKSAmIFpMSUJfSFVGRk1BTl9CSVRTX01BU0s7CiAJCSAgdmFsID4+ PSBiICsgMTsKIAkJICBiaXRzIC09IGIgKyAxOwogCi0JCSAgdiA9IHQgJiBIVUZGTUFOX1ZBTFVF X01BU0s7CisJCSAgdiA9IHQgJiBaTElCX0hVRkZNQU5fVkFMVUVfTUFTSzsKIAkJICBpZiAodiA8 IDE2KQogCQkgICAgKnBsZW4rKyA9IHY7CiAJCSAgZWxzZSBpZiAodiA9PSAxNikKQEAgLTIwNjks NyArMjEzNCw3IEBAIGVsZl96bGliX2luZmxhdGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbiwg c2l6ZV90IHNpbiwgdWludDE2X3QgKnpkZWJ1Z190YWJsZSwKIAkJCX0KIAogCQkgICAgICAvKiBX ZSB1c2VkIHVwIHRvIDcgYml0cyBzaW5jZSB0aGUgbGFzdAotCQkJIGVsZl96bGliX2ZldGNoLCBz byB3ZSBoYXZlIGF0IGxlYXN0IDggYml0cworCQkJIGVsZl9mZXRjaF9iaXRzLCBzbyB3ZSBoYXZl IGF0IGxlYXN0IDggYml0cwogCQkJIGF2YWlsYWJsZSBoZXJlLiAgKi8KIAogCQkgICAgICBjID0g MyArICh2YWwgJiAweDMpOwpAQCAtMjEwNCw3ICsyMTY5LDcgQEAgZWxmX3psaWJfaW5mbGF0ZSAo Y29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLCB1aW50MTZfdCAqemRlYnVnX3Rh YmxlLAogCQkgICAgICAvKiBTdG9yZSB6ZXJvIDMgdG8gMTAgdGltZXMuICAqLwogCiAJCSAgICAg IC8qIFdlIHVzZWQgdXAgdG8gNyBiaXRzIHNpbmNlIHRoZSBsYXN0Ci0JCQkgZWxmX3psaWJfZmV0 Y2gsIHNvIHdlIGhhdmUgYXQgbGVhc3QgOCBiaXRzCisJCQkgZWxmX2ZldGNoX2JpdHMsIHNvIHdl IGhhdmUgYXQgbGVhc3QgOCBiaXRzCiAJCQkgYXZhaWxhYmxlIGhlcmUuICAqLwogCiAJCSAgICAg IGMgPSAzICsgKHZhbCAmIDB4Nyk7CkBAIC0yMTUwLDcgKzIyMTUsNyBAQCBlbGZfemxpYl9pbmZs YXRlIChjb25zdCB1bnNpZ25lZCBjaGFyICpwaW4sIHNpemVfdCBzaW4sIHVpbnQxNl90ICp6ZGVi dWdfdGFibGUsCiAJCSAgICAgIC8qIFN0b3JlIHplcm8gMTEgdG8gMTM4IHRpbWVzLiAgKi8KIAog CQkgICAgICAvKiBXZSB1c2VkIHVwIHRvIDcgYml0cyBzaW5jZSB0aGUgbGFzdAotCQkJIGVsZl96 bGliX2ZldGNoLCBzbyB3ZSBoYXZlIGF0IGxlYXN0IDggYml0cworCQkJIGVsZl9mZXRjaF9iaXRz LCBzbyB3ZSBoYXZlIGF0IGxlYXN0IDggYml0cwogCQkJIGF2YWlsYWJsZSBoZXJlLiAgKi8KIAog CQkgICAgICBjID0gMTEgKyAodmFsICYgMHg3Zik7CkBAIC0yMTg3LDEwICsyMjUyLDExIEBAIGVs Zl96bGliX2luZmxhdGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbiwgc2l6ZV90IHNpbiwgdWlu dDE2X3QgKnpkZWJ1Z190YWJsZSwKIAkJCQkJICAgemRlYnVnX3RhYmxlKSkKIAkJcmV0dXJuIDA7 CiAJICAgICAgaWYgKCFlbGZfemxpYl9pbmZsYXRlX3RhYmxlIChwbGVuICsgbmxpdCwgbmRpc3Qs IHpkZWJ1Z190YWJsZSwKLQkJCQkJICAgemRlYnVnX3RhYmxlICsgSFVGRk1BTl9UQUJMRV9TSVpF KSkKKwkJCQkJICAgKHpkZWJ1Z190YWJsZQorCQkJCQkgICAgKyBaTElCX0hVRkZNQU5fVEFCTEVf U0laRSkpKQogCQlyZXR1cm4gMDsKIAkgICAgICB0bGl0ID0gemRlYnVnX3RhYmxlOwotCSAgICAg IHRkaXN0ID0gemRlYnVnX3RhYmxlICsgSFVGRk1BTl9UQUJMRV9TSVpFOworCSAgICAgIHRkaXN0 ID0gemRlYnVnX3RhYmxlICsgWkxJQl9IVUZGTUFOX1RBQkxFX1NJWkU7CiAJICAgIH0KIAogCSAg LyogSW5mbGF0ZSB2YWx1ZXMgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2suICBUaGlzIGlzIHRo ZQpAQCAtMjIwMywxNCArMjI2OSwxNCBAQCBlbGZfemxpYl9pbmZsYXRlIChjb25zdCB1bnNpZ25l ZCBjaGFyICpwaW4sIHNpemVfdCBzaW4sIHVpbnQxNl90ICp6ZGVidWdfdGFibGUsCiAJICAgICAg dWludDE2X3QgdjsKIAkgICAgICB1bnNpZ25lZCBpbnQgbGl0OwogCi0JICAgICAgaWYgKCFlbGZf emxpYl9mZXRjaCAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykpCisJICAgICAgaWYgKCFlbGZf ZmV0Y2hfYml0cyAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykpCiAJCXJldHVybiAwOwogCiAJ ICAgICAgdCA9IHRsaXRbdmFsICYgMHhmZl07Ci0JICAgICAgYiA9ICh0ID4+IEhVRkZNQU5fQklU U19TSElGVCkgJiBIVUZGTUFOX0JJVFNfTUFTSzsKLQkgICAgICB2ID0gdCAmIEhVRkZNQU5fVkFM VUVfTUFTSzsKKwkgICAgICBiID0gKHQgPj4gWkxJQl9IVUZGTUFOX0JJVFNfU0hJRlQpICYgWkxJ Ql9IVUZGTUFOX0JJVFNfTUFTSzsKKwkgICAgICB2ID0gdCAmIFpMSUJfSFVGRk1BTl9WQUxVRV9N QVNLOwogCi0JICAgICAgaWYgKCh0ICYgKDFVIDw8IEhVRkZNQU5fU0VDT05EQVJZX1NISUZUKSkg PT0gMCkKKwkgICAgICBpZiAoKHQgJiAoMVUgPDwgWkxJQl9IVUZGTUFOX1NFQ09OREFSWV9TSElG VCkpID09IDApCiAJCXsKIAkJICBsaXQgPSB2OwogCQkgIHZhbCA+Pj0gYiArIDE7CkBAIC0yMjE5 LDggKzIyODUsOCBAQCBlbGZfemxpYl9pbmZsYXRlIChjb25zdCB1bnNpZ25lZCBjaGFyICpwaW4s IHNpemVfdCBzaW4sIHVpbnQxNl90ICp6ZGVidWdfdGFibGUsCiAJICAgICAgZWxzZQogCQl7CiAJ CSAgdCA9IHRsaXRbdiArIDB4MTAwICsgKCh2YWwgPj4gOCkgJiAoKDFVIDw8IGIpIC0gMSkpXTsK LQkJICBiID0gKHQgPj4gSFVGRk1BTl9CSVRTX1NISUZUKSAmIEhVRkZNQU5fQklUU19NQVNLOwot CQkgIGxpdCA9IHQgJiBIVUZGTUFOX1ZBTFVFX01BU0s7CisJCSAgYiA9ICh0ID4+IFpMSUJfSFVG Rk1BTl9CSVRTX1NISUZUKSAmIFpMSUJfSFVGRk1BTl9CSVRTX01BU0s7CisJCSAgbGl0ID0gdCAm IFpMSUJfSFVGRk1BTl9WQUxVRV9NQVNLOwogCQkgIHZhbCA+Pj0gYiArIDg7CiAJCSAgYml0cyAt PSBiICsgODsKIAkJfQpAQCAtMjI2NSw3ICsyMzMxLDcgQEAgZWxmX3psaWJfaW5mbGF0ZSAoY29u c3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLCB1aW50MTZfdCAqemRlYnVnX3RhYmxl LAogCQkgICAgewogCQkgICAgICB1bnNpZ25lZCBpbnQgZXh0cmE7CiAKLQkJICAgICAgaWYgKCFl bGZfemxpYl9mZXRjaCAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykpCisJCSAgICAgIGlmICgh ZWxmX2ZldGNoX2JpdHMgKCZwaW4sIHBpbmVuZCwgJnZhbCwgJmJpdHMpKQogCQkJcmV0dXJuIDA7 CiAKIAkJICAgICAgLyogVGhpcyBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgdGFibGUgb2YgbGVu Z3RoCkBAIC0yMjgwLDE0ICsyMzQ2LDE0IEBAIGVsZl96bGliX2luZmxhdGUgKGNvbnN0IHVuc2ln bmVkIGNoYXIgKnBpbiwgc2l6ZV90IHNpbiwgdWludDE2X3QgKnpkZWJ1Z190YWJsZSwKIAkJICAg ICAgYml0cyAtPSBleHRyYTsKIAkJICAgIH0KIAotCQkgIGlmICghZWxmX3psaWJfZmV0Y2ggKCZw aW4sIHBpbmVuZCwgJnZhbCwgJmJpdHMpKQorCQkgIGlmICghZWxmX2ZldGNoX2JpdHMgKCZwaW4s IHBpbmVuZCwgJnZhbCwgJmJpdHMpKQogCQkgICAgcmV0dXJuIDA7CiAKIAkJICB0ID0gdGRpc3Rb dmFsICYgMHhmZl07Ci0JCSAgYiA9ICh0ID4+IEhVRkZNQU5fQklUU19TSElGVCkgJiBIVUZGTUFO X0JJVFNfTUFTSzsKLQkJICB2ID0gdCAmIEhVRkZNQU5fVkFMVUVfTUFTSzsKKwkJICBiID0gKHQg Pj4gWkxJQl9IVUZGTUFOX0JJVFNfU0hJRlQpICYgWkxJQl9IVUZGTUFOX0JJVFNfTUFTSzsKKwkJ ICB2ID0gdCAmIFpMSUJfSFVGRk1BTl9WQUxVRV9NQVNLOwogCi0JCSAgaWYgKCh0ICYgKDFVIDw8 IEhVRkZNQU5fU0VDT05EQVJZX1NISUZUKSkgPT0gMCkKKwkJICBpZiAoKHQgJiAoMVUgPDwgWkxJ Ql9IVUZGTUFOX1NFQ09OREFSWV9TSElGVCkpID09IDApCiAJCSAgICB7CiAJCSAgICAgIGRpc3Qg PSB2OwogCQkgICAgICB2YWwgPj49IGIgKyAxOwpAQCAtMjI5Niw4ICsyMzYyLDkgQEAgZWxmX3ps aWJfaW5mbGF0ZSAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLCB1aW50MTZf dCAqemRlYnVnX3RhYmxlLAogCQkgIGVsc2UKIAkJICAgIHsKIAkJICAgICAgdCA9IHRkaXN0W3Yg KyAweDEwMCArICgodmFsID4+IDgpICYgKCgxVSA8PCBiKSAtIDEpKV07Ci0JCSAgICAgIGIgPSAo dCA+PiBIVUZGTUFOX0JJVFNfU0hJRlQpICYgSFVGRk1BTl9CSVRTX01BU0s7Ci0JCSAgICAgIGRp c3QgPSB0ICYgSFVGRk1BTl9WQUxVRV9NQVNLOworCQkgICAgICBiID0gKCh0ID4+IFpMSUJfSFVG Rk1BTl9CSVRTX1NISUZUKQorCQkJICAgJiBaTElCX0hVRkZNQU5fQklUU19NQVNLKTsKKwkJICAg ICAgZGlzdCA9IHQgJiBaTElCX0hVRkZNQU5fVkFMVUVfTUFTSzsKIAkJICAgICAgdmFsID4+PSBi ICsgODsKIAkJICAgICAgYml0cyAtPSBiICsgODsKIAkJICAgIH0KQEAgLTIzMjEsMjA0ICsyMzg4 LDIzNDggQEAgZWxmX3psaWJfaW5mbGF0ZSAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXpl X3Qgc2luLCB1aW50MTZfdCAqemRlYnVnX3RhYmxlLAogCQkJICByZXR1cm4gMDsKIAkJCX0KIAot CQkgICAgICBtZW1zZXQgKHBvdXQsIHBvdXRbLTFdLCBsZW4pOwotCQkgICAgICBwb3V0ICs9IGxl bjsKLQkJICAgIH0KLQkJICBlbHNlIGlmICh1bmxpa2VseSAoZGlzdCA+IDI5KSkKLQkJICAgIHsK LQkJICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCQkgICAgICBtZW1zZXQgKHBvdXQs IHBvdXRbLTFdLCBsZW4pOworCQkgICAgICBwb3V0ICs9IGxlbjsKKwkJICAgIH0KKwkJICBlbHNl IGlmICh1bmxpa2VseSAoZGlzdCA+IDI5KSkKKwkJICAgIHsKKwkJICAgICAgZWxmX3VuY29tcHJl c3NfZmFpbGVkICgpOworCQkgICAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAg ICB7CisJCSAgICAgIGlmIChkaXN0IDwgNCkKKwkJCWRpc3QgPSBkaXN0ICsgMTsKKwkJICAgICAg ZWxzZQorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgZXh0cmE7CisKKwkJCSAgaWYgKCFlbGZfZmV0 Y2hfYml0cyAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykpCisJCQkgICAgcmV0dXJuIDA7CisK KwkJCSAgLyogVGhpcyBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgdGFibGUgb2YKKwkJCSAgICAg ZGlzdGFuY2UgY29kZXMgaW4gUkZDIDE5NTEgMy4yLjUuICAqLworCQkJICBkaXN0IC09IDQ7CisJ CQkgIGV4dHJhID0gKGRpc3QgPj4gMSkgKyAxOworCQkJICBkaXN0ID0gKGRpc3QgJiAxKSA8PCBl eHRyYTsKKwkJCSAgZGlzdCArPSA1OworCQkJICBkaXN0ICs9ICgoMVUgPDwgKGV4dHJhIC0gMSkp IC0gMSkgPDwgMjsKKwkJCSAgZGlzdCArPSB2YWwgJiAoKDFVIDw8IGV4dHJhKSAtIDEpOworCQkJ ICB2YWwgPj49IGV4dHJhOworCQkJICBiaXRzIC09IGV4dHJhOworCQkJfQorCisJCSAgICAgIC8q IEdvIGJhY2sgZGlzdCBieXRlcywgYW5kIGNvcHkgbGVuIGJ5dGVzIGZyb20KKwkJCSB0aGVyZS4g ICovCisKKwkJICAgICAgaWYgKHVubGlrZWx5ICgodW5zaWduZWQgaW50KSAocG91dCAtIHBvcmln b3V0KSA8IGRpc3QpKQorCQkJeworCQkJICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCQkg IHJldHVybiAwOworCQkJfQorCisJCSAgICAgIGlmICh1bmxpa2VseSAoKHVuc2lnbmVkIGludCkg KHBvdXRlbmQgLSBwb3V0KSA8IGxlbikpCisJCQl7CisJCQkgIGVsZl91bmNvbXByZXNzX2ZhaWxl ZCAoKTsKKwkJCSAgcmV0dXJuIDA7CisJCQl9CisKKwkJICAgICAgaWYgKGRpc3QgPj0gbGVuKQor CQkJeworCQkJICBtZW1jcHkgKHBvdXQsIHBvdXQgLSBkaXN0LCBsZW4pOworCQkJICBwb3V0ICs9 IGxlbjsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICB3aGlsZSAobGVuID4gMCkKKwkJ CSAgICB7CisJCQkgICAgICB1bnNpZ25lZCBpbnQgY29weTsKKworCQkJICAgICAgY29weSA9IGxl biA8IGRpc3QgPyBsZW4gOiBkaXN0OworCQkJICAgICAgbWVtY3B5IChwb3V0LCBwb3V0IC0gZGlz dCwgY29weSk7CisJCQkgICAgICBsZW4gLT0gY29weTsKKwkJCSAgICAgIHBvdXQgKz0gY29weTsK KwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyog V2Ugc2hvdWxkIGhhdmUgZmlsbGVkIHRoZSBvdXRwdXQgYnVmZmVyLiAgKi8KKyAgaWYgKHVubGlr ZWx5IChwb3V0ICE9IHBvdXRlbmQpKQorICAgIHsKKyAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxl ZCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworLyogVmVy aWZ5IHRoZSB6bGliIGNoZWNrc3VtLiAgVGhlIGNoZWNrc3VtIGlzIGluIHRoZSA0IGJ5dGVzIGF0 CisgICBDSEVDS0JZVEVTLCBhbmQgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGlzIGF0IFVOQ09NUFJF U1NFRCAvCisgICBVTkNPTVBSRVNTRURfU0laRS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9u IGZhaWx1cmUuICAqLworCitzdGF0aWMgaW50CitlbGZfemxpYl92ZXJpZnlfY2hlY2tzdW0gKGNv bnN0IHVuc2lnbmVkIGNoYXIgKmNoZWNrYnl0ZXMsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIg KnVuY29tcHJlc3NlZCwKKwkJCSAgc2l6ZV90IHVuY29tcHJlc3NlZF9zaXplKQoreworICB1bnNp Z25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGNrc3VtOworICBjb25zdCB1bnNpZ25lZCBjaGFy ICpwOworICB1aW50MzJfdCBzMTsKKyAgdWludDMyX3QgczI7CisgIHNpemVfdCBoc3o7CisKKyAg Y2tzdW0gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGNrc3VtID0gKGNrc3Vt IDw8IDgpIHwgY2hlY2tieXRlc1tpXTsKKworICBzMSA9IDE7CisgIHMyID0gMDsKKworICAvKiBN aW5pbWl6ZSBtb2R1bG8gb3BlcmF0aW9ucy4gICovCisKKyAgcCA9IHVuY29tcHJlc3NlZDsKKyAg aHN6ID0gdW5jb21wcmVzc2VkX3NpemU7CisgIHdoaWxlIChoc3ogPj0gNTU1MikKKyAgICB7Cisg ICAgICBmb3IgKGkgPSAwOyBpIDwgNTU1MjsgaSArPSAxNikKKwl7CisJICAvKiBNYW51YWxseSB1 bnJvbGwgbG9vcCAxNiB0aW1lcy4gICovCisJICBzMSA9IHMxICsgKnArKzsKKwkgIHMyID0gczIg KyBzMTsKKwkgIHMxID0gczEgKyAqcCsrOworCSAgczIgPSBzMiArIHMxOworCSAgczEgPSBzMSAr ICpwKys7CisJICBzMiA9IHMyICsgczE7CisJICBzMSA9IHMxICsgKnArKzsKKwkgIHMyID0gczIg KyBzMTsKKwkgIHMxID0gczEgKyAqcCsrOworCSAgczIgPSBzMiArIHMxOworCSAgczEgPSBzMSAr ICpwKys7CisJICBzMiA9IHMyICsgczE7CisJICBzMSA9IHMxICsgKnArKzsKKwkgIHMyID0gczIg KyBzMTsKKwkgIHMxID0gczEgKyAqcCsrOworCSAgczIgPSBzMiArIHMxOworCSAgczEgPSBzMSAr ICpwKys7CisJICBzMiA9IHMyICsgczE7CisJICBzMSA9IHMxICsgKnArKzsKKwkgIHMyID0gczIg KyBzMTsKKwkgIHMxID0gczEgKyAqcCsrOworCSAgczIgPSBzMiArIHMxOworCSAgczEgPSBzMSAr ICpwKys7CisJICBzMiA9IHMyICsgczE7CisJICBzMSA9IHMxICsgKnArKzsKKwkgIHMyID0gczIg KyBzMTsKKwkgIHMxID0gczEgKyAqcCsrOworCSAgczIgPSBzMiArIHMxOworCSAgczEgPSBzMSAr ICpwKys7CisJICBzMiA9IHMyICsgczE7CisJICBzMSA9IHMxICsgKnArKzsKKwkgIHMyID0gczIg KyBzMTsKKwl9CisgICAgICBoc3ogLT0gNTU1MjsKKyAgICAgIHMxICU9IDY1NTIxOworICAgICAg czIgJT0gNjU1MjE7CisgICAgfQorCisgIHdoaWxlIChoc3ogPj0gMTYpCisgICAgeworICAgICAg LyogTWFudWFsbHkgdW5yb2xsIGxvb3AgMTYgdGltZXMuICAqLworICAgICAgczEgPSBzMSArICpw Kys7CisgICAgICBzMiA9IHMyICsgczE7CisgICAgICBzMSA9IHMxICsgKnArKzsKKyAgICAgIHMy ID0gczIgKyBzMTsKKyAgICAgIHMxID0gczEgKyAqcCsrOworICAgICAgczIgPSBzMiArIHMxOwor ICAgICAgczEgPSBzMSArICpwKys7CisgICAgICBzMiA9IHMyICsgczE7CisgICAgICBzMSA9IHMx ICsgKnArKzsKKyAgICAgIHMyID0gczIgKyBzMTsKKyAgICAgIHMxID0gczEgKyAqcCsrOworICAg ICAgczIgPSBzMiArIHMxOworICAgICAgczEgPSBzMSArICpwKys7CisgICAgICBzMiA9IHMyICsg czE7CisgICAgICBzMSA9IHMxICsgKnArKzsKKyAgICAgIHMyID0gczIgKyBzMTsKKyAgICAgIHMx ID0gczEgKyAqcCsrOworICAgICAgczIgPSBzMiArIHMxOworICAgICAgczEgPSBzMSArICpwKys7 CisgICAgICBzMiA9IHMyICsgczE7CisgICAgICBzMSA9IHMxICsgKnArKzsKKyAgICAgIHMyID0g czIgKyBzMTsKKyAgICAgIHMxID0gczEgKyAqcCsrOworICAgICAgczIgPSBzMiArIHMxOworICAg ICAgczEgPSBzMSArICpwKys7CisgICAgICBzMiA9IHMyICsgczE7CisgICAgICBzMSA9IHMxICsg KnArKzsKKyAgICAgIHMyID0gczIgKyBzMTsKKyAgICAgIHMxID0gczEgKyAqcCsrOworICAgICAg czIgPSBzMiArIHMxOworICAgICAgczEgPSBzMSArICpwKys7CisgICAgICBzMiA9IHMyICsgczE7 CisKKyAgICAgIGhzeiAtPSAxNjsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGhzejsgKytp KQorICAgIHsKKyAgICAgIHMxID0gczEgKyAqcCsrOworICAgICAgczIgPSBzMiArIHMxOworICAg IH0KKworICBzMSAlPSA2NTUyMTsKKyAgczIgJT0gNjU1MjE7CisKKyAgaWYgKHVubGlrZWx5ICgo czIgPDwgMTYpICsgczEgIT0gY2tzdW0pKQorICAgIHsKKyAgICAgIGVsZl91bmNvbXByZXNzX2Zh aWxlZCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworLyog SW5mbGF0ZSBhIHpsaWIgc3RyZWFtIGZyb20gUElOL1NJTiB0byBQT1VUL1NPVVQsIGFuZCB2ZXJp ZnkgdGhlCisgICBjaGVja3N1bS4gIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IuICAq LworCitzdGF0aWMgaW50CitlbGZfemxpYl9pbmZsYXRlX2FuZF92ZXJpZnkgKGNvbnN0IHVuc2ln bmVkIGNoYXIgKnBpbiwgc2l6ZV90IHNpbiwKKwkJCSAgICAgdWludDE2X3QgKnpkZWJ1Z190YWJs ZSwgdW5zaWduZWQgY2hhciAqcG91dCwKKwkJCSAgICAgc2l6ZV90IHNvdXQpCit7CisgIGlmICgh ZWxmX3psaWJfaW5mbGF0ZSAocGluLCBzaW4sIHpkZWJ1Z190YWJsZSwgcG91dCwgc291dCkpCisg ICAgcmV0dXJuIDA7CisgIGlmICghZWxmX3psaWJfdmVyaWZ5X2NoZWNrc3VtIChwaW4gKyBzaW4g LSA0LCBwb3V0LCBzb3V0KSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEZv ciB3b3JraW5nIG1lbW9yeSBkdXJpbmcgenN0ZCBjb21wcmVzc2lvbiwgd2UgbmVlZAorICAgLSBh IGxpdGVyYWwgbGVuZ3RoIEZTRSB0YWJsZTogNTEyIDMyLWJpdCB2YWx1ZXMgPT0gMjA0OCBieXRl cworICAgLSBhIG1hdGNoIGxlbmd0aCBGU0UgdGFibGU6IDUxMiAzMi1iaXQgdmFsdWVzID09IDIw NDggYnl0ZXMKKyAgIC0gYSBvZmZzZXQgRlNFIHRhYmxlOiAyNTYgMzItYml0IHZhbHVlcyA9PSAx MDI0IGJ5dGVzCisgICAtIGEgSHVmZm1hbiB0cmVlOiAyMDQ4IHVpbnQxNl90IHZhbHVlcyA9PSA0 MDk2IGJ5dGVzCisgICAtIHNjcmF0Y2ggc3BhY2UsIG9uZSBvZgorICAgICAtIHRvIGJ1aWxkIGFu IEZTRSB0YWJsZTogNTEyIHVpbnQxNl90IHZhbHVlcyA9PSAxMDI0IGJ5dGVzCisgICAgIC0gdG8g YnVpbGQgYSBIdWZmbWFuIHRyZWU6IDUxMiB1aW50MTZfdCArIDI1NiB1aW50MzJfdCA9PSAyMDQ4 IGJ5dGVzCisgICAgIC0gYnVmZmVyIGZvciBsaXRlcmFsIHZhbHVlcyA9PSAyMDQ4IGJ5dGVzCisq LworCisjZGVmaW5lIFpTVERfVEFCTEVfU0laRQkJCQlcCisgICgyICogNTEyICogc2l6ZW9mIChz dHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5KQlcCisgICArIDI1NiAqIHNpemVvZiAoc3RydWN0IGVs Zl96c3RkX2ZzZV9lbnRyeSkJXAorICAgKyAyMDQ4ICogc2l6ZW9mICh1aW50MTZfdCkJCQlcCisg ICArIDIwNDgpCisKKyNkZWZpbmUgWlNURF9UQUJMRV9MSVRFUkFMX0ZTRV9PRkZTRVQgKDApCisK KyNkZWZpbmUgWlNURF9UQUJMRV9NQVRDSF9GU0VfT0ZGU0VUICg1MTIgKiBzaXplb2YgKHN0cnVj dCBlbGZfenN0ZF9mc2VfZW50cnkpKQorCisjZGVmaW5lIFpTVERfVEFCTEVfT0ZGU0VUX0ZTRV9P RkZTRVQgXAorICAoWlNURF9UQUJMRV9NQVRDSF9GU0VfT0ZGU0VUICsgNTEyICogc2l6ZW9mIChz dHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5KSkKKworI2RlZmluZSBaU1REX1RBQkxFX0hVRkZNQU5f T0ZGU0VUIFwKKyAgKFpTVERfVEFCTEVfT0ZGU0VUX0ZTRV9PRkZTRVQgKyAyNTYgKiBzaXplb2Yg KHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkpKQorCisjZGVmaW5lIFpTVERfVEFCTEVfV09SS19P RkZTRVQgXAorICAoWlNURF9UQUJMRV9IVUZGTUFOX09GRlNFVCArIDIwNDggKiBzaXplb2YgKHVp bnQxNl90KSkKKworI2RlZmluZSBaU1REX1RBQkxFX1dPUktfTElUX1NJWkUgMjA0OAorCisvKiBB biBlbnRyeSBpbiBhIHpzdGQgRlNFIHRhYmxlLiAgKi8KKworc3RydWN0IGVsZl96c3RkX2ZzZV9l bnRyeQoreworICB1bnNpZ25lZCBjaGFyIHN5bWJvbDsKKyAgdW5zaWduZWQgY2hhciBiaXRzOwor ICB1aW50MTZfdCBiYXNlOworfTsKKworc3RhdGljIGludAorZWxmX3pzdGRfYnVpbGRfZnNlIChj b25zdCBpbnQxNl90ICosIGludCwgdWludDE2X3QgKiwgaW50LAorCQkgICAgc3RydWN0IGVsZl96 c3RkX2ZzZV9lbnRyeSAqKTsKKworLyogUmVhZCBhIHpzdGQgRlNFIHRhYmxlIGFuZCBidWlsZCB0 aGUgZGVjb2RpbmcgdGFibGUgaW4gKlRBQkxFLCB1cGRhdGluZyAqUFBJTgorICAgYXMgaXQgcmVh ZHMuICBaREVCVUdfVEFCTEUgaXMgc2NyYXRjaCBzcGFjZTsgaXQgbXVzdCBiZSBlbm91Z2ggZm9y IDUxMgorICAgdWludDE2X3QgdmFsdWVzICgxMDI0IGJ5dGVzKS4gIE1BWElEWCBpcyB0aGUgbWF4 aW11bSBudW1iZXIgb2Ygc3ltYm9scworICAgcGVybWl0dGVkLiAqVEFCTEVfQklUUyBpcyB0aGUg bWF4aW11bSBudW1iZXIgb2YgYml0cyBmb3Igc3ltYm9scyBpbiB0aGUKKyAgIHRhYmxlOiB0aGUg c2l6ZSBvZiAqVEFCTEUgaXMgYXQgbGVhc3QgMSA8PCAqVEFCTEVfQklUUy4gIFRoaXMgdXBkYXRl cworICAgKlRBQkxFX0JJVFMgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgYml0cy4gIFJldHVybnMg MSBvbiBzdWNjZXNzLCAwIG9uCisgICBlcnJvci4gICovCisKK3N0YXRpYyBpbnQKK2VsZl96c3Rk X3JlYWRfZnNlIChjb25zdCB1bnNpZ25lZCBjaGFyICoqcHBpbiwgY29uc3QgdW5zaWduZWQgY2hh ciAqcGluZW5kLAorCQkgICB1aW50MTZfdCAqemRlYnVnX3RhYmxlLCBpbnQgbWF4aWR4LAorCQkg ICBzdHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5ICp0YWJsZSwgaW50ICp0YWJsZV9iaXRzKQorewor ICBjb25zdCB1bnNpZ25lZCBjaGFyICpwaW47CisgIGludDE2X3QgKm5vcm07CisgIHVpbnQxNl90 ICpuZXh0OworICB1aW50NjRfdCB2YWw7CisgIHVuc2lnbmVkIGludCBiaXRzOworICBpbnQgYWNj dXJhY3lfbG9nOworICB1aW50MzJfdCByZW1haW5pbmc7CisgIHVpbnQzMl90IHRocmVzaG9sZDsK KyAgaW50IGJpdHNfbmVlZGVkOworICBpbnQgaWR4OworICBpbnQgcHJldjA7CisKKyAgcGluID0g KnBwaW47CisKKyAgbm9ybSA9IChpbnQxNl90ICopIHpkZWJ1Z190YWJsZTsKKyAgbmV4dCA9IHpk ZWJ1Z190YWJsZSArIDI1NjsKKworICBpZiAodW5saWtlbHkgKHBpbiArIDMgPj0gcGluZW5kKSkK KyAgICB7CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAgICByZXR1cm4gMDsK KyAgICB9CisKKyAgLyogQWxpZ24gUElOIHRvIGEgMzItYml0IGJvdW5kYXJ5LiAgKi8KKworICB2 YWwgPSAwOworICBiaXRzID0gMDsKKyAgd2hpbGUgKCgoKHVpbnRwdHJfdCkgcGluKSAmIDMpICE9 IDApCisgICAgeworICAgICAgdmFsIHw9ICh1aW50NjRfdCkqcGluIDw8IGJpdHM7CisgICAgICBi aXRzICs9IDg7CisgICAgICArK3BpbjsKKyAgICB9CisKKyAgaWYgKCFlbGZfZmV0Y2hfYml0cyAo JnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykpCisgICAgcmV0dXJuIDA7CisKKyAgYWNjdXJhY3lf bG9nID0gKHZhbCAmIDB4ZikgKyA1OworICBpZiAoYWNjdXJhY3lfbG9nID4gKnRhYmxlX2JpdHMp CisgICAgeworICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworICAgICAgcmV0dXJuIDA7 CisgICAgfQorICAqdGFibGVfYml0cyA9IGFjY3VyYWN5X2xvZzsKKyAgdmFsID4+PSA0OworICBi aXRzIC09IDQ7CisKKyAgLyogVGhpcyBjb2RlIGlzIG1vc3RseSBjb3BpZWQgZnJvbSB0aGUgcmVm ZXJlbmNlIGltcGxlbWVudGF0aW9uLiAgKi8KKworICAvKiBUaGUgbnVtYmVyIG9mIHJlbWFpbmlu ZyBwcm9iYWJpbGl0aWVzLCBwbHVzIDEuICBUaGlzIHNldHMgdGhlIG51bWJlciBvZgorICAgICBi aXRzIHRoYXQgbmVlZCB0byBiZSByZWFkIGZvciB0aGUgbmV4dCB2YWx1ZS4gICovCisgIHJlbWFp bmluZyA9ICgxIDw8IGFjY3VyYWN5X2xvZykgKyAxOworCisgIC8qIFRoZSBjdXJyZW50IGRpZmZl cmVuY2UgYmV0d2VlbiBzbWFsbCBhbmQgbGFyZ2UgdmFsdWVzLCB3aGljaCBkZXBlbmRzIG9uCisg ICAgIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIHZhbHVlcy4gIFNtYWxsIHZhbHVlcyB1c2Ugb25l IGxlc3MgYml0LiAgKi8KKyAgdGhyZXNob2xkID0gMSA8PCBhY2N1cmFjeV9sb2c7CisKKyAgLyog VGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gY29tcHV0ZSB0aHJlc2hvbGQuICAqLworICBiaXRz X25lZWRlZCA9IGFjY3VyYWN5X2xvZyArIDE7CisKKyAgLyogVGhlIG5leHQgY2hhcmFjdGVyIHZh bHVlLiAgKi8KKyAgaWR4ID0gMDsKKworICAvKiBXaGV0aGVyIHRoZSBsYXN0IGNvdW50IHdhcyAw LiAgKi8KKyAgcHJldjAgPSAwOworCisgIHdoaWxlIChyZW1haW5pbmcgPiAxICYmIGlkeCA8PSBt YXhpZHgpCisgICAgeworICAgICAgdWludDMyX3QgbWF4OworICAgICAgaW50MzJfdCBjb3VudDsK KworICAgICAgaWYgKCFlbGZfZmV0Y2hfYml0cyAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykp CisJcmV0dXJuIDA7CisKKyAgICAgIGlmIChwcmV2MCkKKwl7CisJICBpbnQgemlkeDsKKworCSAg LyogUHJldmlvdXMgY291bnQgd2FzIDAsIHNvIHRoZXJlIGlzIGEgMi1iaXQgcmVwZWF0IGZsYWcu ICBJZiB0aGUKKwkgICAgIDItYml0IGZsYWcgaXMgMGIxMSwgaXQgYWRkcyAzIGFuZCB0aGVuIHRo ZXJlIGlzIGFub3RoZXIgcmVwZWF0CisJICAgICBmbGFnLiAgKi8KKwkgIHppZHggPSBpZHg7CisJ ICB3aGlsZSAoKHZhbCAmIDB4ZmZmKSA9PSAweGZmZikKKwkgICAgeworCSAgICAgIHppZHggKz0g MyAqIDY7CisJICAgICAgaWYgICghZWxmX2ZldGNoX2JpdHMgKCZwaW4sIHBpbmVuZCwgJnZhbCwg JmJpdHMpKQorCQlyZXR1cm4gMDsKKwkgICAgICB2YWwgPj49IDEyOworCSAgICAgIGJpdHMgLT0g MTI7CisJICAgIH0KKwkgIHdoaWxlICgodmFsICYgMykgPT0gMykKKwkgICAgeworCSAgICAgIHpp ZHggKz0gMzsKKwkgICAgICBpZiAoIWVsZl9mZXRjaF9iaXRzICgmcGluLCBwaW5lbmQsICZ2YWws ICZiaXRzKSkKKwkJcmV0dXJuIDA7CisJICAgICAgdmFsID4+PSAyOworCSAgICAgIGJpdHMgLT0g MjsKKwkgICAgfQorCSAgLyogV2UgaGF2ZSBhdCBsZWFzdCAxMyBiaXRzIGhlcmUsIGRvbid0IG5l ZWQgdG8gZmV0Y2guICAqLworCSAgemlkeCArPSB2YWwgJiAzOworCSAgdmFsID4+PSAyOworCSAg Yml0cyAtPSAyOworCisJICBpZiAodW5saWtlbHkgKHppZHggPiBtYXhpZHgpKQorCSAgICB7CisJ ICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCSAgICAgIHJldHVybiAwOworCSAgICB9 CisKKwkgIGZvciAoOyBpZHggPCB6aWR4OyBpZHgrKykKKwkgICAgbm9ybVtpZHhdID0gMDsKKwor CSAgcHJldjAgPSAwOworCSAgY29udGludWU7CisJfQorCisgICAgICBtYXggPSAoMiAqIHRocmVz aG9sZCAtIDEpIC0gcmVtYWluaW5nOworICAgICAgaWYgKCh2YWwgJiAodGhyZXNob2xkIC0gMSkp IDwgbWF4KQorCXsKKwkgIC8qIEEgc21hbGwgdmFsdWUuICAqLworCSAgY291bnQgPSAoaW50MzJf dCkgKCh1aW50MzJfdCkgdmFsICYgKHRocmVzaG9sZCAtIDEpKTsKKwkgIHZhbCA+Pj0gYml0c19u ZWVkZWQgLSAxOworCSAgYml0cyAtPSBiaXRzX25lZWRlZCAtIDE7CisJfQorICAgICAgZWxzZQor CXsKKwkgIC8qIEEgbGFyZ2UgdmFsdWUuICAqLworCSAgY291bnQgPSAoaW50MzJfdCkgKCh1aW50 MzJfdCkgdmFsICYgKDIgKiB0aHJlc2hvbGQgLSAxKSk7CisJICBpZiAoY291bnQgPj0gKGludDMy X3QpIHRocmVzaG9sZCkKKwkgICAgY291bnQgLT0gKGludDMyX3QpIG1heDsKKwkgIHZhbCA+Pj0g Yml0c19uZWVkZWQ7CisJICBiaXRzIC09IGJpdHNfbmVlZGVkOworCX0KKworICAgICAgY291bnQt LTsKKyAgICAgIGlmIChjb3VudCA+PSAwKQorCXJlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgIGVs c2UKKwlyZW1haW5pbmctLTsKKyAgICAgIGlmICh1bmxpa2VseSAoaWR4ID49IDI1NikpCisJewor CSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgbm9y bVtpZHhdID0gKGludDE2X3QpIGNvdW50OworICAgICAgKytpZHg7CisKKyAgICAgIHByZXYwID0g Y291bnQgPT0gMDsKKworICAgICAgd2hpbGUgKHJlbWFpbmluZyA8IHRocmVzaG9sZCkKKwl7CisJ ICBiaXRzX25lZWRlZC0tOworCSAgdGhyZXNob2xkID4+PSAxOworCX0KKyAgICB9CisKKyAgaWYg KHVubGlrZWx5IChyZW1haW5pbmcgIT0gMSkpCisgICAgeworICAgICAgZWxmX3VuY29tcHJlc3Nf ZmFpbGVkICgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIElmIHdlJ3ZlIHJlYWQg YWhlYWQgbW9yZSB0aGFuIGEgYnl0ZSwgYmFjayB1cC4gICovCisgIHdoaWxlIChiaXRzID49IDgp CisgICAgeworICAgICAgLS1waW47CisgICAgICBiaXRzIC09IDg7CisgICAgfQorCisgICpwcGlu ID0gcGluOworCisgIGZvciAoOyBpZHggPD0gbWF4aWR4OyBpZHgrKykKKyAgICBub3JtW2lkeF0g PSAwOworCisgIHJldHVybiBlbGZfenN0ZF9idWlsZF9mc2UgKG5vcm0sIGlkeCwgbmV4dCwgKnRh YmxlX2JpdHMsIHRhYmxlKTsKK30KKworLyogQnVpbGQgdGhlIEZTRSBkZWNvZGluZyB0YWJsZSBm cm9tIGEgbGlzdCBvZiBwcm9iYWJpbGl0aWVzLiAgVGhpcyByZWFkcyBmcm9tCisgICBOT1JNIG9m IGxlbmd0aCBJRFgsIHVzZXMgTkVYVCBhcyBzY3JhdGNoIHNwYWNlLCBhbmQgd3JpdGVzIHRvICpU QUJMRSwgd2hvc2UKKyAgIHNpemUgaXMgVEFCTEVfQklUUy4gICovCisKK3N0YXRpYyBpbnQKK2Vs Zl96c3RkX2J1aWxkX2ZzZSAoY29uc3QgaW50MTZfdCAqbm9ybSwgaW50IGlkeCwgdWludDE2X3Qg Km5leHQsCisJCSAgICBpbnQgdGFibGVfYml0cywgc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeSAq dGFibGUpCit7CisgIGludCB0YWJsZV9zaXplOworICBpbnQgaGlnaF90aHJlc2hvbGQ7CisgIGlu dCBpOworICBpbnQgcG9zOworICBpbnQgc3RlcDsKKyAgaW50IG1hc2s7CisKKyAgdGFibGVfc2l6 ZSA9IDEgPDwgdGFibGVfYml0czsKKyAgaGlnaF90aHJlc2hvbGQgPSB0YWJsZV9zaXplIC0gMTsK KyAgZm9yIChpID0gMDsgaSA8IGlkeDsgaSsrKQorICAgIHsKKyAgICAgIGludDE2X3QgbjsKKwor ICAgICAgbiA9IG5vcm1baV07CisgICAgICBpZiAobiA+PSAwKQorCW5leHRbaV0gPSAodWludDE2 X3QpIG47CisgICAgICBlbHNlCisJeworCSAgdGFibGVbaGlnaF90aHJlc2hvbGRdLnN5bWJvbCA9 ICh1bnNpZ25lZCBjaGFyKSBpOworCSAgaGlnaF90aHJlc2hvbGQtLTsKKwkgIG5leHRbaV0gPSAx OworCX0KKyAgICB9CisKKyAgcG9zID0gMDsKKyAgc3RlcCA9ICh0YWJsZV9zaXplID4+IDEpICsg KHRhYmxlX3NpemUgPj4gMykgKyAzOworICBtYXNrID0gdGFibGVfc2l6ZSAtIDE7CisgIGZvciAo aSA9IDA7IGkgPCBpZHg7IGkrKykKKyAgICB7CisgICAgICBpbnQgbjsKKyAgICAgIGludCBqOwor CisgICAgICBuID0gKGludCkgbm9ybVtpXTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKysp CisJeworCSAgdGFibGVbcG9zXS5zeW1ib2wgPSAodW5zaWduZWQgY2hhcikgaTsKKwkgIHBvcyA9 IChwb3MgKyBzdGVwKSAmIG1hc2s7CisJICB3aGlsZSAodW5saWtlbHkgKHBvcyA+IGhpZ2hfdGhy ZXNob2xkKSkKKwkgICAgcG9zID0gKHBvcyArIHN0ZXApICYgbWFzazsKKwl9CisgICAgfQorICBp ZiAocG9zICE9IDApCisgICAgeworICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworICAg ICAgcmV0dXJuIDA7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9zaXplOyBpKysp CisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBzeW07CisgICAgICB1aW50MTZfdCBuZXh0X3N0 YXRlOworICAgICAgaW50IGhpZ2hfYml0OworICAgICAgaW50IGJpdHM7CisKKyAgICAgIHN5bSA9 IHRhYmxlW2ldLnN5bWJvbDsKKyAgICAgIG5leHRfc3RhdGUgPSBuZXh0W3N5bV07CisgICAgICAr K25leHRbc3ltXTsKKworICAgICAgaWYgKG5leHRfc3RhdGUgPT0gMCkKKwl7CisJICBlbGZfdW5j b21wcmVzc19mYWlsZWQgKCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBoaWdoX2JpdCA9IDMx IC0gX19idWlsdGluX2NseiAobmV4dF9zdGF0ZSk7CisKKyAgICAgIGJpdHMgPSB0YWJsZV9iaXRz IC0gaGlnaF9iaXQ7CisgICAgICB0YWJsZVtpXS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpIGJpdHM7 CisgICAgICB0YWJsZVtpXS5iYXNlID0gKHVpbnQxNl90KSAoKG5leHRfc3RhdGUgPDwgYml0cykg LSB0YWJsZV9zaXplKTsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBCQUNLVFJB Q0VfR0VORVJBVEVfWlNURF9GU0VfVEFCTEVTCisKKy8qIFVzZWQgdG8gZ2VuZXJhdGUgdGhlIHBy ZWRlZmluZWQgRlNFIGRlY29kaW5nIHRhYmxlcyBmb3IgenN0ZC4gICovCisKKyNpbmNsdWRlIDxz dGRpby5oPgorCisvKiBUaGVzZSB2YWx1ZXMgYXJlIHN0cmFpZ2h0IGZyb20gUkZDIDg4NzguICAq LworCitzdGF0aWMgaW50MTZfdCBsaXRbMzZdID0KK3sKKyAgIDQsIDMsIDIsIDIsIDIsIDIsIDIs IDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsCisgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAy LCAzLCAyLCAxLCAxLCAxLCAxLCAxLAorICAtMSwtMSwtMSwtMQorfTsKKworc3RhdGljIGludDE2 X3QgbWF0Y2hbNTNdID0KK3sKKyAgIDEsIDQsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEs IDEsIDEsIDEsIDEsCisgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAx LCAxLCAxLAorICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwtMSwt MSwKKyAgLTEsLTEsLTEsLTEsLTEKK307CisKK3N0YXRpYyBpbnQxNl90IG9mZnNldFsyOV0gPQor eworICAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAx LCAxLCAxLCAxLCAxLCAxLCAxLCAxLC0xLC0xLC0xLC0xLC0xCit9OworCitzdGF0aWMgdWludDE2 X3QgbmV4dFsyNTZdOworCitzdGF0aWMgdm9pZAorcHJpbnRfdGFibGUgKGNvbnN0IHN0cnVjdCBl bGZfenN0ZF9mc2VfZW50cnkgKnRhYmxlLCBzaXplX3Qgc2l6ZSkKK3sKKyAgc2l6ZV90IGk7CisK KyAgcHJpbnRmICgie1xuIik7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpCisgICAg eworICAgICAgaW50IGo7CisKKyAgICAgIHByaW50ZiAoIiAiKTsKKyAgICAgIGZvciAoaiA9IDA7 IGogPCA0ICYmIGkgKyBqIDwgc2l6ZTsgKytqKQorCXByaW50ZiAoIiB7ICVkLCAlZCwgJWQgfSwi LCB0YWJsZVtpICsgal0uc3ltYm9sLCB0YWJsZVtpICsgal0uYml0cywKKwkJdGFibGVbaSArIGpd LmJhc2UpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9CisgIHByaW50ZiAoIn07XG4iKTsK K30KKworaW50CittYWluICgpCit7CisgIHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgbGl0X3Rh YmxlWzY0XTsKKyAgc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeSBtYXRjaF90YWJsZVs2NF07Cisg IHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgb2Zmc2V0X3RhYmxlWzMyXTsKKworICBpZiAoIWVs Zl96c3RkX2J1aWxkX2ZzZSAobGl0LCBzaXplb2YgbGl0IC8gc2l6ZW9mIGxpdFswXSwgbmV4dCwK KwkJCSAgIDYsIGxpdF90YWJsZSkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZWxm X3pzdGRfYnVpbGRfZnNlIGZhaWxlZFxuIik7CisgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwor ICAgIH0KKworICBwcmludGYgKCJzdGF0aWMgY29uc3Qgc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRy eSAiCisJICAiZWxmX3pzdGRfbGl0X3RhYmxlWzY0XSA9XG4iKTsKKyAgcHJpbnRfdGFibGUgKGxp dF90YWJsZSwgc2l6ZW9mIGxpdF90YWJsZSAvIHNpemVvZiBsaXRfdGFibGVbMF0pOworICBwcmlu dGYgKCJcbiIpOworCisgIGlmICghZWxmX3pzdGRfYnVpbGRfZnNlIChtYXRjaCwgc2l6ZW9mIG1h dGNoIC8gc2l6ZW9mIG1hdGNoWzBdLCBuZXh0LAorCQkJICAgNiwgbWF0Y2hfdGFibGUpKQorICAg IHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImVsZl96c3RkX2J1aWxkX2ZzZSBmYWlsZWRcbiIp OworICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgcHJpbnRmICgic3RhdGlj IGNvbnN0IHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgIgorCSAgImVsZl96c3RkX21hdGNoX3Rh YmxlWzY0XSA9XG4iKTsKKyAgcHJpbnRfdGFibGUgKG1hdGNoX3RhYmxlLCBzaXplb2YgbWF0Y2hf dGFibGUgLyBzaXplb2YgbWF0Y2hfdGFibGVbMF0pOworICBwcmludGYgKCJcbiIpOworCisgIGlm ICghZWxmX3pzdGRfYnVpbGRfZnNlIChvZmZzZXQsIHNpemVvZiBvZmZzZXQgLyBzaXplb2Ygb2Zm c2V0WzBdLCBuZXh0LAorCQkJICAgNSwgb2Zmc2V0X3RhYmxlKSkKKyAgICB7CisgICAgICBmcHJp bnRmIChzdGRlcnIsICJlbGZfenN0ZF9idWlsZF9mc2UgZmFpbGVkXG4iKTsKKyAgICAgIGV4aXQg KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgIHByaW50ZiAoInN0YXRpYyBjb25zdCBzdHJ1Y3Qg ZWxmX3pzdGRfZnNlX2VudHJ5ICIKKwkgICJlbGZfenN0ZF9vZmZzZXRfdGFibGVbMzJdID1cbiIp OworICBwcmludF90YWJsZSAob2Zmc2V0X3RhYmxlLCBzaXplb2Ygb2Zmc2V0X3RhYmxlIC8gc2l6 ZW9mIG9mZnNldF90YWJsZVswXSk7CisgIHByaW50ZiAoIlxuIik7CisKKyAgcmV0dXJuIDA7Cit9 CisKKyNlbmRpZgorCisvKiBUaGUgZml4ZWQgdGFibGVzIGdlbmVyYXRlZCBieSB0aGUgI2lmZGVm J2VkIG91dCBtYWluIGZ1bmN0aW9uCisgICBhYm92ZS4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgZWxmX3pzdGRfZnNlX2VudHJ5IGVsZl96c3RkX2xpdF90YWJsZVs2NF0gPQoreworICB7IDAs IDQsIDAgfSwgeyAwLCA0LCAxNiB9LCB7IDEsIDUsIDMyIH0sIHsgMywgNSwgMCB9LAorICB7IDQs IDUsIDAgfSwgeyA2LCA1LCAwIH0sIHsgNywgNSwgMCB9LCB7IDksIDUsIDAgfSwKKyAgeyAxMCwg NSwgMCB9LCB7IDEyLCA1LCAwIH0sIHsgMTQsIDYsIDAgfSwgeyAxNiwgNSwgMCB9LAorICB7IDE4 LCA1LCAwIH0sIHsgMTksIDUsIDAgfSwgeyAyMSwgNSwgMCB9LCB7IDIyLCA1LCAwIH0sCisgIHsg MjQsIDUsIDAgfSwgeyAyNSwgNSwgMzIgfSwgeyAyNiwgNSwgMCB9LCB7IDI3LCA2LCAwIH0sCisg IHsgMjksIDYsIDAgfSwgeyAzMSwgNiwgMCB9LCB7IDAsIDQsIDMyIH0sIHsgMSwgNCwgMCB9LAor ICB7IDIsIDUsIDAgfSwgeyA0LCA1LCAzMiB9LCB7IDUsIDUsIDAgfSwgeyA3LCA1LCAzMiB9LAor ICB7IDgsIDUsIDAgfSwgeyAxMCwgNSwgMzIgfSwgeyAxMSwgNSwgMCB9LCB7IDEzLCA2LCAwIH0s CisgIHsgMTYsIDUsIDMyIH0sIHsgMTcsIDUsIDAgfSwgeyAxOSwgNSwgMzIgfSwgeyAyMCwgNSwg MCB9LAorICB7IDIyLCA1LCAzMiB9LCB7IDIzLCA1LCAwIH0sIHsgMjUsIDQsIDAgfSwgeyAyNSwg NCwgMTYgfSwKKyAgeyAyNiwgNSwgMzIgfSwgeyAyOCwgNiwgMCB9LCB7IDMwLCA2LCAwIH0sIHsg MCwgNCwgNDggfSwKKyAgeyAxLCA0LCAxNiB9LCB7IDIsIDUsIDMyIH0sIHsgMywgNSwgMzIgfSwg eyA1LCA1LCAzMiB9LAorICB7IDYsIDUsIDMyIH0sIHsgOCwgNSwgMzIgfSwgeyA5LCA1LCAzMiB9 LCB7IDExLCA1LCAzMiB9LAorICB7IDEyLCA1LCAzMiB9LCB7IDE1LCA2LCAwIH0sIHsgMTcsIDUs IDMyIH0sIHsgMTgsIDUsIDMyIH0sCisgIHsgMjAsIDUsIDMyIH0sIHsgMjEsIDUsIDMyIH0sIHsg MjMsIDUsIDMyIH0sIHsgMjQsIDUsIDMyIH0sCisgIHsgMzUsIDYsIDAgfSwgeyAzNCwgNiwgMCB9 LCB7IDMzLCA2LCAwIH0sIHsgMzIsIDYsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg ZWxmX3pzdGRfZnNlX2VudHJ5IGVsZl96c3RkX21hdGNoX3RhYmxlWzY0XSA9Cit7CisgIHsgMCwg NiwgMCB9LCB7IDEsIDQsIDAgfSwgeyAyLCA1LCAzMiB9LCB7IDMsIDUsIDAgfSwKKyAgeyA1LCA1 LCAwIH0sIHsgNiwgNSwgMCB9LCB7IDgsIDUsIDAgfSwgeyAxMCwgNiwgMCB9LAorICB7IDEzLCA2 LCAwIH0sIHsgMTYsIDYsIDAgfSwgeyAxOSwgNiwgMCB9LCB7IDIyLCA2LCAwIH0sCisgIHsgMjUs IDYsIDAgfSwgeyAyOCwgNiwgMCB9LCB7IDMxLCA2LCAwIH0sIHsgMzMsIDYsIDAgfSwKKyAgeyAz NSwgNiwgMCB9LCB7IDM3LCA2LCAwIH0sIHsgMzksIDYsIDAgfSwgeyA0MSwgNiwgMCB9LAorICB7 IDQzLCA2LCAwIH0sIHsgNDUsIDYsIDAgfSwgeyAxLCA0LCAxNiB9LCB7IDIsIDQsIDAgfSwKKyAg eyAzLCA1LCAzMiB9LCB7IDQsIDUsIDAgfSwgeyA2LCA1LCAzMiB9LCB7IDcsIDUsIDAgfSwKKyAg eyA5LCA2LCAwIH0sIHsgMTIsIDYsIDAgfSwgeyAxNSwgNiwgMCB9LCB7IDE4LCA2LCAwIH0sCisg IHsgMjEsIDYsIDAgfSwgeyAyNCwgNiwgMCB9LCB7IDI3LCA2LCAwIH0sIHsgMzAsIDYsIDAgfSwK KyAgeyAzMiwgNiwgMCB9LCB7IDM0LCA2LCAwIH0sIHsgMzYsIDYsIDAgfSwgeyAzOCwgNiwgMCB9 LAorICB7IDQwLCA2LCAwIH0sIHsgNDIsIDYsIDAgfSwgeyA0NCwgNiwgMCB9LCB7IDEsIDQsIDMy IH0sCisgIHsgMSwgNCwgNDggfSwgeyAyLCA0LCAxNiB9LCB7IDQsIDUsIDMyIH0sIHsgNSwgNSwg MzIgfSwKKyAgeyA3LCA1LCAzMiB9LCB7IDgsIDUsIDMyIH0sIHsgMTEsIDYsIDAgfSwgeyAxNCwg NiwgMCB9LAorICB7IDE3LCA2LCAwIH0sIHsgMjAsIDYsIDAgfSwgeyAyMywgNiwgMCB9LCB7IDI2 LCA2LCAwIH0sCisgIHsgMjksIDYsIDAgfSwgeyA1MiwgNiwgMCB9LCB7IDUxLCA2LCAwIH0sIHsg NTAsIDYsIDAgfSwKKyAgeyA0OSwgNiwgMCB9LCB7IDQ4LCA2LCAwIH0sIHsgNDcsIDYsIDAgfSwg eyA0NiwgNiwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50 cnkgZWxmX3pzdGRfb2Zmc2V0X3RhYmxlWzMyXSA9Cit7CisgIHsgMCwgNSwgMCB9LCB7IDYsIDQs IDAgfSwgeyA5LCA1LCAwIH0sIHsgMTUsIDUsIDAgfSwKKyAgeyAyMSwgNSwgMCB9LCB7IDMsIDUs IDAgfSwgeyA3LCA0LCAwIH0sIHsgMTIsIDUsIDAgfSwKKyAgeyAxOCwgNSwgMCB9LCB7IDIzLCA1 LCAwIH0sIHsgNSwgNSwgMCB9LCB7IDgsIDQsIDAgfSwKKyAgeyAxNCwgNSwgMCB9LCB7IDIwLCA1 LCAwIH0sIHsgMiwgNSwgMCB9LCB7IDcsIDQsIDE2IH0sCisgIHsgMTEsIDUsIDAgfSwgeyAxNywg NSwgMCB9LCB7IDIyLCA1LCAwIH0sIHsgNCwgNSwgMCB9LAorICB7IDgsIDQsIDE2IH0sIHsgMTMs IDUsIDAgfSwgeyAxOSwgNSwgMCB9LCB7IDEsIDUsIDAgfSwKKyAgeyA2LCA0LCAxNiB9LCB7IDEw LCA1LCAwIH0sIHsgMTYsIDUsIDAgfSwgeyAyOCwgNSwgMCB9LAorICB7IDI3LCA1LCAwIH0sIHsg MjYsIDUsIDAgfSwgeyAyNSwgNSwgMCB9LCB7IDI0LCA1LCAwIH0sCit9OworCisvKiBSZWFkIGEg enN0ZCBIdWZmbWFuIHRhYmxlIGFuZCBidWlsZCB0aGUgZGVjb2RpbmcgdGFibGUgaW4gKlRBQkxF LCByZWFkaW5nCisgICBhbmQgdXBkYXRpbmcgKlBQSU4uICBUaGlzIHNldHMgKlBUQUJMRV9CSVRT IHRvIHRoZSBudW1iZXIgb2YgYml0cyBvZiB0aGUKKyAgIHRhYmxlLCBzdWNoIHRoYXQgdGhlIHRh YmxlIGxlbmd0aCBpcyAxIDw8ICpUQUJMRV9CSVRTLiAgWkRFQlVHX1RBQkxFIGlzCisgICBzY3Jh dGNoIHNwYWNlOyBpdCBtdXN0IGJlIGVub3VnaCBmb3IgNTEyIHVpbnQxNl90IHZhbHVlcyArIDI1 NiAzMi1iaXQgdmFsdWVzCisgICAoMjA0OCBieXRlcykuICBSZXR1cm5zIDEgb24gc3VjY2Vzcywg MCBvbiBlcnJvci4gICovCisKK3N0YXRpYyBpbnQKK2VsZl96c3RkX3JlYWRfaHVmZiAoY29uc3Qg dW5zaWduZWQgY2hhciAqKnBwaW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbmVuZCwKKwkJICAg IHVpbnQxNl90ICp6ZGVidWdfdGFibGUsIHVpbnQxNl90ICp0YWJsZSwgaW50ICpwdGFibGVfYml0 cykKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcGluOworICB1bnNpZ25lZCBjaGFyIGhkcjsK KyAgdW5zaWduZWQgY2hhciAqd2VpZ2h0czsKKyAgc2l6ZV90IGNvdW50OworICB1aW50MzJfdCAq d2VpZ2h0X21hcms7CisgIHNpemVfdCBpOworICB1aW50MzJfdCB3ZWlnaHRfbWFzazsKKyAgc2l6 ZV90IHRhYmxlX2JpdHM7CisKKyAgcGluID0gKnBwaW47CisgIGlmICh1bmxpa2VseSAocGluID49 IHBpbmVuZCkpCisgICAgeworICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworICAgICAg cmV0dXJuIDA7CisgICAgfQorICBoZHIgPSAqcGluOworICArK3BpbjsKKworICB3ZWlnaHRzID0g KHVuc2lnbmVkIGNoYXIgKikgemRlYnVnX3RhYmxlOworCisgIGlmIChoZHIgPCAxMjgpCisgICAg eworICAgICAgLyogVGFibGUgaXMgY29tcHJlc3NlZCB1c2luZyBGU0UuICAqLworCisgICAgICBz dHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5ICpmc2VfdGFibGU7CisgICAgICBpbnQgZnNlX3RhYmxl X2JpdHM7CisgICAgICB1aW50MTZfdCAqc2NyYXRjaDsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNo YXIgKnBmc2U7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYmFjazsKKyAgICAgIHVuc2ln bmVkIGNoYXIgc3RyZWFtX3N0YXJ0OworICAgICAgdWludDY0X3QgdmFsOworICAgICAgdW5zaWdu ZWQgaW50IGJpdHM7CisgICAgICB1bnNpZ25lZCBpbnQgc3RhdGUxLCBzdGF0ZTI7CisKKyAgICAg IC8qIFNDUkFUQ0ggaXMgdXNlZCB0ZW1wb3JhcmlseSBieSBlbGZfenN0ZF9yZWFkX2ZzZS4gIEl0 IG92ZXJsYXBzCisJIFdFSUdIVFMuICAqLworICAgICAgc2NyYXRjaCA9IHpkZWJ1Z190YWJsZTsK KyAgICAgIGZzZV90YWJsZSA9IChzdHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5ICopIChzY3JhdGNo ICsgNTEyKTsKKyAgICAgIGZzZV90YWJsZV9iaXRzID0gNjsKKworICAgICAgcGZzZSA9IHBpbjsK KyAgICAgIGlmICghZWxmX3pzdGRfcmVhZF9mc2UgKCZwZnNlLCBwaW5lbmQsIHNjcmF0Y2gsIDI1 NSwgZnNlX3RhYmxlLAorCQkJICAgICAgJmZzZV90YWJsZV9iaXRzKSkKKwlyZXR1cm4gMDsKKwor ICAgICAgaWYgKHVubGlrZWx5IChwaW4gKyBoZHIgPiBwaW5lbmQpKQorCXsKKwkgIGVsZl91bmNv bXByZXNzX2ZhaWxlZCAoKTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogV2Ugbm8gbG9u Z2VyIG5lZWQgU0NSQVRDSC4gIFN0YXJ0IHJlY29yZGluZyB3ZWlnaHRzLiAgV2UgbmVlZCB1cCB0 bworCSAyNTYgYnl0ZXMgb2Ygd2VpZ2h0cyBhbmQgNjQgYnl0ZXMgb2YgcmFuayBjb3VudHMsIHNv IGl0IHdvbid0IG92ZXJsYXAKKwkgRlNFX1RBQkxFLiAgKi8KKworICAgICAgcGJhY2sgPSBwaW4g KyBoZHIgLSAxOworICAgICAgc3RyZWFtX3N0YXJ0ID0gKnBiYWNrOworICAgICAgaWYgKHVubGlr ZWx5IChzdHJlYW1fc3RhcnQgPT0gMCkpCisJeworCSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgp OworCSAgcmV0dXJuIDA7CisJfQorICAgICAgdmFsID0gMDsKKyAgICAgIGJpdHMgPSAwOworICAg ICAgd2hpbGUgKCgoKHVpbnRwdHJfdClwYmFjaykgJiAzKSAhPSAwKQorCXsKKwkgIHZhbCA8PD0g ODsKKwkgIHZhbCB8PSAodWludDY0X3QpKnBiYWNrOworCSAgYml0cyArPSA4OworCSAgLS1wYmFj azsKKwl9CisgICAgICB2YWwgPDw9IDg7CisgICAgICB2YWwgfD0gKHVpbnQ2NF90KSpwYmFjazsK KyAgICAgIGJpdHMgKz0gODsKKworICAgICAgaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAo JnBiYWNrLCBwZnNlLCAmdmFsLCAmYml0cykpCisJcmV0dXJuIDA7CisKKyAgICAgIGJpdHMgLT0g X19idWlsdGluX2NseiAoc3RyZWFtX3N0YXJ0KSAtIDI0ICsgMTsKKworICAgICAgaWYgKCFlbGZf ZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNrLCBwZnNlLCAmdmFsLCAmYml0cykpCisJcmV0dXJu IDA7CisKKyAgICAgIGJpdHMgLT0gZnNlX3RhYmxlX2JpdHM7CisgICAgICBzdGF0ZTEgPSAodmFs ID4+IGJpdHMpICYgKCgxVSA8PCBmc2VfdGFibGVfYml0cykgLSAxKTsKKyAgICAgIGJpdHMgLT0g ZnNlX3RhYmxlX2JpdHM7CisgICAgICBzdGF0ZTIgPSAodmFsID4+IGJpdHMpICYgKCgxVSA8PCBm c2VfdGFibGVfYml0cykgLSAxKTsKKworICAgICAgLyogVGhlcmUgYXJlIHR3byBpbmRlcGVuZGVu dCBGU0Ugc3RyZWFtcywgdHJhY2tlZCBieSBTVEFURTEgYW5kIFNUQVRFMi4KKwkgV2UgZGVjb2Rl IHRoZW0gYWx0ZXJuYXRlbHkuICAqLworCisgICAgICBjb3VudCA9IDA7CisgICAgICB3aGlsZSAo MSkKKwl7CisJICBzdHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5ICpwdDsKKwkgIHVpbnQ2NF90IHY7 CisKKwkgIHB0ID0gJmZzZV90YWJsZVtzdGF0ZTFdOworCisJICBpZiAodW5saWtlbHkgKHBpbiA8 IHBpbmVuZCkgJiYgYml0cyA8IHB0LT5iaXRzKQorCSAgICB7CisJICAgICAgaWYgKHVubGlrZWx5 IChjb3VudCA+PSAyNTQpKQorCQl7CisJCSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCQkg IHJldHVybiAwOworCQl9CisJICAgICAgd2VpZ2h0c1tjb3VudF0gPSAodW5zaWduZWQgY2hhcikg cHQtPnN5bWJvbDsKKwkgICAgICB3ZWlnaHRzW2NvdW50ICsgMV0gPSAodW5zaWduZWQgY2hhcikg ZnNlX3RhYmxlW3N0YXRlMl0uc3ltYm9sOworCSAgICAgIGNvdW50ICs9IDI7CisJICAgICAgYnJl YWs7CisJICAgIH0KKworCSAgaWYgKHVubGlrZWx5IChwdC0+Yml0cyA9PSAwKSkKKwkgICAgdiA9 IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJk ICgmcGJhY2ssIHBmc2UsICZ2YWwsICZiaXRzKSkKKwkJcmV0dXJuIDA7CisKKwkgICAgICBiaXRz IC09IHB0LT5iaXRzOworCSAgICAgIHYgPSAodmFsID4+IGJpdHMpICYgKCgodWludDY0X3QpMSA8 PCBwdC0+Yml0cykgLSAxKTsKKwkgICAgfQorCisJICBzdGF0ZTEgPSBwdC0+YmFzZSArIHY7CisK KwkgIGlmICh1bmxpa2VseSAoY291bnQgPj0gMjU1KSkKKwkgICAgeworCSAgICAgIGVsZl91bmNv bXByZXNzX2ZhaWxlZCAoKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCisJICB3ZWlnaHRz W2NvdW50XSA9IHB0LT5zeW1ib2w7CisJICArK2NvdW50OworCisJICBwdCA9ICZmc2VfdGFibGVb c3RhdGUyXTsKKworCSAgaWYgKHVubGlrZWx5IChwaW4gPCBwaW5lbmQgJiYgYml0cyA8IHB0LT5i aXRzKSkKKwkgICAgeworCSAgICAgIGlmICh1bmxpa2VseSAoY291bnQgPj0gMjU0KSkKKwkJewor CQkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJICByZXR1cm4gMDsKKwkJfQorCSAgICAg IHdlaWdodHNbY291bnRdID0gKHVuc2lnbmVkIGNoYXIpIHB0LT5zeW1ib2w7CisJICAgICAgd2Vp Z2h0c1tjb3VudCArIDFdID0gKHVuc2lnbmVkIGNoYXIpIGZzZV90YWJsZVtzdGF0ZTFdLnN5bWJv bDsKKwkgICAgICBjb3VudCArPSAyOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmICh1 bmxpa2VseSAocHQtPmJpdHMgPT0gMCkpCisJICAgIHYgPSAwOworCSAgZWxzZQorCSAgICB7CisJ ICAgICAgaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNrLCBwZnNlLCAmdmFsLCAm Yml0cykpCisJCXJldHVybiAwOworCisJICAgICAgYml0cyAtPSBwdC0+Yml0czsKKwkgICAgICB2 ID0gKHZhbCA+PiBiaXRzKSAmICgoKHVpbnQ2NF90KTEgPDwgcHQtPmJpdHMpIC0gMSk7CisJICAg IH0KKworCSAgc3RhdGUyID0gcHQtPmJhc2UgKyB2OworCisJICBpZiAodW5saWtlbHkgKGNvdW50 ID49IDI1NSkpCisJICAgIHsKKwkgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJICAg ICAgcmV0dXJuIDA7CisJICAgIH0KKworCSAgd2VpZ2h0c1tjb3VudF0gPSBwdC0+c3ltYm9sOwor CSAgKytjb3VudDsKKwl9CisKKyAgICAgIHBpbiArPSBoZHI7CisgICAgfQorICBlbHNlCisgICAg eworICAgICAgLyogVGFibGUgaXMgbm90IGNvbXByZXNzZWQuICBFYWNoIHdlaWdodCBpcyA0IGJp dHMuICAqLworCisgICAgICBjb3VudCA9IGhkciAtIDEyNzsKKyAgICAgIGlmICh1bmxpa2VseSAo cGluICsgKChjb3VudCArIDEpIC8gMikgPj0gcGluZW5kKSkKKwl7CisJICBlbGZfdW5jb21wcmVz c19mYWlsZWQgKCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291 bnQ7IGkgKz0gMikKKwl7CisJICB1bnNpZ25lZCBjaGFyIGI7CisKKwkgIGIgPSAqcGluOworCSAg KytwaW47CisJICB3ZWlnaHRzW2ldID0gYiA+PiA0OworCSAgd2VpZ2h0c1tpICsgMV0gPSBiICYg MHhmOworCX0KKyAgICB9CisKKyAgd2VpZ2h0X21hcmsgPSAodWludDMyX3QgKikgKHdlaWdodHMg KyAyNTYpOworICBtZW1zZXQgKHdlaWdodF9tYXJrLCAwLCAxMiAqIHNpemVvZiAodWludDMyX3Qp KTsKKyAgd2VpZ2h0X21hc2sgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAg ICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHc7CisKKyAgICAgIHcgPSB3ZWlnaHRzW2ldOworICAg ICAgaWYgKHVubGlrZWx5ICh3ID4gMTIpKQorCXsKKwkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAo KTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgICsrd2VpZ2h0X21hcmtbd107CisgICAgICBpZiAo dyA+IDApCisJd2VpZ2h0X21hc2sgKz0gMVUgPDwgKHcgLSAxKTsKKyAgICB9CisgIGlmICh1bmxp a2VseSAod2VpZ2h0X21hc2sgPT0gMCkpCisgICAgeworICAgICAgZWxmX3VuY29tcHJlc3NfZmFp bGVkICgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHRhYmxlX2JpdHMgPSAzMiAtIF9f YnVpbHRpbl9jbHogKHdlaWdodF9tYXNrKTsKKyAgaWYgKHVubGlrZWx5ICh0YWJsZV9iaXRzID4g MTEpKQorICAgIHsKKyAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJldHVy biAwOworICAgIH0KKworICAvKiBXb3JrIG91dCB0aGUgbGFzdCB3ZWlnaHQgdmFsdWUsIHdoaWNo IGlzIG9taXR0ZWQgYmVjYXVzZSB0aGUgd2VpZ2h0cyBtdXN0CisgICAgIHN1bSB0byBhIHBvd2Vy IG9mIHR3by4gICovCisgIHsKKyAgICB1aW50MzJfdCBsZWZ0OworICAgIHVpbnQzMl90IGhpZ2hf Yml0OworCisgICAgbGVmdCA9ICgodWludDMyX3QpMSA8PCB0YWJsZV9iaXRzKSAtIHdlaWdodF9t YXNrOworICAgIGlmIChsZWZ0ID09IDApCisgICAgICB7CisJZWxmX3VuY29tcHJlc3NfZmFpbGVk ICgpOworCXJldHVybiAwOworICAgICAgfQorICAgIGhpZ2hfYml0ID0gMzEgLSBfX2J1aWx0aW5f Y2x6IChsZWZ0KTsKKyAgICBpZiAoKCh1aW50MzJfdCkxIDw8IGhpZ2hfYml0KSAhPSBsZWZ0KQor ICAgICAgeworCWVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0K KworICAgIGlmICh1bmxpa2VseSAoY291bnQgPj0gMjU2KSkKKyAgICAgIHsKKwllbGZfdW5jb21w cmVzc19mYWlsZWQgKCk7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICB3ZWlnaHRzW2NvdW50 XSA9IGhpZ2hfYml0ICsgMTsKKyAgICArK2NvdW50OworICAgICsrd2VpZ2h0X21hcmtbaGlnaF9i aXQgKyAxXTsKKyAgfQorCisgIGlmICh3ZWlnaHRfbWFya1sxXSA8IDIgfHwgKHdlaWdodF9tYXJr WzFdICYgMSkgIT0gMCkKKyAgICB7CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Cisg ICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogQ2hhbmdlIFdFSUdIVF9NQVJLIGZyb20gYSBj b3VudCBvZiB3ZWlnaHRzIHRvIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QKKyAgICAgc3ltYm9sIGZv ciB0aGF0IHdlaWdodC4gIFdlIHNoaWZ0IHRoZSBpbmRleGVzIHRvIGFsc28gc3RvcmUgaG93IG1h bnkgd2UKKyAgICAgaGFlIHNlZW4gc28gZmFyLCBiZWxvdy4gICovCisgIHsKKyAgICB1aW50MzJf dCBuZXh0OworCisgICAgbmV4dCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlX2JpdHM7 ICsraSkKKyAgICAgIHsKKwl1aW50MzJfdCBjdXI7CisKKwljdXIgPSBuZXh0OworCW5leHQgKz0g d2VpZ2h0X21hcmtbaSArIDFdIDw8IGk7CisJd2VpZ2h0X21hcmtbaSArIDFdID0gY3VyOworICAg ICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgeworICAgICAg dW5zaWduZWQgY2hhciB3ZWlnaHQ7CisgICAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgICB1aW50 MTZfdCB0dmFsOworICAgICAgc2l6ZV90IHN0YXJ0OworICAgICAgdWludDMyX3QgajsKKworICAg ICAgd2VpZ2h0ID0gd2VpZ2h0c1tpXTsKKyAgICAgIGlmICh3ZWlnaHQgPT0gMCkKKwljb250aW51 ZTsKKworICAgICAgbGVuZ3RoID0gMVUgPDwgKHdlaWdodCAtIDEpOworICAgICAgdHZhbCA9IChp IDw8IDgpIHwgKHRhYmxlX2JpdHMgKyAxIC0gd2VpZ2h0KTsKKyAgICAgIHN0YXJ0ID0gd2VpZ2h0 X21hcmtbd2VpZ2h0XTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7ICsraikKKwl0YWJs ZVtzdGFydCArIGpdID0gdHZhbDsKKyAgICAgIHdlaWdodF9tYXJrW3dlaWdodF0gKz0gbGVuZ3Ro OworICAgIH0KKworICAqcHBpbiA9IHBpbjsKKyAgKnB0YWJsZV9iaXRzID0gKGludCl0YWJsZV9i aXRzOworCisgIHJldHVybiAxOworfQorCisvKiBUaGUgaW5mb3JtYXRpb24gdXNlZCB0byBkZWNv bXByZXNzIGEgc2VxdWVuY2UgY29kZSwgd2hpY2ggY2FuIGJlIGEgbGl0ZXJhbAorICAgbGVuZ3Ro LCBhbiBvZmZzZXQsIG9yIGEgbWF0Y2ggbGVuZ3RoLiAgKi8KKworc3RydWN0IGVsZl96c3RkX3Nl cV9kZWNvZGUKK3sKKyAgY29uc3Qgc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeSAqdGFibGU7Cisg IGludCB0YWJsZV9iaXRzOworICBpbnQgdXNlX3JsZTsKKyAgdW5zaWduZWQgY2hhciBybGU7Cit9 OworCisvKiBVbnBhY2sgYSBzZXF1ZW5jZSBjb2RlIGNvbXByZXNzaW9uIG1vZGUuICAqLworCitz dGF0aWMgaW50CitlbGZfenN0ZF91bnBhY2tfc2VxX2RlY29kZSAoaW50IG1vZGUsCisJCQkgICAg Y29uc3QgdW5zaWduZWQgY2hhciAqKnBwaW4sCisJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAq cGluZW5kLAorCQkJICAgIGNvbnN0IHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgKnByZWRlZmlu ZWQsCisJCQkgICAgaW50IHByZWRlZmluZWRfYml0cywgdWludDE2X3QgKnNjcmF0Y2gsCisJCQkg ICAgaW50IG1heGlkeCwgc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeSAqZnNlX3RhYmxlLAorCQkJ ICAgIGludCBmc2VfdGFibGVfYml0cywKKwkJCSAgICBzdHJ1Y3QgZWxmX3pzdGRfc2VxX2RlY29k ZSAqZGVjb2RlKQoreworICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAg IGRlY29kZS0+dGFibGUgPSBwcmVkZWZpbmVkOworICAgICAgZGVjb2RlLT50YWJsZV9iaXRzID0g cHJlZGVmaW5lZF9iaXRzOworICAgICAgZGVjb2RlLT51c2VfcmxlID0gMDsKKyAgICAgIGJyZWFr OworCisgICAgY2FzZSAxOgorICAgICAgaWYgKHVubGlrZWx5ICgqcHBpbiA+PSBwaW5lbmQpKQor CXsKKwkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAg IGRlY29kZS0+dXNlX3JsZSA9IDE7CisgICAgICBkZWNvZGUtPnJsZSA9ICoqcHBpbjsKKyAgICAg IGRlY29kZS0+dGFibGVfYml0cyA9IDA7CisgICAgICArKypwcGluOworICAgICAgYnJlYWs7CisK KyAgICBjYXNlIDI6CisgICAgICBkZWNvZGUtPnRhYmxlX2JpdHMgPSBmc2VfdGFibGVfYml0czsK KyAgICAgIGlmICghZWxmX3pzdGRfcmVhZF9mc2UgKHBwaW4sIHBpbmVuZCwgc2NyYXRjaCwgbWF4 aWR4LCBmc2VfdGFibGUsCisJCQkgICAgICAmZGVjb2RlLT50YWJsZV9iaXRzKSkKKwlyZXR1cm4g MDsKKyAgICAgIGRlY29kZS0+dGFibGUgPSBmc2VfdGFibGU7CisgICAgICBkZWNvZGUtPnVzZV9y bGUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICBpZiAodW5saWtlbHkg KGRlY29kZS0+dGFibGVfYml0cyA9PSAwICYmICFkZWNvZGUtPnVzZV9ybGUpKQorCXsKKwkgIGVs Zl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGJyZWFrOwor CisgICAgZGVmYXVsdDoKKyAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJl dHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworLyogVGhlIGRpZmZlcmVudCB3YXlz IHRoYXQgdGhlIGxpdGVyYWxzIGFyZSBlbmNvZGVkLiAgKi8KKworI2RlZmluZSBaU1REX0xJVF9S QVcgKDApCisjZGVmaW5lIFpTVERfTElUX1JMRSAoMSkKKyNkZWZpbmUgWlNURF9MSVRfSFVGRiAo MikKKworLyogQSBzdHJ1Y3QgdXNlZCB0byBkZWNvbXByZXNzIHRoZSBsaXRlcmFscy4gIFRoZSBv cmRlciBvZiB0aGVzZSBmaWVsZHMgaXMKKyAgIGNob3NlbiBmb3IgcGFja2luZywgbm90IGZvciBj b21wcmVoZW5zaWJpbGl0eS4gICovCisKK3N0cnVjdCBlbGZfenN0ZF9saXRlcmFscworeworICAv KiBDdXJyZW50IGJpdHMgaW4gSHVmZm1hbiBlbmNvZGVkIHN0cmVhbS4gICovCisgIHVpbnQ2NF90 IHZhbDsKKworICAvKiBGb3IgUkFXLCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBz dHJlYW0uCisgICAgIEZvciBSTEUsIGEgcG9pbnRlciB0byB0aGUgYnl0ZSBiZWluZyByZXBlYXRl ZC4KKyAgICAgRm9yIEhVRkYsIHN0YXJ0IG9mIGVuY29kZWQgc3RyZWFtcy4KKyAgKi8KKyAgY29u c3QgdW5zaWduZWQgY2hhciAqcGxpdDsKKworICAvKiBDdXJyZW50IHBvc2l0aW9uIG9mIGN1cnJl bnQgSHVmZm1hbiBlbmNvZGVkIHN0cmVhbS4gICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBi YWNrOworCisgIC8qIEVuZCAocmVhZGluZyBiYWNrd2FyZCkgb2YgY3VycmVudCBIdWZmbWFuIGVu Y29kZWQgc3RyZWFtLiAgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcGJhY2tlbmQ7CisKKyAg LyogVGhlIEh1ZmZtYW4gdGFibGUuICAqLworICBjb25zdCB1aW50MTZfdCAqaHVmZm1hbl90YWJs ZTsKKworICAvKiBSZW1haW5pbmcgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcy4gICovCisg IHVpbnQzMl90IHJlZ2VuZXJhdGVkX3NpemU7CisKKyAgLyogQ3VycmVudCBudW1iZXIgb2YgYXZh aWxhYmxlIGJpdHMgaW4gSHVmZm1hbiBlbmNvZGVkIHN0cmVhbS4gICovCisgIHVuc2lnbmVkIGlu dCBiaXRzOworCisgIC8qIE51bWJlciBvZiBiaXRzIGluIHRoZSBIdWZmbWFuIHRhYmxlLiAgKi8K KyAgaW50IGh1ZmZtYW5fdGFibGVfYml0czsKKworICAvKiBPZmZzZXRzIGZyb20gUExJVCB0byBu ZXh0IEh1ZmZtYW4gZW5jb2RlZCBzdHJlYW1zLCAwIGlmIG5vbmUuICAqLworICB1aW50MzJfdCBz dHJlYW1fb2ZmWzNdOworCisgIC8qIFNpemVzIG9mIG5leHQgSHVmZm1hbiBlbmNvZGVkIHN0cmVh bXMsIDAgaWYgbm9uZS4gICovCisgIHVpbnQzMl90IHN0cmVhbV9zaXplWzNdOworCisgIC8qIEEg WlNURF9MSVRfKiBjb2RlLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0eXBlOworfTsKKworLyogT3V0 cHV0IENPVU5UIGJ5dGVzIGZyb20gdGhlIGxpdGVyYWwgYnl0ZSBzdHJlYW0gaW4gTElURVJBTFMg dG8gUE9VVC4gICovCisKK3N0YXRpYyBpbnQKK2VsZl96c3RkX2xpdGVyYWxfb3V0cHV0IChzdHJ1 Y3QgZWxmX3pzdGRfbGl0ZXJhbHMgKmxpdGVyYWxzLAorCQkJIHNpemVfdCBjb3VudCwKKwkJCSB1 bnNpZ25lZCBjaGFyICpwb3V0KQoreworICBzaXplX3QgaTsKKyAgY29uc3QgdW5zaWduZWQgY2hh ciAqcGJhY2s7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBiYWNrZW5kOworICB1aW50NjRfdCB2 YWw7CisgIHVuc2lnbmVkIGludCBiaXRzOworICBjb25zdCB1aW50MTZfdCAqaHVmZm1hbl90YWJs ZTsKKyAgdW5zaWduZWQgaW50IGh1ZmZtYW5fdGFibGVfYml0czsKKyAgdWludDY0X3QgaHVmZm1h bl9tYXNrOworCisgIGlmIChsaXRlcmFscy0+cmVnZW5lcmF0ZWRfc2l6ZSA8IGNvdW50KQorICAg IHsKKyAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJldHVybiAwOworICAg IH0KKyAgbGl0ZXJhbHMtPnJlZ2VuZXJhdGVkX3NpemUgLT0gY291bnQ7CisKKyAgc3dpdGNoIChs aXRlcmFscy0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBaU1REX0xJVF9SQVc6CisgICAgICBtZW1j cHkgKHBvdXQsIGxpdGVyYWxzLT5wbGl0LCBjb3VudCk7CisgICAgICBsaXRlcmFscy0+cGxpdCAr PSBjb3VudDsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBaU1REX0xJVF9STEU6CisgICAg ICBtZW1zZXQgKHBvdXQsICpsaXRlcmFscy0+cGxpdCwgY291bnQpOworICAgICAgcmV0dXJuIDE7 CisKKyAgICBjYXNlIFpTVERfTElUX0hVRkY6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6 CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9 CisKKyAgLyogVGhlIGxpdGVyYWwgc3RyaW5nIGlzIEh1ZmZtYW4gZW5jb2RlZC4gICovCisKKyAg cGJhY2sgPSBsaXRlcmFscy0+cGJhY2s7CisgIHBiYWNrZW5kID0gbGl0ZXJhbHMtPnBiYWNrZW5k OworICB2YWwgPSBsaXRlcmFscy0+dmFsOworICBiaXRzID0gbGl0ZXJhbHMtPmJpdHM7CisKKyAg aHVmZm1hbl90YWJsZSA9IGxpdGVyYWxzLT5odWZmbWFuX3RhYmxlOworICBodWZmbWFuX3RhYmxl X2JpdHMgPSBsaXRlcmFscy0+aHVmZm1hbl90YWJsZV9iaXRzOworICBodWZmbWFuX21hc2sgPSAo KHVpbnQ2NF90KTEgPDwgaHVmZm1hbl90YWJsZV9iaXRzKSAtIDE7CisKKyAgLyogVGhpcyBpcyBv bmUgb2YgdGhlIGlubmVyIGxvb3BzIG9mIHRoZSBkZWNvbXByZXNzaW9uIGFsZ29yaXRobSwgc28g d2UgcHV0CisgICAgIHNvbWUgZWZmb3J0IGludG8gb3B0aW1pemF0aW9uLiAgV2UgY2FuJ3QgZ2V0 IG1vcmUgdGhhbiA2NCBieXRlcyBmcm9tIGEKKyAgICAgc2luZ2xlIGNhbGwgdG8gZWxmX2ZldGNo X2JpdHNfYmFja3dhcmQsIGFuZCB3ZSBjYW4ndCBzdWJ0cmFjdCBtb3JlIHRoYW4gMTEKKyAgICAg Yml0cyBhdCBhIHRpbWUuICAqLworCisgIGlmIChjb3VudCA+PSA2NCkKKyAgICB7CisgICAgICB1 bnNpZ25lZCBjaGFyICpwb3V0c3RhcnQ7CisgICAgICB1bnNpZ25lZCBjaGFyICpwb3V0c3RvcDsK KworICAgICAgcG91dHN0YXJ0ID0gcG91dDsKKyAgICAgIHBvdXRzdG9wID0gcG91dCArIGNvdW50 IC0gNjQ7CisgICAgICB3aGlsZSAocG91dCA8PSBwb3V0c3RvcCkKKwl7CisJICB1aW50MTZfdCB0 OworCisJICBpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ssIHBiYWNrZW5kLCAm dmFsLCAmYml0cykpCisJICAgIHJldHVybiAwOworCisJICBpZiAoYml0cyA8IDE2KQorCSAgICBi cmVhazsKKworCSAgd2hpbGUgKGJpdHMgPj0gMzMpCisJICAgIHsKKwkgICAgICB0ID0gaHVmZm1h bl90YWJsZVsodmFsID4+IChiaXRzIC0gaHVmZm1hbl90YWJsZV9iaXRzKSkKKwkJCQkmIGh1ZmZt YW5fbWFza107CisJICAgICAgKnBvdXQgPSB0ID4+IDg7CisJICAgICAgKytwb3V0OworCSAgICAg IGJpdHMgLT0gdCAmIDB4ZmY7CisKKwkgICAgICB0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+IChi aXRzIC0gaHVmZm1hbl90YWJsZV9iaXRzKSkKKwkJCQkmIGh1ZmZtYW5fbWFza107CisJICAgICAg KnBvdXQgPSB0ID4+IDg7CisJICAgICAgKytwb3V0OworCSAgICAgIGJpdHMgLT0gdCAmIDB4ZmY7 CisKKwkgICAgICB0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+IChiaXRzIC0gaHVmZm1hbl90YWJs ZV9iaXRzKSkKKwkJCQkmIGh1ZmZtYW5fbWFza107CisJICAgICAgKnBvdXQgPSB0ID4+IDg7CisJ ICAgICAgKytwb3V0OworCSAgICAgIGJpdHMgLT0gdCAmIDB4ZmY7CisJICAgIH0KKworCSAgd2hp bGUgKGJpdHMgPiAxMSkKKwkgICAgeworCSAgICAgIHQgPSBodWZmbWFuX3RhYmxlWyh2YWwgPj4g KGJpdHMgLSBodWZmbWFuX3RhYmxlX2JpdHMpKQorCQkJCSYgaHVmZm1hbl9tYXNrXTsKKwkgICAg ICAqcG91dCA9IHQgPj4gODsKKwkgICAgICArK3BvdXQ7CisJICAgICAgYml0cyAtPSB0ICYgMHhm ZjsKKwkgICAgfQorCX0KKworICAgICAgY291bnQgLT0gcG91dCAtIHBvdXRzdGFydDsKKworICAg ICAgaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNrLCBwYmFja2VuZCwgJnZhbCwg JmJpdHMpKQorCXJldHVybiAwOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsr aSkKKyAgICB7CisgICAgICB1aW50MTZfdCB0OworCisgICAgICBpZiAodW5saWtlbHkgKGJpdHMg PT0gMCkpCisJeworCSAgdW5zaWduZWQgY2hhciBzdHJlYW1fc3RhcnQ7CisKKwkgIC8qIEFkdmFu Y2UgdG8gbmV4dCBzdHJlYW0uICAqLworCSAgaWYgKHVubGlrZWx5IChsaXRlcmFscy0+c3RyZWFt X29mZlswXSA9PSAwKSkKKwkgICAgeworCSAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsK KwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCisJICBwYmFjayA9IGxpdGVyYWxzLT5wbGl0ICsg bGl0ZXJhbHMtPnN0cmVhbV9vZmZbMF07CisJICBwYmFja2VuZCA9IHBiYWNrOworCSAgcGJhY2sg Kz0gbGl0ZXJhbHMtPnN0cmVhbV9zaXplWzBdOworCisJICAvKiBBbGlnbiB0byBhIDMyLWJpdCBi b3VuZGFyeS4gICovCisJICB2YWwgPSAwOworCSAgYml0cyA9IDA7CisJICAtLXBiYWNrOworCSAg c3RyZWFtX3N0YXJ0ID0gKnBiYWNrOworCSAgaWYgKHVubGlrZWx5IChzdHJlYW1fc3RhcnQgPT0g MCkpCisJICAgIHsKKwkgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJICAgICAgcmV0 dXJuIDA7CisJICAgIH0KKwkgIHdoaWxlICgoKCh1aW50cHRyX3QpIHBiYWNrKSAmIDMpICE9IDAp CisJICAgIHsKKwkgICAgICB2YWwgPDw9IDg7CisJICAgICAgdmFsIHw9ICh1aW50NjRfdCkqcGJh Y2s7CisJICAgICAgYml0cyArPSA4OworCSAgICAgIC0tcGJhY2s7CisJICAgIH0KKwkgIHZhbCA8 PD0gODsKKwkgIHZhbCB8PSAodWludDY0X3QpKnBiYWNrOworCSAgYml0cyArPSA4OworCisJICBp ZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ssIHBiYWNrZW5kLCAmdmFsLCAmYml0 cykpCisJICAgIHJldHVybiAwOworCisJICBiaXRzIC09IF9fYnVpbHRpbl9jbHogKHN0cmVhbV9z dGFydCkgLSAyNCArIDE7CisKKwkgIGxpdGVyYWxzLT5zdHJlYW1fb2ZmWzBdID0gbGl0ZXJhbHMt PnN0cmVhbV9vZmZbMV07CisJICBsaXRlcmFscy0+c3RyZWFtX29mZlsxXSA9IGxpdGVyYWxzLT5z dHJlYW1fb2ZmWzJdOworCSAgbGl0ZXJhbHMtPnN0cmVhbV9vZmZbMl0gPSAwOworCSAgbGl0ZXJh bHMtPnN0cmVhbV9zaXplWzBdID0gbGl0ZXJhbHMtPnN0cmVhbV9zaXplWzFdOworCSAgbGl0ZXJh bHMtPnN0cmVhbV9zaXplWzFdID0gbGl0ZXJhbHMtPnN0cmVhbV9zaXplWzJdOworCSAgbGl0ZXJh bHMtPnN0cmVhbV9zaXplWzJdID0gMDsKKwl9CisKKyAgICAgIGlmICghZWxmX2ZldGNoX2JpdHNf YmFja3dhcmQgKCZwYmFjaywgcGJhY2tlbmQsICZ2YWwsICZiaXRzKSkKKwlyZXR1cm4gMDsKKwor ICAgICAgaWYgKHVubGlrZWx5IChiaXRzIDwgaHVmZm1hbl90YWJsZV9iaXRzKSkKKwl7CisJICB0 ID0gaHVmZm1hbl90YWJsZVsodmFsIDw8IChodWZmbWFuX3RhYmxlX2JpdHMgLSBiaXRzKSkKKwkJ CSAgICAmIGh1ZmZtYW5fbWFza107CisJICBpZiAodW5saWtlbHkgKGJpdHMgPCAodCAmIDB4ZmYp KSkKKwkgICAgeworCSAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgICAgICByZXR1 cm4gMDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+ IChiaXRzIC0gaHVmZm1hbl90YWJsZV9iaXRzKSkgJiBodWZmbWFuX21hc2tdOworCisgICAgICAq cG91dCA9IHQgPj4gODsKKyAgICAgICsrcG91dDsKKworICAgICAgYml0cyAtPSB0ICYgMHhmZjsK KyAgICB9CisKKyAgbGl0ZXJhbHMtPnBiYWNrID0gcGJhY2s7CisgIGxpdGVyYWxzLT5wYmFja2Vu ZCA9IHBiYWNrZW5kOworICBsaXRlcmFscy0+dmFsID0gdmFsOworICBsaXRlcmFscy0+Yml0cyA9 IGJpdHM7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEdpdmVuIGEgbGl0ZXJhbCBsZW5ndGggY29k ZSwgd2UgbmVlZCB0byByZWFkIGEgbnVtYmVyIG9mIGJpdHMgYW5kIGFkZCB0aGF0CisgICB0byBh IGJhc2VsaW5lLiAgRm9yIHN0YXRlcyAwIHRvIDE1IHRoZSBiYXNlbGluZSBpcyB0aGUgc3RhdGUg YW5kIHRoZSBudW1iZXIKKyAgIG9mIGJpdHMgaXMgemVyby4gICovCisKKyNkZWZpbmUgWlNURF9M SVRFUkFMX0xFTkdUSF9CQVNFTElORV9PRkZTRVQgKDE2KQorCitzdGF0aWMgY29uc3QgdWludDMy X3QgZWxmX3pzdGRfbGl0ZXJhbF9sZW5ndGhfYmFzZWxpbmVbXSA9Cit7CisgIDE2LCAxOCwgMjAs IDIyLCAyNCwgMjgsIDMyLCA0MCwgNDgsIDY0LCAxMjgsIDI1NiwgNTEyLAorICAxMDI0LCAyMDQ4 LCA0MDk2LCA4MTkyLCAxNjM4NCwgMzI3NjgsIDY1NTM2Cit9OworCitzdGF0aWMgY29uc3QgdW5z aWduZWQgY2hhciBlbGZfenN0ZF9saXRlcmFsX2xlbmd0aF9iaXRzW10gPQoreworICAxLCAxLCAx LCAxLCAyLCAyLCAzLCAzLCA0LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAx NgorfTsKKworLyogVGhlIHNhbWUgYXBwbGllcyB0byBtYXRjaCBsZW5ndGggY29kZXMuICBGb3Ig c3RhdGVzIDAgdG8gMzEgdGhlIGJhc2VsaW5lIGlzCisgICB0aGUgc3RhdGUgKyAzIGFuZCB0aGUg bnVtYmVyIG9mIGJpdHMgaXMgemVyby4gICovCisKKyNkZWZpbmUgWlNURF9NQVRDSF9MRU5HVEhf QkFTRUxJTkVfT0ZGU0VUICgzMikKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGVsZl96c3RkX21h dGNoX2xlbmd0aF9iYXNlbGluZVtdID0KK3sKKyAgMzUsIDM3LCAzOSwgNDEsIDQzLCA0NywgNTEs IDU5LCA2NywgODMsIDk5LCAxMzEsIDI1OSwgNTE1LAorICAxMDI3LCAyMDUxLCA0MDk5LCA4MTk1 LCAxNjM4NywgMzI3NzEsIDY1NTM5Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBl bGZfenN0ZF9tYXRjaF9sZW5ndGhfYml0c1tdID0KK3sKKyAgMSwgMSwgMSwgMSwgMiwgMiwgMywg MywgNCwgNCwgNSwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYKK307CisKKy8q IERlY29tcHJlc3MgYSB6c3RkIHN0cmVhbSBmcm9tIFBJTi9TSU4gdG8gUE9VVC9TT1VULiAgQ29k ZSBiYXNlZCBvbiBSRkMgODg3OC4KKyAgIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3Iu ICAqLworCitzdGF0aWMgaW50CitlbGZfenN0ZF9kZWNvbXByZXNzIChjb25zdCB1bnNpZ25lZCBj aGFyICpwaW4sIHNpemVfdCBzaW4sCisJCSAgICAgdW5zaWduZWQgY2hhciAqemRlYnVnX3RhYmxl LCB1bnNpZ25lZCBjaGFyICpwb3V0LAorCQkgICAgIHNpemVfdCBzb3V0KQoreworICBjb25zdCB1 bnNpZ25lZCBjaGFyICpwaW5lbmQ7CisgIHVuc2lnbmVkIGNoYXIgKnBvdXRzdGFydDsKKyAgdW5z aWduZWQgY2hhciAqcG91dGVuZDsKKyAgc3RydWN0IGVsZl96c3RkX3NlcV9kZWNvZGUgbGl0ZXJh bF9kZWNvZGU7CisgIHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgKmxpdGVyYWxfZnNlX3RhYmxl OworICBzdHJ1Y3QgZWxmX3pzdGRfc2VxX2RlY29kZSBtYXRjaF9kZWNvZGU7CisgIHN0cnVjdCBl bGZfenN0ZF9mc2VfZW50cnkgKm1hdGNoX2ZzZV90YWJsZTsKKyAgc3RydWN0IGVsZl96c3RkX3Nl cV9kZWNvZGUgb2Zmc2V0X2RlY29kZTsKKyAgc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeSAqb2Zm c2V0X2ZzZV90YWJsZTsKKyAgdWludDE2X3QgKmh1ZmZtYW5fdGFibGU7CisgIGludCBodWZmbWFu X3RhYmxlX2JpdHM7CisgIHVpbnQzMl90IHJlcGVhdGVkX29mZnNldDE7CisgIHVpbnQzMl90IHJl cGVhdGVkX29mZnNldDI7CisgIHVpbnQzMl90IHJlcGVhdGVkX29mZnNldDM7CisgIHVpbnQxNl90 ICpzY3JhdGNoOworICB1bnNpZ25lZCBjaGFyIGhkcjsKKyAgaW50IGhhc19jaGVja3N1bTsKKyAg dWludDY0X3QgY29udGVudF9zaXplOworICBpbnQgbGFzdF9ibG9jazsKKworICBwaW5lbmQgPSBw aW4gKyBzaW47CisgIHBvdXRzdGFydCA9IHBvdXQ7CisgIHBvdXRlbmQgPSBwb3V0ICsgc291dDsK KworICBsaXRlcmFsX2RlY29kZS50YWJsZSA9IE5VTEw7CisgIGxpdGVyYWxfZGVjb2RlLnRhYmxl X2JpdHMgPSAwOworICBsaXRlcmFsX2RlY29kZS51c2VfcmxlID0gMDsKKyAgbGl0ZXJhbF9mc2Vf dGFibGUgPSAoKHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgKikKKwkJICAgICAgICh6ZGVidWdf dGFibGUgKyBaU1REX1RBQkxFX0xJVEVSQUxfRlNFX09GRlNFVCkpOworCisgIG1hdGNoX2RlY29k ZS50YWJsZSA9IE5VTEw7CisgIG1hdGNoX2RlY29kZS50YWJsZV9iaXRzID0gMDsKKyAgbWF0Y2hf ZGVjb2RlLnVzZV9ybGUgPSAwOworICBtYXRjaF9mc2VfdGFibGUgPSAoKHN0cnVjdCBlbGZfenN0 ZF9mc2VfZW50cnkgKikKKwkJICAgICAoemRlYnVnX3RhYmxlICsgWlNURF9UQUJMRV9NQVRDSF9G U0VfT0ZGU0VUKSk7CisKKyAgb2Zmc2V0X2RlY29kZS50YWJsZSA9IE5VTEw7CisgIG9mZnNldF9k ZWNvZGUudGFibGVfYml0cyA9IDA7CisgIG9mZnNldF9kZWNvZGUudXNlX3JsZSA9IDA7CisgIG9m ZnNldF9mc2VfdGFibGUgPSAoKHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgKikKKwkJICAgICAg KHpkZWJ1Z190YWJsZSArIFpTVERfVEFCTEVfT0ZGU0VUX0ZTRV9PRkZTRVQpKTsKKyAgaHVmZm1h bl90YWJsZSA9ICgodWludDE2X3QgKikKKwkJICAgKHpkZWJ1Z190YWJsZSArIFpTVERfVEFCTEVf SFVGRk1BTl9PRkZTRVQpKTsKKyAgaHVmZm1hbl90YWJsZV9iaXRzID0gMDsKKyAgc2NyYXRjaCA9 ICgodWludDE2X3QgKikKKwkgICAgICh6ZGVidWdfdGFibGUgKyBaU1REX1RBQkxFX1dPUktfT0ZG U0VUKSk7CisKKyAgcmVwZWF0ZWRfb2Zmc2V0MSA9IDE7CisgIHJlcGVhdGVkX29mZnNldDIgPSA0 OworICByZXBlYXRlZF9vZmZzZXQzID0gODsKKworICBpZiAodW5saWtlbHkgKHNpbiA8IDQpKQor ICAgIHsKKyAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJldHVybiAwOwor ICAgIH0KKworICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHRoZSB6c3RkIG1hZ2ljIG51bWJlci4gICov CisgIGlmICh1bmxpa2VseSAocGluWzBdICE9IDB4MjgKKwkJfHwgcGluWzFdICE9IDB4YjUKKwkJ fHwgcGluWzJdICE9IDB4MmYKKwkJfHwgcGluWzNdICE9IDB4ZmQpKQorICAgIHsKKyAgICAgIGVs Zl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBwaW4g Kz0gNDsKKworICBpZiAodW5saWtlbHkgKHBpbiA+PSBwaW5lbmQpKQorICAgIHsKKyAgICAgIGVs Zl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBoZHIg PSAqcGluKys7CisKKyAgLyogV2UgZXhwZWN0IGEgc2luZ2xlIGZyYW1lLiAgKi8KKyAgaWYgKHVu bGlrZWx5ICgoaGRyICYgKDEgPDwgNSkpID09IDApKQorICAgIHsKKyAgICAgIGVsZl91bmNvbXBy ZXNzX2ZhaWxlZCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgLyogUmVzZXJ2ZWQgYml0 IG11c3QgYmUgemVyby4gICovCisgIGlmICh1bmxpa2VseSAoKGhkciAmICgxIDw8IDMpKSAhPSAw KSkKKyAgICB7CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAgICByZXR1cm4g MDsKKyAgICB9CisgIC8qIFdlIGRvIG5vdCBleHBlY3QgYSBkaWN0aW9uYXJ5LiAgKi8KKyAgaWYg KHVubGlrZWx5ICgoaGRyICYgMykgIT0gMCkpCisgICAgeworICAgICAgZWxmX3VuY29tcHJlc3Nf ZmFpbGVkICgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBoYXNfY2hlY2tzdW0gPSAoaGRy ICYgKDEgPDwgMikpICE9IDA7CisgIHN3aXRjaCAoaGRyID4+IDYpCisgICAgeworICAgIGNhc2Ug MDoKKyAgICAgIGlmICh1bmxpa2VseSAocGluID49IHBpbmVuZCkpCisJeworCSAgZWxmX3VuY29t cHJlc3NfZmFpbGVkICgpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgY29udGVudF9zaXplID0g KHVpbnQ2NF90KSAqcGluKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBpZiAo dW5saWtlbHkgKHBpbiArIDEgPj0gcGluZW5kKSkKKwl7CisJICBlbGZfdW5jb21wcmVzc19mYWls ZWQgKCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBjb250ZW50X3NpemUgPSAoKCh1aW50NjRf dCkgcGluWzBdKSB8ICgoKHVpbnQ2NF90KSBwaW5bMV0pIDw8IDgpKSArIDI1NjsKKyAgICAgIHBp biArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHVubGlrZWx5IChw aW4gKyAzID49IHBpbmVuZCkpCisJeworCSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCSAg cmV0dXJuIDA7CisJfQorICAgICAgY29udGVudF9zaXplID0gKCh1aW50NjRfdCkgcGluWzBdCisJ CSAgICAgIHwgKCgodWludDY0X3QpIHBpblsxXSkgPDwgOCkKKwkJICAgICAgfCAoKCh1aW50NjRf dCkgcGluWzJdKSA8PCAxNikKKwkJICAgICAgfCAoKCh1aW50NjRfdCkgcGluWzNdKSA8PCAyNCkp OworICAgICAgcGluICs9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBpZiAo dW5saWtlbHkgKHBpbiArIDcgPj0gcGluZW5kKSkKKwl7CisJICBlbGZfdW5jb21wcmVzc19mYWls ZWQgKCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBjb250ZW50X3NpemUgPSAoKHVpbnQ2NF90 KSBwaW5bMF0KKwkJICAgICAgfCAoKCh1aW50NjRfdCkgcGluWzFdKSA8PCA4KQorCQkgICAgICB8 ICgoKHVpbnQ2NF90KSBwaW5bMl0pIDw8IDE2KQorCQkgICAgICB8ICgoKHVpbnQ2NF90KSBwaW5b M10pIDw8IDI0KQorCQkgICAgICB8ICgoKHVpbnQ2NF90KSBwaW5bNF0pIDw8IDMyKQorCQkgICAg ICB8ICgoKHVpbnQ2NF90KSBwaW5bNV0pIDw8IDQwKQorCQkgICAgICB8ICgoKHVpbnQ2NF90KSBw aW5bNl0pIDw8IDQ4KQorCQkgICAgICB8ICgoKHVpbnQ2NF90KSBwaW5bN10pIDw8IDU2KSk7Cisg ICAgICBwaW4gKz0gODsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlbGZfdW5j b21wcmVzc19mYWlsZWQgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHVubGlr ZWx5IChjb250ZW50X3NpemUgIT0gKHNpemVfdCkgY29udGVudF9zaXplCisJCXx8IChzaXplX3Qp IGNvbnRlbnRfc2l6ZSAhPSBzb3V0KSkKKyAgICB7CisgICAgICBlbGZfdW5jb21wcmVzc19mYWls ZWQgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbGFzdF9ibG9jayA9IDA7CisgIHdo aWxlICghbGFzdF9ibG9jaykKKyAgICB7CisgICAgICB1aW50MzJfdCBibG9ja19oZHI7CisgICAg ICBpbnQgYmxvY2tfdHlwZTsKKyAgICAgIHVpbnQzMl90IGJsb2NrX3NpemU7CisKKyAgICAgIGlm ICh1bmxpa2VseSAocGluICsgMiA+PSBwaW5lbmQpKQorCXsKKwkgIGVsZl91bmNvbXByZXNzX2Zh aWxlZCAoKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGJsb2NrX2hkciA9ICgodWludDMyX3Qp IHBpblswXQorCQkgICB8ICgoKHVpbnQzMl90KSBwaW5bMV0pIDw8IDgpCisJCSAgIHwgKCgodWlu dDMyX3QpIHBpblsyXSkgPDwgMTYpKTsKKyAgICAgIHBpbiArPSAzOworCisgICAgICBsYXN0X2Js b2NrID0gYmxvY2tfaGRyICYgMTsKKyAgICAgIGJsb2NrX3R5cGUgPSAoYmxvY2tfaGRyID4+IDEp ICYgMzsKKyAgICAgIGJsb2NrX3NpemUgPSBibG9ja19oZHIgPj4gMzsKKworICAgICAgc3dpdGNo IChibG9ja190eXBlKQorCXsKKwljYXNlIDA6CisJICAvKiBSYXdfQmxvY2sgKi8KKwkgIGlmICh1 bmxpa2VseSAoKHNpemVfdCkgYmxvY2tfc2l6ZSA+IChzaXplX3QpIChwaW5lbmQgLSBwaW4pKSkK KwkgICAgeworCSAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgICAgICByZXR1cm4g MDsKKwkgICAgfQorCSAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSBibG9ja19zaXplID4gKHNpemVf dCkgKHBvdXRlbmQgLSBwb3V0KSkpCisJICAgIHsKKwkgICAgICBlbGZfdW5jb21wcmVzc19mYWls ZWQgKCk7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIG1lbWNweSAocG91dCwgcGluLCBi bG9ja19zaXplKTsKKwkgIHBvdXQgKz0gYmxvY2tfc2l6ZTsKKwkgIHBpbiArPSBibG9ja19zaXpl OworCSAgYnJlYWs7CisKKwljYXNlIDE6CisJICAvKiBSTEVfQmxvY2sgKi8KKwkgIGlmICh1bmxp a2VseSAocGluID49IHBpbmVuZCkpCisJICAgIHsKKwkgICAgICBlbGZfdW5jb21wcmVzc19mYWls ZWQgKCk7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIGlmICh1bmxpa2VseSAoKHNpemVf dCkgYmxvY2tfc2l6ZSA+IChzaXplX3QpIChwb3V0ZW5kIC0gcG91dCkpKQorCSAgICB7CisJICAg ICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJ ICBtZW1zZXQgKHBvdXQsICpwaW4sIGJsb2NrX3NpemUpOworCSAgcG91dCArPSBibG9ja19zaXpl OworCSAgcGluKys7CisJICBicmVhazsKKworCWNhc2UgMjoKKwkgIHsKKwkgICAgY29uc3QgdW5z aWduZWQgY2hhciAqcGJsb2NrZW5kOworCSAgICBzdHJ1Y3QgZWxmX3pzdGRfbGl0ZXJhbHMgbGl0 ZXJhbHM7CisJICAgIHVuc2lnbmVkIGNoYXIgbGl0X2hkcjsKKwkgICAgdWludDMyX3QgbGl0X3Nl Y3Rpb25fY29udGVudDsKKwkgICAgdWludDMyX3QgbGl0X2NvbXByZXNzZWRfc2l6ZTsKKwkgICAg dWludDMyX3QgbGl0X3RvdGFsX3N0cmVhbXNfc2l6ZTsKKwkgICAgY29uc3QgdW5zaWduZWQgY2hh ciAqcGxpdGVuZDsKKwkgICAgdW5zaWduZWQgY2hhciAqcGxpdGV4cDsKKwkgICAgc2l6ZV90IGxp dGV4cF9jb3VudDsKKwkgICAgaW50IGxpdF9zdHJlYW1zOworCSAgICB1aW50MzJfdCBzdHJlYW1f c2l6ZV8xOworCSAgICB1bnNpZ25lZCBjaGFyIHNlcV9oZHI7CisJICAgIHNpemVfdCBzZXFfY291 bnQ7CisJICAgIHNpemVfdCBzZXE7CisJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBiYWNrOwor CSAgICB1aW50NjRfdCB2YWw7CisJICAgIHVuc2lnbmVkIGludCBiaXRzOworCSAgICB1bnNpZ25l ZCBpbnQgbGl0ZXJhbF9zdGF0ZTsKKwkgICAgdW5zaWduZWQgaW50IG9mZnNldF9zdGF0ZTsKKwkg ICAgdW5zaWduZWQgaW50IG1hdGNoX3N0YXRlOworCSAgICB1bnNpZ25lZCBjaGFyIHN0cmVhbV9z dGFydDsKKworCSAgICAvKiBDb21wcmVzc2VkX0Jsb2NrICovCisJICAgIGlmICh1bmxpa2VseSAo KHNpemVfdCkgYmxvY2tfc2l6ZSA+IChzaXplX3QpIChwaW5lbmQgLSBwaW4pKSkKKwkgICAgICB7 CisJCWVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJcmV0dXJuIDA7CisJICAgICAgfQorCisJ ICAgIHBibG9ja2VuZCA9IHBpbiArIGJsb2NrX3NpemU7CisKKwkgICAgaWYgKHVubGlrZWx5IChw aW4gPj0gcGluZW5kKSkKKwkgICAgICB7CisJCWVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJ cmV0dXJuIDA7CisJICAgICAgfQorCSAgICBsaXRfaGRyID0gKnBpbjsKKwkgICAgKytwaW47CisK KwkgICAgaWYgKChsaXRfaGRyICYgMykgPT0gMCB8fCAobGl0X2hkciAmIDMpID09IDEpCisJICAg ICAgeworCQlpZiAoKGxpdF9oZHIgJiAzKSA9PSAwKQorCQkgIGxpdGVyYWxzLnR5cGUgPSBaU1RE X0xJVF9SQVc7CisJCWVsc2UKKwkJICBsaXRlcmFscy50eXBlID0gWlNURF9MSVRfUkxFOworCisJ CS8qIFJhd19saXRlcmFsc19CbG9jayBvciBSTEVfTGl0ZXJhbHNfQmxvY2sgKi8KKwkJc3dpdGNo ICgobGl0X2hkciA+PiAyKSAmIDMpCisJCSAgeworCQkgIGNhc2UgMDogY2FzZSAyOgorCQkgICAg bGl0ZXJhbHMucmVnZW5lcmF0ZWRfc2l6ZSA9IGxpdF9oZHIgPj4gMzsKKwkJICAgIGJyZWFrOwor CQkgIGNhc2UgMToKKwkJICAgIGlmICh1bmxpa2VseSAocGluID49IHBpbmVuZCkpCisJCSAgICAg IHsKKwkJCWVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJCXJldHVybiAwOworCQkgICAgICB9 CisJCSAgICBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplID0gKGxpdF9oZHIgPj4gNCkgKyAoKCpw aW4pIDw8IDQpOworCQkgICAgcGluKys7CisJCSAgICBicmVhazsKKwkJICBjYXNlIDM6CisJCSAg ICBpZiAodW5saWtlbHkgKHBpbiArIDEgPj0gcGluZW5kKSkKKwkJICAgICAgeworCQkJZWxmX3Vu Y29tcHJlc3NfZmFpbGVkICgpOworCQkJcmV0dXJuIDA7CisJCSAgICAgIH0KKwkJICAgIGxpdGVy YWxzLnJlZ2VuZXJhdGVkX3NpemUgPSAoKGxpdF9oZHIgPj4gNCkKKwkJCQkJCSArICgqcGluIDw8 IDQpCisJCQkJCQkgKyAocGluWzFdIDw8IDEyKSk7CisJCSAgICBwaW4gKz0gMjsKKwkJICAgIGJy ZWFrOworCQkgIGRlZmF1bHQ6CisJCSAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCSAg ICByZXR1cm4gMDsKKwkJICB9CisJCWlmIChsaXRlcmFscy50eXBlID09IFpTVERfTElUX1JBVykK KwkJICBsaXRfc2VjdGlvbl9jb250ZW50ID0gbGl0ZXJhbHMucmVnZW5lcmF0ZWRfc2l6ZTsKKwkJ ZWxzZQorCQkgIGxpdF9zZWN0aW9uX2NvbnRlbnQgPSAxOworCQlsaXRfY29tcHJlc3NlZF9zaXpl ID0gMDsKKwkJbGl0X3N0cmVhbXMgPSAxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsK KwkJLyogQ29tcHJlc3NlZF9MaXRlcmFsc19CbG9jayBvciBUcmVlbGVzc19MaXRlcmFsc19CbG9j ayAqLworCQlsaXRlcmFscy50eXBlID0gWlNURF9MSVRfSFVGRjsKKwkJc3dpdGNoICgobGl0X2hk ciA+PiAyKSAmIDMpCisJCSAgeworCQkgIGNhc2UgMDogY2FzZSAxOgorCQkgICAgaWYgKHVubGlr ZWx5IChwaW4gKyAxID49IHBpbmVuZCkpCisJCSAgICAgIHsKKwkJCWVsZl91bmNvbXByZXNzX2Zh aWxlZCAoKTsKKwkJCXJldHVybiAwOworCQkgICAgICB9CisJCSAgICBsaXRlcmFscy5yZWdlbmVy YXRlZF9zaXplID0gKChsaXRfaGRyID4+IDQpCisJCQkJCQkgfCAoKCpwaW4gJiAweDNmKSA8PCA0 KSk7CisJCSAgICBsaXRfY29tcHJlc3NlZF9zaXplID0gKCgqcGluID4+IDYpCisJCQkJCSAgIHwg KHBpblsxXSA8PCAyKSk7CisJCSAgICBwaW4gKz0gMjsKKwkJICAgIGxpdF9zdHJlYW1zID0gKChs aXRfaGRyID4+IDIpICYgMykgPT0gMCA/IDEgOiA0OworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAy OgorCQkgICAgaWYgKHVubGlrZWx5IChwaW4gKyAyID49IHBpbmVuZCkpCisJCSAgICAgIHsKKwkJ CWVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJCXJldHVybiAwOworCQkgICAgICB9CisJCSAg ICBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplID0gKChsaXRfaGRyID4+IDQpCisJCQkJCQkgfCAo KnBpbiA8PCA0KQorCQkJCQkJIHwgKChwaW5bMV0gJiAzKSA8PCAxMikpOworCQkgICAgbGl0X2Nv bXByZXNzZWRfc2l6ZSA9ICgocGluWzFdID4+IDIpCisJCQkJCSAgIHwgKHBpblsyXSA8PCA2KSk7 CisJCSAgICBwaW4gKz0gMzsKKwkJICAgIGxpdF9zdHJlYW1zID0gNDsKKwkJICAgIGJyZWFrOwor CQkgIGNhc2UgMzoKKwkJICAgIGlmICh1bmxpa2VseSAocGluICsgMyA+PSBwaW5lbmQpKQorCQkg ICAgICB7CisJCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCQlyZXR1cm4gMDsKKwkJICAg ICAgfQorCQkgICAgbGl0ZXJhbHMucmVnZW5lcmF0ZWRfc2l6ZSA9ICgobGl0X2hkciA+PiA0KQor CQkJCQkJIHwgKCpwaW4gPDwgNCkKKwkJCQkJCSB8ICgocGluWzFdICYgMHgzZikgPDwgMTIpKTsK KwkJICAgIGxpdF9jb21wcmVzc2VkX3NpemUgPSAoKHBpblsxXSA+PiA2KQorCQkJCQkgICB8IChw aW5bMl0gPDwgMikKKwkJCQkJICAgfCAocGluWzNdIDw8IDEwKSk7CisJCSAgICBwaW4gKz0gNDsK KwkJICAgIGxpdF9zdHJlYW1zID0gNDsKKwkJICAgIGJyZWFrOworCQkgIGRlZmF1bHQ6CisJCSAg ICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCSAgICByZXR1cm4gMDsKKwkJICB9CisKKwkJ bGl0X3NlY3Rpb25fY29udGVudCA9IGxpdF9jb21wcmVzc2VkX3NpemU7CisJICAgICAgfQorCisJ ICAgIGlmICh1bmxpa2VseSAoKHNpemVfdClsaXRfc2VjdGlvbl9jb250ZW50ID4gKHNpemVfdCko cGluZW5kIC0gcGluKSkpCisJICAgICAgeworCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJ CXJldHVybiAwOworCSAgICAgIH0KKwkgICAgcGxpdGVuZCA9IHBpbiArIGxpdF9zZWN0aW9uX2Nv bnRlbnQ7CisKKwkgICAgbGl0X3RvdGFsX3N0cmVhbXNfc2l6ZSA9IGxpdF9jb21wcmVzc2VkX3Np emU7CisJICAgIGlmICgobGl0X2hkciAmIDMpID09IDIpCisJICAgICAgeworCQkvKiBDb21wcmVz c2VkX0xpdGVyYWxzX0Jsb2NrLiAgUmVhZCBIdWZmbWFuIHRyZWUuICAqLworCisJCWNvbnN0IHVu c2lnbmVkIGNoYXIgKnB0YWJsZTsKKworCQlwdGFibGUgPSBwaW47CisJCWlmICghZWxmX3pzdGRf cmVhZF9odWZmICgmcHRhYmxlLCBwaW5lbmQsIHNjcmF0Y2gsCisJCQkJCSBodWZmbWFuX3RhYmxl LCAmaHVmZm1hbl90YWJsZV9iaXRzKSkKKwkJICByZXR1cm4gMDsKKwkJbGl0ZXJhbHMuaHVmZm1h bl90YWJsZSA9IGh1ZmZtYW5fdGFibGU7CisJCWxpdGVyYWxzLmh1ZmZtYW5fdGFibGVfYml0cyA9 IGh1ZmZtYW5fdGFibGVfYml0czsKKworCQlsaXRfdG90YWxfc3RyZWFtc19zaXplIC09IHB0YWJs ZSAtIHBpbjsKKwkJcGluID0gcHRhYmxlOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoKGxpdF9o ZHIgJiAzKSA9PSAzKQorCSAgICAgIHsKKwkJLyogVHJlZWxlc3NfTGl0ZXJhbHNfQmxvY2suICBS ZXVzZSBwcmV2aW91cyBIdWZmbWFuIHRyZWUuICAqLworCQlpZiAoaHVmZm1hbl90YWJsZV9iaXRz ID09IDApCisJCSAgeworCQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCQkgICAgcmV0 dXJuIDA7CisJCSAgfQorCQlsaXRlcmFscy5odWZmbWFuX3RhYmxlID0gaHVmZm1hbl90YWJsZTsK KwkJbGl0ZXJhbHMuaHVmZm1hbl90YWJsZV9iaXRzID0gaHVmZm1hbl90YWJsZV9iaXRzOworCSAg ICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbGl0ZXJhbHMuaHVmZm1hbl90YWJsZSA9IE5V TEw7CisJCWxpdGVyYWxzLmh1ZmZtYW5fdGFibGVfYml0cyA9IDA7CisJICAgICAgfQorCisJICAg IGlmIChsaXRfc3RyZWFtcyA9PSAxKQorCSAgICAgIHsKKwkJc3RyZWFtX3NpemVfMSA9IGJsb2Nr X3NpemU7CisJCWxpdGVyYWxzLnN0cmVhbV9vZmZbMF0gPSAwOworCQlsaXRlcmFscy5zdHJlYW1f b2ZmWzFdID0gMDsKKwkJbGl0ZXJhbHMuc3RyZWFtX29mZlsyXSA9IDA7CisJCWxpdGVyYWxzLnN0 cmVhbV9zaXplWzBdID0gMDsKKwkJbGl0ZXJhbHMuc3RyZWFtX3NpemVbMV0gPSAwOworCQlsaXRl cmFscy5zdHJlYW1fc2l6ZVsyXSA9IDA7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgewor CQl1aW50MzJfdCB0b3Q7CisKKwkJLyogUmVhZCBqdW1wIHRhYmxlLiAgKi8KKwkJaWYgKHVubGlr ZWx5IChwaW4gKyA1ID49IHBpbmVuZCkpCisJCSAgeworCQkgICAgZWxmX3VuY29tcHJlc3NfZmFp bGVkICgpOworCQkgICAgcmV0dXJuIDA7CisJCSAgfQorCQlzdHJlYW1fc2l6ZV8xID0gKnBpbiB8 IChwaW5bMV0gPDwgOCk7CisJCXBpbiArPSAyOworCQlsaXRlcmFscy5zdHJlYW1fc2l6ZVswXSA9 ICpwaW4gfCAocGluWzFdIDw8IDgpOworCQlwaW4gKz0gMjsKKwkJbGl0ZXJhbHMuc3RyZWFtX3Np emVbMV0gPSAqcGluIHwgKHBpblsxXSA8PCA4KTsKKwkJcGluICs9IDI7CisJCXRvdCA9IChzdHJl YW1fc2l6ZV8xCisJCSAgICAgICArIGxpdGVyYWxzLnN0cmVhbV9zaXplWzBdCisJCSAgICAgICAr IGxpdGVyYWxzLnN0cmVhbV9zaXplWzFdKTsKKwkJaWYgKHVubGlrZWx5ICh0b3QgPiBsaXRfdG90 YWxfc3RyZWFtc19zaXplIC0gNikpCisJCSAgeworCQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVk ICgpOworCQkgICAgcmV0dXJuIDA7CisJCSAgfQorCQlsaXRlcmFscy5zdHJlYW1fc2l6ZVsyXSA9 IGxpdF90b3RhbF9zdHJlYW1zX3NpemUgLSA2IC0gdG90OworCisJCWxpdGVyYWxzLnN0cmVhbV9v ZmZbMF0gPSBzdHJlYW1fc2l6ZV8xOworCQlsaXRlcmFscy5zdHJlYW1fb2ZmWzFdID0gKGxpdGVy YWxzLnN0cmVhbV9vZmZbMF0KKwkJCQkJICArIGxpdGVyYWxzLnN0cmVhbV9zaXplWzBdKTsKKwkJ bGl0ZXJhbHMuc3RyZWFtX29mZlsyXSA9IChsaXRlcmFscy5zdHJlYW1fb2ZmWzFdCisJCQkJCSAg KyBsaXRlcmFscy5zdHJlYW1fc2l6ZVsxXSk7CisJICAgICAgfQorCisJICAgIGxpdGVyYWxzLnBs aXQgPSBwaW47CisKKwkgICAgaWYgKGxpdGVyYWxzLnR5cGUgPT0gWlNURF9MSVRfSFVGRikKKwkg ICAgICB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBsYmFjazsKKworCQkvKiBTZXQgdXAgdGhl IGZpcnN0IGh1ZmZtYW4gc3RyZWFtLiAgKi8KKworCQlsaXRlcmFscy5wYmFja2VuZCA9IGxpdGVy YWxzLnBsaXQ7CisJCXBsYmFjayA9IGxpdGVyYWxzLnBsaXQgKyBzdHJlYW1fc2l6ZV8xOworCQls aXRlcmFscy52YWwgPSAwOworCQlsaXRlcmFscy5iaXRzID0gMDsKKwkJLS1wbGJhY2s7CisJCXN0 cmVhbV9zdGFydCA9ICpwbGJhY2s7CisJCWlmICh1bmxpa2VseSAoc3RyZWFtX3N0YXJ0ID09IDAp KQorCQkgIHsKKwkJICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJICAgIHJldHVybiAw OworCQkgIH0KKwkJd2hpbGUgKCgoKHVpbnRwdHJfdCkgcGxiYWNrKSAmIDMpICE9IDApCisJCSAg eworCQkgICAgbGl0ZXJhbHMudmFsIDw8PSA4OworCQkgICAgbGl0ZXJhbHMudmFsIHw9ICh1aW50 NjRfdCkqcGxiYWNrOworCQkgICAgbGl0ZXJhbHMuYml0cyArPSA4OworCQkgICAgLS1wbGJhY2s7 CisJCSAgfQorCQlsaXRlcmFscy52YWwgPDw9IDg7CisJCWxpdGVyYWxzLnZhbCB8PSAodWludDY0 X3QpKnBsYmFjazsKKwkJbGl0ZXJhbHMuYml0cyArPSA4OworCisJCWlmICghZWxmX2ZldGNoX2Jp dHNfYmFja3dhcmQgKCZwbGJhY2ssIGxpdGVyYWxzLnBiYWNrZW5kLAorCQkJCQkgICAgICAmbGl0 ZXJhbHMudmFsLCAmbGl0ZXJhbHMuYml0cykpCisJCSAgcmV0dXJuIDA7CisKKwkJbGl0ZXJhbHMu Yml0cyAtPSBfX2J1aWx0aW5fY2x6IChzdHJlYW1fc3RhcnQpIC0gMjQgKyAxOworCisJCWxpdGVy YWxzLnBiYWNrID0gcGxiYWNrOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbGl0 ZXJhbHMudmFsID0gMDsKKwkJbGl0ZXJhbHMuYml0cyA9IDA7CisJCWxpdGVyYWxzLnBiYWNrID0g TlVMTDsKKwkJbGl0ZXJhbHMucGJhY2tlbmQgPSBOVUxMOworCSAgICAgIH0KKworCSAgICAvKiBX ZSBoYXZlIHJlYWQgYWxsIHRoZSBsaXRlcmFsIGhlYWRlciBpbmZvcm1hdGlvbi4gIFRoZSBsaXRl cmFsCisJICAgICAgIGRhdGEgc3RhcnRzIGF0IExJVEVSQUxTLlBMSVQuICBTa2lwIGFoZWFkIHRv IHRoZSBzZXF1ZW5jZXMuICAqLworCisJICAgIHBpbiA9IHBsaXRlbmQ7CisKKwkgICAgc2VxX2hk ciA9ICpwaW47CisJICAgIHBpbisrOworCSAgICBpZiAoc2VxX2hkciA8IDEyOCkKKwkgICAgICBz ZXFfY291bnQgPSBzZXFfaGRyOworCSAgICBlbHNlIGlmIChzZXFfaGRyIDwgMjU1KQorCSAgICAg IHsKKwkJaWYgKHVubGlrZWx5IChwaW4gPj0gcGluZW5kKSkKKwkJICB7CisJCSAgICBlbGZfdW5j b21wcmVzc19mYWlsZWQgKCk7CisJCSAgICByZXR1cm4gMDsKKwkJICB9CisJCXNlcV9jb3VudCA9 ICgoc2VxX2hkciAtIDEyOCkgPDwgOCkgKyAqcGluOworCQlwaW4rKzsKKwkgICAgICB9CisJICAg IGVsc2UKKwkgICAgICB7CisJCWlmICh1bmxpa2VseSAocGluICsgMSA+PSBwaW5lbmQpKQorCQkg IHsKKwkJICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJICAgIHJldHVybiAwOworCQkg IH0KKwkJc2VxX2NvdW50ID0gKnBpbiArIChwaW5bMV0gPDwgOCkgKyAweDdmMDA7CisJCXBpbiAr PSAyOworCSAgICAgIH0KKworCSAgICBpZiAoc2VxX2NvdW50ID4gMCkKKwkgICAgICB7CisJCWlm ICh1bmxpa2VseSAocGluID49IHBpbmVuZCkpCisJCSAgeworCQkgICAgZWxmX3VuY29tcHJlc3Nf ZmFpbGVkICgpOworCQkgICAgcmV0dXJuIDA7CisJCSAgfQorCQlzZXFfaGRyID0gKnBpbjsKKwkJ KytwaW47CisKKwkJaWYgKCFlbGZfenN0ZF91bnBhY2tfc2VxX2RlY29kZSAoKHNlcV9oZHIgPj4g NikgJiAzLAorCQkJCQkJICZwaW4sIHBpbmVuZCwKKwkJCQkJCSAmZWxmX3pzdGRfbGl0X3RhYmxl WzBdLCA2LAorCQkJCQkJIHNjcmF0Y2gsIDM1LAorCQkJCQkJIGxpdGVyYWxfZnNlX3RhYmxlLCA5 LAorCQkJCQkJICZsaXRlcmFsX2RlY29kZSkpCisJCSAgcmV0dXJuIDA7CisKKwkJaWYgKCFlbGZf enN0ZF91bnBhY2tfc2VxX2RlY29kZSAoKHNlcV9oZHIgPj4gNCkgJiAzLAorCQkJCQkJICZwaW4s IHBpbmVuZCwKKwkJCQkJCSAmZWxmX3pzdGRfb2Zmc2V0X3RhYmxlWzBdLCA1LAorCQkJCQkJIHNj cmF0Y2gsIDMxLAorCQkJCQkJIG9mZnNldF9mc2VfdGFibGUsIDgsCisJCQkJCQkgJm9mZnNldF9k ZWNvZGUpKQorCQkgIHJldHVybiAwOworCisJCWlmICghZWxmX3pzdGRfdW5wYWNrX3NlcV9kZWNv ZGUgKChzZXFfaGRyID4+IDIpICYgMywKKwkJCQkJCSAmcGluLCBwaW5lbmQsCisJCQkJCQkgJmVs Zl96c3RkX21hdGNoX3RhYmxlWzBdLCA2LAorCQkJCQkJIHNjcmF0Y2gsIDUyLAorCQkJCQkJIG1h dGNoX2ZzZV90YWJsZSwgOSwKKwkJCQkJCSAmbWF0Y2hfZGVjb2RlKSkKKwkJICByZXR1cm4gMDsK KwkgICAgICB9CisKKwkgICAgLyogRXhwYW5kIDIwNDggYnl0ZXMgb2YgbGl0ZXJhbHMuICBUaGUg ZXhwYW5kZWQgbGl0ZXJhbHMgYXJlCisJICAgICAgIHJlY29yZGVkIGluIFBMSVRFWFAgYW5kIExJ VEVYUF9DT1VOVC4gICovCisKKwkgICAgaWYgKGxpdGVyYWxzLnR5cGUgIT0gWlNURF9MSVRfSFVG RgorCQl8fCBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplID09IDApCisJICAgICAgeworCQlwbGl0 ZXhwID0gTlVMTDsKKwkJbGl0ZXhwX2NvdW50ID0gMDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkg ICAgICB7CisJCXBsaXRleHAgPSAodW5zaWduZWQgY2hhciAqKXNjcmF0Y2g7CisJCWxpdGV4cF9j b3VudCA9IFpTVERfVEFCTEVfV09SS19MSVRfU0laRTsKKwkJaWYgKGxpdGV4cF9jb3VudCA+IGxp dGVyYWxzLnJlZ2VuZXJhdGVkX3NpemUpCisJCSAgbGl0ZXhwX2NvdW50ID0gbGl0ZXJhbHMucmVn ZW5lcmF0ZWRfc2l6ZTsKKwkJaWYgKCFlbGZfenN0ZF9saXRlcmFsX291dHB1dCAoJmxpdGVyYWxz LCBsaXRleHBfY291bnQsCisJCQkJCSAgICAgIHBsaXRleHApKQorCQkgIHJldHVybiAwOworCSAg ICAgIH0KKworCSAgICBwYmFjayA9IHBibG9ja2VuZCAtIDE7CisJICAgIHZhbCA9IDA7CisJICAg IGJpdHMgPSAwOworCSAgICBzdHJlYW1fc3RhcnQgPSAqcGJhY2s7CisJICAgIGlmICh1bmxpa2Vs eSAoc3RyZWFtX3N0YXJ0ID09IDApKQorCSAgICAgIHsKKwkJZWxmX3VuY29tcHJlc3NfZmFpbGVk ICgpOworCQlyZXR1cm4gMDsKKwkgICAgICB9CisJICAgIHdoaWxlICgoKCh1aW50cHRyX3QpcGJh Y2spICYgMykgIT0gMCkKKwkgICAgICB7CisJCXZhbCA8PD0gODsKKwkJdmFsIHw9ICh1aW50NjRf dCkqcGJhY2s7CisJCWJpdHMgKz0gODsKKwkJLS1wYmFjazsKKwkgICAgICB9CisJICAgIHZhbCA8 PD0gODsKKwkgICAgdmFsIHw9ICh1aW50NjRfdCkqcGJhY2s7CisJICAgIGJpdHMgKz0gODsKKwor CSAgICBpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ssIHBpbiwgJnZhbCwgJmJp dHMpKQorCSAgICAgIHJldHVybiAwOworCisJICAgIGJpdHMgLT0gX19idWlsdGluX2NseiAoc3Ry ZWFtX3N0YXJ0KSAtIDI0ICsgMTsKKworCSAgICBpZiAodW5saWtlbHkgKGxpdGVyYWxfZGVjb2Rl LnVzZV9ybGUpKQorCSAgICAgIGxpdGVyYWxfc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAg eworCQlpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ssIHBpbiwgJnZhbCwgJmJp dHMpKQorCQkgIHJldHVybiAwOworCQliaXRzIC09IGxpdGVyYWxfZGVjb2RlLnRhYmxlX2JpdHM7 CisJCWxpdGVyYWxfc3RhdGUgPSAoKHZhbCA+PiBiaXRzKQorCQkJCSAmICgoMVUgPDwgbGl0ZXJh bF9kZWNvZGUudGFibGVfYml0cykgLSAxKSk7CisJICAgICAgfQorCisJICAgIGlmICh1bmxpa2Vs eSAob2Zmc2V0X2RlY29kZS51c2VfcmxlKSkKKwkgICAgICBvZmZzZXRfc3RhdGUgPSAwOworCSAg ICBlbHNlCisJICAgICAgeworCQlpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ss IHBpbiwgJnZhbCwgJmJpdHMpKQorCQkgIHJldHVybiAwOworCQliaXRzIC09IG9mZnNldF9kZWNv ZGUudGFibGVfYml0czsKKwkJb2Zmc2V0X3N0YXRlID0gKCh2YWwgPj4gYml0cykKKwkJCQkmICgo MVUgPDwgb2Zmc2V0X2RlY29kZS50YWJsZV9iaXRzKSAtIDEpKTsKKwkgICAgICB9CisKKwkgICAg aWYgKHVubGlrZWx5IChtYXRjaF9kZWNvZGUudXNlX3JsZSkpCisJICAgICAgbWF0Y2hfc3RhdGUg PSAwOworCSAgICBlbHNlCisJICAgICAgeworCQlpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJk ICgmcGJhY2ssIHBpbiwgJnZhbCwgJmJpdHMpKQorCQkgIHJldHVybiAwOworCQliaXRzIC09IG1h dGNoX2RlY29kZS50YWJsZV9iaXRzOworCQltYXRjaF9zdGF0ZSA9ICgodmFsID4+IGJpdHMpCisJ CQkgICAgICAgJiAoKDFVIDw8IG1hdGNoX2RlY29kZS50YWJsZV9iaXRzKSAtIDEpKTsKKwkgICAg ICB9CisKKwkgICAgc2VxID0gMDsKKwkgICAgd2hpbGUgKDEpCisJICAgICAgeworCQl1aW50MzJf dCBvZmZzZXRfYmFzZTsKKwkJdWludDMyX3QgbmVlZDsKKwkJdWludDMyX3QgYWRkOworCQl1aW50 MzJfdCBvZmZzZXQ7CisJCXVpbnQzMl90IHVzZV9vZmZzZXQ7CisJCXVpbnQzMl90IG1hdGNoX2Jh c2U7CisJCXVpbnQzMl90IG1hdGNoOworCQl1aW50MzJfdCBsaXRlcmFsX2Jhc2U7CisJCXVpbnQz Ml90IGxpdGVyYWw7CisJCWNvbnN0IHN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgKnB0OworCQl1 aW50NjRfdCB2OworCisJCWlmICh1bmxpa2VseSAob2Zmc2V0X2RlY29kZS51c2VfcmxlKSkKKwkJ ICBvZmZzZXRfYmFzZSA9IG9mZnNldF9kZWNvZGUucmxlOworCQllbHNlCisJCSAgb2Zmc2V0X2Jh c2UgPSBvZmZzZXRfZGVjb2RlLnRhYmxlW29mZnNldF9zdGF0ZV0uc3ltYm9sOworCisJCWlmICh1 bmxpa2VseSAobWF0Y2hfZGVjb2RlLnVzZV9ybGUpKQorCQkgIG1hdGNoX2Jhc2UgPSBtYXRjaF9k ZWNvZGUucmxlOworCQllbHNlCisJCSAgbWF0Y2hfYmFzZSA9IG1hdGNoX2RlY29kZS50YWJsZVtt YXRjaF9zdGF0ZV0uc3ltYm9sOworCisJCWlmICh1bmxpa2VseSAobGl0ZXJhbF9kZWNvZGUudXNl X3JsZSkpCisJCSAgbGl0ZXJhbF9iYXNlID0gbGl0ZXJhbF9kZWNvZGUucmxlOworCQllbHNlCisJ CSAgbGl0ZXJhbF9iYXNlID0gbGl0ZXJhbF9kZWNvZGUudGFibGVbbGl0ZXJhbF9zdGF0ZV0uc3lt Ym9sOworCisJCW5lZWQgPSBvZmZzZXRfYmFzZTsKKwkJaWYgKHVubGlrZWx5IChuZWVkID4gMzEp KQorCQkgIHsKKwkJICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJICAgIHJldHVybiAw OworCQkgIH0KKworCQkvKiBlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCBvbmx5IHByb21pc2VzIHVz IDE2IGJpdHMuICAqLworCQlhZGQgPSAwOworCQlpZiAodW5saWtlbHkgKG5lZWQgPiAxNikpCisJ CSAgeworCQkgICAgaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNrLCBwaW4sICZ2 YWwsICZiaXRzKSkKIAkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAg ewotCQkgICAgICBpZiAoZGlzdCA8IDQpCi0JCQlkaXN0ID0gZGlzdCArIDE7Ci0JCSAgICAgIGVs c2UKLQkJCXsKLQkJCSAgdW5zaWduZWQgaW50IGV4dHJhOworCQkgICAgYml0cyAtPSAxNjsKKwkJ ICAgIGFkZCA9ICh2YWwgPj4gYml0cykgJiAoKDFVIDw8IDE2KSAtIDEpOworCQkgICAgbmVlZCAt PSAxNjsKKwkJICAgIGFkZCA8PD0gbmVlZDsKKwkJICB9CisJCWlmICghZWxmX2ZldGNoX2JpdHNf YmFja3dhcmQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0cykpCisJCSAgcmV0dXJuIDA7CisJCWJp dHMgLT0gbmVlZDsKKwkJYWRkICs9ICh2YWwgPj4gYml0cykgJiAoKDFVIDw8IG5lZWQpIC0gMSk7 CiAKLQkJCSAgaWYgKCFlbGZfemxpYl9mZXRjaCAoJnBpbiwgcGluZW5kLCAmdmFsLCAmYml0cykp Ci0JCQkgICAgcmV0dXJuIDA7CisJCW9mZnNldCA9ICgxVSA8PCBvZmZzZXRfYmFzZSkgKyBhZGQ7 CiAKLQkJCSAgLyogVGhpcyBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgdGFibGUgb2YKLQkJCSAg ICAgZGlzdGFuY2UgY29kZXMgaW4gUkZDIDE5NTEgMy4yLjUuICAqLwotCQkJICBkaXN0IC09IDQ7 Ci0JCQkgIGV4dHJhID0gKGRpc3QgPj4gMSkgKyAxOwotCQkJICBkaXN0ID0gKGRpc3QgJiAxKSA8 PCBleHRyYTsKLQkJCSAgZGlzdCArPSA1OwotCQkJICBkaXN0ICs9ICgoMVUgPDwgKGV4dHJhIC0g MSkpIC0gMSkgPDwgMjsKLQkJCSAgZGlzdCArPSB2YWwgJiAoKDFVIDw8IGV4dHJhKSAtIDEpOwot CQkJICB2YWwgPj49IGV4dHJhOwotCQkJICBiaXRzIC09IGV4dHJhOwotCQkJfQorCQlpZiAobWF0 Y2hfYmFzZSA8IFpTVERfTUFUQ0hfTEVOR1RIX0JBU0VMSU5FX09GRlNFVCkKKwkJICBtYXRjaCA9 IG1hdGNoX2Jhc2UgKyAzOworCQllbHNlCisJCSAgeworCQkgICAgdW5zaWduZWQgaW50IGlkeDsK KwkJICAgIHVuc2lnbmVkIGludCBiYXNlbGluZTsKIAotCQkgICAgICAvKiBHbyBiYWNrIGRpc3Qg Ynl0ZXMsIGFuZCBjb3B5IGxlbiBieXRlcyBmcm9tCi0JCQkgdGhlcmUuICAqLworCQkgICAgaWYg KHVubGlrZWx5IChtYXRjaF9iYXNlID4gNTIpKQorCQkgICAgICB7CisJCQllbGZfdW5jb21wcmVz c19mYWlsZWQgKCk7CisJCQlyZXR1cm4gMDsKKwkJICAgICAgfQogCi0JCSAgICAgIGlmICh1bmxp a2VseSAoKHVuc2lnbmVkIGludCkgKHBvdXQgLSBwb3JpZ291dCkgPCBkaXN0KSkKLQkJCXsKLQkJ CSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQkJICByZXR1cm4gMDsKLQkJCX0KKwkJICAg IGlkeCA9IG1hdGNoX2Jhc2UgLSBaU1REX01BVENIX0xFTkdUSF9CQVNFTElORV9PRkZTRVQ7CisJ CSAgICBiYXNlbGluZSA9IGVsZl96c3RkX21hdGNoX2xlbmd0aF9iYXNlbGluZVtpZHhdOworCQkg ICAgbmVlZCA9IGVsZl96c3RkX21hdGNoX2xlbmd0aF9iaXRzW2lkeF07CiAKLQkJICAgICAgaWYg KHVubGlrZWx5ICgodW5zaWduZWQgaW50KSAocG91dGVuZCAtIHBvdXQpIDwgbGVuKSkKLQkJCXsK LQkJCSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQkJICByZXR1cm4gMDsKLQkJCX0KKwkJ ICAgIGlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0 cykpCisJCSAgICAgIHJldHVybiAwOworCQkgICAgYml0cyAtPSBuZWVkOworCQkgICAgYWRkID0g KHZhbCA+PiBiaXRzKSAmICgoMVUgPDwgbmVlZCkgLSAxKTsKKworCQkgICAgbWF0Y2ggPSBiYXNl bGluZSArIGFkZDsKKwkJICB9CisKKwkJaWYgKGxpdGVyYWxfYmFzZSA8IFpTVERfTElURVJBTF9M RU5HVEhfQkFTRUxJTkVfT0ZGU0VUKQorCQkgIGxpdGVyYWwgPSBsaXRlcmFsX2Jhc2U7CisJCWVs c2UKKwkJICB7CisJCSAgICB1bnNpZ25lZCBpbnQgaWR4OworCQkgICAgdW5zaWduZWQgaW50IGJh c2VsaW5lOworCisJCSAgICBpZiAodW5saWtlbHkgKGxpdGVyYWxfYmFzZSA+IDM1KSkKKwkJICAg ICAgeworCQkJZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCQkJcmV0dXJuIDA7CisJCSAgICAg IH0KIAotCQkgICAgICBpZiAoZGlzdCA+PSBsZW4pCi0JCQl7Ci0JCQkgIG1lbWNweSAocG91dCwg cG91dCAtIGRpc3QsIGxlbik7Ci0JCQkgIHBvdXQgKz0gbGVuOwotCQkJfQotCQkgICAgICBlbHNl Ci0JCQl7Ci0JCQkgIHdoaWxlIChsZW4gPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIHVuc2lnbmVk IGludCBjb3B5OworCQkgICAgaWR4ID0gbGl0ZXJhbF9iYXNlIC0gWlNURF9MSVRFUkFMX0xFTkdU SF9CQVNFTElORV9PRkZTRVQ7CisJCSAgICBiYXNlbGluZSA9IGVsZl96c3RkX2xpdGVyYWxfbGVu Z3RoX2Jhc2VsaW5lW2lkeF07CisJCSAgICBuZWVkID0gZWxmX3pzdGRfbGl0ZXJhbF9sZW5ndGhf Yml0c1tpZHhdOwogCi0JCQkgICAgICBjb3B5ID0gbGVuIDwgZGlzdCA/IGxlbiA6IGRpc3Q7Ci0J CQkgICAgICBtZW1jcHkgKHBvdXQsIHBvdXQgLSBkaXN0LCBjb3B5KTsKLQkJCSAgICAgIGxlbiAt PSBjb3B5OwotCQkJICAgICAgcG91dCArPSBjb3B5OwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0K LQkJfQotCSAgICB9Ci0JfQotICAgIH0KKwkJICAgIGlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dh cmQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0cykpCisJCSAgICAgIHJldHVybiAwOworCQkgICAg Yml0cyAtPSBuZWVkOworCQkgICAgYWRkID0gKHZhbCA+PiBiaXRzKSAmICgoMVUgPDwgbmVlZCkg LSAxKTsKIAotICAvKiBXZSBzaG91bGQgaGF2ZSBmaWxsZWQgdGhlIG91dHB1dCBidWZmZXIuICAq LwotICBpZiAodW5saWtlbHkgKHBvdXQgIT0gcG91dGVuZCkpCi0gICAgewotICAgICAgZWxmX3Vu Y29tcHJlc3NfZmFpbGVkICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCQkgICAgbGl0ZXJh bCA9IGJhc2VsaW5lICsgYWRkOworCQkgIH0KIAotICByZXR1cm4gMTsKLX0KKwkJc3dpdGNoIChv ZmZzZXQpCisJCSAgeworCQkgIGNhc2UgMDoKKwkJICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAo KTsKKwkJICAgIHJldHVybiAwOworCQkgIGNhc2UgMToKKwkJICAgIGlmIChsaXRlcmFsID09IDAp CisJCSAgICAgIHsKKwkJCXVzZV9vZmZzZXQgPSByZXBlYXRlZF9vZmZzZXQyOworCQkJcmVwZWF0 ZWRfb2Zmc2V0MiA9IHJlcGVhdGVkX29mZnNldDE7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJ ICAgICAgdXNlX29mZnNldCA9IHJlcGVhdGVkX29mZnNldDE7CisJCSAgICBicmVhazsKKwkJICBj YXNlIDI6CisJCSAgICBpZiAobGl0ZXJhbCA9PSAwKQorCQkgICAgICB7CisJCQl1c2Vfb2Zmc2V0 ID0gcmVwZWF0ZWRfb2Zmc2V0MzsKKwkJCXJlcGVhdGVkX29mZnNldDMgPSByZXBlYXRlZF9vZmZz ZXQyOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHVzZV9vZmZzZXQgPSByZXBlYXRl ZF9vZmZzZXQyOworCQkgICAgcmVwZWF0ZWRfb2Zmc2V0MiA9IHJlcGVhdGVkX29mZnNldDE7CisJ CSAgICBicmVhazsKKwkJICBjYXNlIDM6CisJCSAgICBpZiAobGl0ZXJhbCA9PSAwKQorCQkgICAg ICB1c2Vfb2Zmc2V0ID0gcmVwZWF0ZWRfb2Zmc2V0MSAtIDE7CisJCSAgICBlbHNlCisJCSAgICAg IHVzZV9vZmZzZXQgPSByZXBlYXRlZF9vZmZzZXQzOworCQkgICAgcmVwZWF0ZWRfb2Zmc2V0MyA9 IHJlcGVhdGVkX29mZnNldDI7CisJCSAgICByZXBlYXRlZF9vZmZzZXQyID0gcmVwZWF0ZWRfb2Zm c2V0MTsKKwkJICAgIGJyZWFrOworCQkgIGRlZmF1bHQ6CisJCSAgICB1c2Vfb2Zmc2V0ID0gb2Zm c2V0IC0gMzsKKwkJICAgIHJlcGVhdGVkX29mZnNldDMgPSByZXBlYXRlZF9vZmZzZXQyOworCQkg ICAgcmVwZWF0ZWRfb2Zmc2V0MiA9IHJlcGVhdGVkX29mZnNldDE7CisJCSAgICBicmVhazsKKwkJ ICB9CisKKwkJcmVwZWF0ZWRfb2Zmc2V0MSA9IHVzZV9vZmZzZXQ7CisKKwkJKytzZXE7CisJCWlm IChzZXEgPCBzZXFfY291bnQpCisJCSAgeworCQkgICAgLyogVXBkYXRlIHRoZSB0aHJlZSBzdGF0 ZXMuICAqLworCisJCSAgICBpZiAodW5saWtlbHkgKGxpdGVyYWxfZGVjb2RlLnVzZV9ybGUpKQor CQkgICAgICA7CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCWlmICghZWxmX2ZldGNoX2JpdHNf YmFja3dhcmQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0cykpCisJCQkgIHJldHVybiAwOworCQkJ cHQgPSAmbGl0ZXJhbF9kZWNvZGUudGFibGVbbGl0ZXJhbF9zdGF0ZV07CisJCQliaXRzIC09IHB0 LT5iaXRzOworCQkJdiA9ICh2YWwgPj4gYml0cykgJiAoKCh1aW50NjRfdCkxIDw8IHB0LT5iaXRz KSAtIDEpOworCQkJbGl0ZXJhbF9zdGF0ZSA9IHB0LT5iYXNlICsgdjsKKwkJICAgICAgfQorCisJ CSAgICBpZiAodW5saWtlbHkgKG1hdGNoX2RlY29kZS51c2VfcmxlKSkKKwkJICAgICAgOworCQkg ICAgZWxzZQorCQkgICAgICB7CisJCQlpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJh Y2ssIHBpbiwgJnZhbCwgJmJpdHMpKQorCQkJICByZXR1cm4gMDsKKwkJCXB0ID0gJm1hdGNoX2Rl Y29kZS50YWJsZVttYXRjaF9zdGF0ZV07CisJCQliaXRzIC09IHB0LT5iaXRzOworCQkJdiA9ICh2 YWwgPj4gYml0cykgJiAoKCh1aW50NjRfdCkxIDw8IHB0LT5iaXRzKSAtIDEpOworCQkJbWF0Y2hf c3RhdGUgPSBwdC0+YmFzZSArIHY7CisJCSAgICAgIH0KKworCQkgICAgaWYgKHVubGlrZWx5IChv ZmZzZXRfZGVjb2RlLnVzZV9ybGUpKQorCQkgICAgICA7CisJCSAgICBlbHNlCisJCSAgICAgIHsK KwkJCWlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0 cykpCisJCQkgIHJldHVybiAwOworCQkJcHQgPSAmb2Zmc2V0X2RlY29kZS50YWJsZVtvZmZzZXRf c3RhdGVdOworCQkJYml0cyAtPSBwdC0+Yml0czsKKwkJCXYgPSAodmFsID4+IGJpdHMpICYgKCgo dWludDY0X3QpMSA8PCBwdC0+Yml0cykgLSAxKTsKKwkJCW9mZnNldF9zdGF0ZSA9IHB0LT5iYXNl ICsgdjsKKwkJICAgICAgfQorCQkgIH0KKworCQkvKiBUaGUgbmV4dCBzZXF1ZW5jZSBpcyBub3cg aW4gTElURVJBTCwgVVNFX09GRlNFVCwgTUFUQ0guICAqLworCisJCWlmIChsaXRlcmFsID4gMCkK KwkJICB7CisJCSAgICAvKiBDb3B5IExJVEVSQUwgYnl0ZXMgZnJvbSB0aGUgbGl0ZXJhbHMuICAq LworCisJCSAgICBpZiAodW5saWtlbHkgKChzaXplX3QpKHBvdXRlbmQgLSBwb3V0KSA8IGxpdGVy YWwpKQorCQkgICAgICB7CisJCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCQlyZXR1cm4g MDsKKwkJICAgICAgfQorCisJCSAgICBpZiAobGl0ZXJhbCA8PSBsaXRleHBfY291bnQpCisJCSAg ICAgIHsKKwkJCW1lbWNweSAocG91dCwgcGxpdGV4cCwgbGl0ZXJhbCk7CisJCQlwbGl0ZXhwICs9 IGxpdGVyYWw7CisJCQlsaXRleHBfY291bnQgLT0gbGl0ZXJhbDsKKwkJCXBvdXQgKz0gbGl0ZXJh bDsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICB7CisJCQlpZiAobGl0ZXhwX2NvdW50 ID4gMCkKKwkJCSAgeworCQkJICAgIG1lbWNweSAocG91dCwgcGxpdGV4cCwgbGl0ZXhwX2NvdW50 KTsKKwkJCSAgICBwb3V0ICs9IGxpdGV4cF9jb3VudDsKKwkJCSAgICBsaXRlcmFsIC09IGxpdGV4 cF9jb3VudDsKKwkJCSAgICBwbGl0ZXhwID0gTlVMTDsKKwkJCSAgICBsaXRleHBfY291bnQgPSAw OworCQkJICB9CisKKwkJCWlmIChsaXRlcmFscy50eXBlICE9IFpTVERfTElUX0hVRkYKKwkJCSAg ICB8fCBsaXRlcmFsID49IFpTVERfVEFCTEVfV09SS19MSVRfU0laRSkKKwkJCSAgeworCQkJICAg IGlmICghZWxmX3pzdGRfbGl0ZXJhbF9vdXRwdXQgKCZsaXRlcmFscywgbGl0ZXJhbCwKKwkJCQkJ CQkgIHBvdXQpKQorCQkJICAgICAgcmV0dXJuIDA7CisJCQkgICAgcG91dCArPSBsaXRlcmFsOwor CQkJICAgIGxpdGVyYWwgPSAwOworCQkJICB9CisKKwkJCWlmIChsaXRlcmFscy50eXBlICE9IFpT VERfTElUX0hVRkYKKwkJCSAgICB8fCBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplID09IDApCisJ CQkgIHsKKwkJCSAgICBwbGl0ZXhwID0gTlVMTDsKKwkJCSAgICBsaXRleHBfY291bnQgPSAwOwor CQkJICAgIGlmICh1bmxpa2VseSAobGl0ZXJhbCA+IDApKQorCQkJICAgICAgeworCQkJCWVsZl91 bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCSAgICAgIH0KKwkJCSAgfQor CQkJZWxzZQorCQkJICB7CisJCQkgICAgcGxpdGV4cCA9ICh1bnNpZ25lZCBjaGFyICopc2NyYXRj aDsKKwkJCSAgICBsaXRleHBfY291bnQgPSBaU1REX1RBQkxFX1dPUktfTElUX1NJWkU7CisJCQkg ICAgaWYgKGxpdGV4cF9jb3VudCA+IGxpdGVyYWxzLnJlZ2VuZXJhdGVkX3NpemUpCisJCQkgICAg ICBsaXRleHBfY291bnQgPSBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplOworCQkJICAgIGlmICgh ZWxmX3pzdGRfbGl0ZXJhbF9vdXRwdXQgKCZsaXRlcmFscywKKwkJCQkJCQkgIGxpdGV4cF9jb3Vu dCwKKwkJCQkJCQkgIHBsaXRleHApKQorCQkJICAgICAgcmV0dXJuIDA7CisKKwkJCSAgICBpZiAo dW5saWtlbHkgKGxpdGVyYWwgPiBsaXRleHBfY291bnQpKQorCQkJICAgICAgeworCQkJCWVsZl91 bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCSAgICAgIH0KKworCQkJICAg IG1lbWNweSAocG91dCwgcGxpdGV4cCwgbGl0ZXJhbCk7CisJCQkgICAgcGxpdGV4cCArPSBsaXRl cmFsOworCQkJICAgIGxpdGV4cF9jb3VudCAtPSBsaXRlcmFsOworCQkJICAgIHBvdXQgKz0gbGl0 ZXJhbDsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCisJCS8qIENvcHkgTUFUQ0ggYnl0ZXMg ZnJvbSB0aGUgZGVjb2RlZCBvdXRwdXQgYXQgVVNFX09GRlNFVC4gICovCisKKwkJaWYgKHVubGlr ZWx5ICgoc2l6ZV90KShwb3V0ZW5kIC0gcG91dCkgPCBtYXRjaCkpCisJCSAgeworCQkgICAgZWxm X3VuY29tcHJlc3NfZmFpbGVkICgpOworCQkgICAgcmV0dXJuIDA7CisJCSAgfQogCi0vKiBWZXJp ZnkgdGhlIHpsaWIgY2hlY2tzdW0uICBUaGUgY2hlY2tzdW0gaXMgaW4gdGhlIDQgYnl0ZXMgYXQK LSAgIENIRUNLQllURVMsIGFuZCB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaXMgYXQgVU5DT01QUkVT U0VEIC8KLSAgIFVOQ09NUFJFU1NFRF9TSVpFLiAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24g ZmFpbHVyZS4gICovCisJCWlmIChtYXRjaCA+IDApCisJCSAgeworCQkgICAgaWYgKHVubGlrZWx5 ICgoc2l6ZV90KShwb3V0IC0gcG91dHN0YXJ0KSA8IHVzZV9vZmZzZXQpKQorCQkgICAgICB7CisJ CQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCQlyZXR1cm4gMDsKKwkJICAgICAgfQorCisJ CSAgICBpZiAodXNlX29mZnNldCA+PSBtYXRjaCkKKwkJICAgICAgeworCQkJbWVtY3B5IChwb3V0 LCBwb3V0IC0gdXNlX29mZnNldCwgbWF0Y2gpOworCQkJcG91dCArPSBtYXRjaDsKKwkJICAgICAg fQorCQkgICAgZWxzZQorCQkgICAgICB7CisJCQl3aGlsZSAobWF0Y2ggPiAwKQorCQkJICB7CisJ CQkgICAgdWludDMyX3QgY29weTsKKworCQkJICAgIGNvcHkgPSBtYXRjaCA8IHVzZV9vZmZzZXQg PyBtYXRjaCA6IHVzZV9vZmZzZXQ7CisJCQkgICAgbWVtY3B5IChwb3V0LCBwb3V0IC0gdXNlX29m ZnNldCwgY29weSk7CisJCQkgICAgbWF0Y2ggLT0gY29weTsKKwkJCSAgICBwb3V0ICs9IGNvcHk7 CisJCQkgIH0KKwkJICAgICAgfQorCQkgIH0KKworCQlpZiAodW5saWtlbHkgKHNlcSA+PSBzZXFf Y291bnQpKQorCQkgIHsKKwkJICAgIHNpemVfdCBjb3B5OworCisJCSAgICAvKiBDb3B5IHJlbWFp bmluZyBsaXRlcmFscy4gICovCisJCSAgICBpZiAobGl0ZXhwX2NvdW50ID4gMCkKKwkJICAgICAg eworCQkJaWYgKHVubGlrZWx5ICgoc2l6ZV90KShwb3V0ZW5kIC0gcG91dCkgPCBsaXRleHBfY291 bnQpKQorCQkJICB7CisJCQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOworCQkJICAgIHJl dHVybiAwOworCQkJICB9CisJCQltZW1jcHkgKHBvdXQsIHBsaXRleHAsIGxpdGV4cF9jb3VudCk7 CisJCQlwb3V0ICs9IGxpdGV4cF9jb3VudDsKKwkJICAgICAgfQorCQkgICAgY29weSA9IGxpdGVy YWxzLnJlZ2VuZXJhdGVkX3NpemU7CisJCSAgICBpZiAoY29weSA+IDApCisJCSAgICAgIHsKKwkJ CWlmICh1bmxpa2VseSAoKHNpemVfdCkocG91dGVuZCAtIHBvdXQpIDwgY29weSkpCisJCQkgIHsK KwkJCSAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJCQkgICAgcmV0dXJuIDA7CisJCQkg IH0KIAotc3RhdGljIGludAotZWxmX3psaWJfdmVyaWZ5X2NoZWNrc3VtIChjb25zdCB1bnNpZ25l ZCBjaGFyICpjaGVja2J5dGVzLAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICp1bmNvbXByZXNz ZWQsCi0JCQkgIHNpemVfdCB1bmNvbXByZXNzZWRfc2l6ZSkKLXsKLSAgdW5zaWduZWQgaW50IGk7 Ci0gIHVuc2lnbmVkIGludCBja3N1bTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKLSAgdWlu dDMyX3QgczE7Ci0gIHVpbnQzMl90IHMyOwotICBzaXplX3QgaHN6OworCQkJaWYgKCFlbGZfenN0 ZF9saXRlcmFsX291dHB1dCAoJmxpdGVyYWxzLCBjb3B5LCBwb3V0KSkKKwkJCSAgcmV0dXJuIDA7 CiAKLSAgY2tzdW0gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIGNrc3VtID0g KGNrc3VtIDw8IDgpIHwgY2hlY2tieXRlc1tpXTsKKwkJCXBvdXQgKz0gY29weTsKKwkJICAgICAg fQogCi0gIHMxID0gMTsKLSAgczIgPSAwOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0K IAotICAvKiBNaW5pbWl6ZSBtb2R1bG8gb3BlcmF0aW9ucy4gICovCisJICAgIHBpbiA9IHBibG9j a2VuZDsKKwkgIH0KKwkgIGJyZWFrOwogCi0gIHAgPSB1bmNvbXByZXNzZWQ7Ci0gIGhzeiA9IHVu Y29tcHJlc3NlZF9zaXplOwotICB3aGlsZSAoaHN6ID49IDU1NTIpCi0gICAgewotICAgICAgZm9y IChpID0gMDsgaSA8IDU1NTI7IGkgKz0gMTYpCi0JewotCSAgLyogTWFudWFsbHkgdW5yb2xsIGxv b3AgMTYgdGltZXMuICAqLwotCSAgczEgPSBzMSArICpwKys7Ci0JICBzMiA9IHMyICsgczE7Ci0J ICBzMSA9IHMxICsgKnArKzsKLQkgIHMyID0gczIgKyBzMTsKLQkgIHMxID0gczEgKyAqcCsrOwot CSAgczIgPSBzMiArIHMxOwotCSAgczEgPSBzMSArICpwKys7Ci0JICBzMiA9IHMyICsgczE7Ci0J ICBzMSA9IHMxICsgKnArKzsKLQkgIHMyID0gczIgKyBzMTsKLQkgIHMxID0gczEgKyAqcCsrOwot CSAgczIgPSBzMiArIHMxOwotCSAgczEgPSBzMSArICpwKys7Ci0JICBzMiA9IHMyICsgczE7Ci0J ICBzMSA9IHMxICsgKnArKzsKLQkgIHMyID0gczIgKyBzMTsKLQkgIHMxID0gczEgKyAqcCsrOwot CSAgczIgPSBzMiArIHMxOwotCSAgczEgPSBzMSArICpwKys7Ci0JICBzMiA9IHMyICsgczE7Ci0J ICBzMSA9IHMxICsgKnArKzsKLQkgIHMyID0gczIgKyBzMTsKLQkgIHMxID0gczEgKyAqcCsrOwot CSAgczIgPSBzMiArIHMxOwotCSAgczEgPSBzMSArICpwKys7Ci0JICBzMiA9IHMyICsgczE7Ci0J ICBzMSA9IHMxICsgKnArKzsKLQkgIHMyID0gczIgKyBzMTsKLQkgIHMxID0gczEgKyAqcCsrOwot CSAgczIgPSBzMiArIHMxOwotCSAgczEgPSBzMSArICpwKys7Ci0JICBzMiA9IHMyICsgczE7CisJ Y2FzZSAzOgorCWRlZmF1bHQ6CisJICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJICByZXR1 cm4gMDsKIAl9Ci0gICAgICBoc3ogLT0gNTU1MjsKLSAgICAgIHMxICU9IDY1NTIxOwotICAgICAg czIgJT0gNjU1MjE7CiAgICAgfQogCi0gIHdoaWxlIChoc3ogPj0gMTYpCisgIGlmIChoYXNfY2hl Y2tzdW0pCiAgICAgewotICAgICAgLyogTWFudWFsbHkgdW5yb2xsIGxvb3AgMTYgdGltZXMuICAq LwotICAgICAgczEgPSBzMSArICpwKys7Ci0gICAgICBzMiA9IHMyICsgczE7Ci0gICAgICBzMSA9 IHMxICsgKnArKzsKLSAgICAgIHMyID0gczIgKyBzMTsKLSAgICAgIHMxID0gczEgKyAqcCsrOwot ICAgICAgczIgPSBzMiArIHMxOwotICAgICAgczEgPSBzMSArICpwKys7Ci0gICAgICBzMiA9IHMy ICsgczE7Ci0gICAgICBzMSA9IHMxICsgKnArKzsKLSAgICAgIHMyID0gczIgKyBzMTsKLSAgICAg IHMxID0gczEgKyAqcCsrOwotICAgICAgczIgPSBzMiArIHMxOwotICAgICAgczEgPSBzMSArICpw Kys7Ci0gICAgICBzMiA9IHMyICsgczE7Ci0gICAgICBzMSA9IHMxICsgKnArKzsKLSAgICAgIHMy ID0gczIgKyBzMTsKLSAgICAgIHMxID0gczEgKyAqcCsrOwotICAgICAgczIgPSBzMiArIHMxOwot ICAgICAgczEgPSBzMSArICpwKys7Ci0gICAgICBzMiA9IHMyICsgczE7Ci0gICAgICBzMSA9IHMx ICsgKnArKzsKLSAgICAgIHMyID0gczIgKyBzMTsKLSAgICAgIHMxID0gczEgKyAqcCsrOwotICAg ICAgczIgPSBzMiArIHMxOwotICAgICAgczEgPSBzMSArICpwKys7Ci0gICAgICBzMiA9IHMyICsg czE7Ci0gICAgICBzMSA9IHMxICsgKnArKzsKLSAgICAgIHMyID0gczIgKyBzMTsKLSAgICAgIHMx ID0gczEgKyAqcCsrOwotICAgICAgczIgPSBzMiArIHMxOwotICAgICAgczEgPSBzMSArICpwKys7 Ci0gICAgICBzMiA9IHMyICsgczE7CisgICAgICBpZiAodW5saWtlbHkgKHBpbiArIDQgPiBwaW5l bmQpKQorCXsKKwkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgIHJldHVybiAwOworCX0K IAotICAgICAgaHN6IC09IDE2OwotICAgIH0KKyAgICAgIC8qIFdlIGRvbid0IGN1cnJlbnRseSB2 ZXJpZnkgdGhlIGNoZWNrc3VtLiAgQ3VycmVudGx5IHJ1bm5pbmcgR05VIGxkIHdpdGgKKwkgLS1j b21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16c3RkIGRvZXMgbm90IHNlZW0gdG8gZ2VuZXJhdGUgYQor CSBjaGVja3N1bS4gICovCiAKLSAgZm9yIChpID0gMDsgaSA8IGhzejsgKytpKQotICAgIHsKLSAg ICAgIHMxID0gczEgKyAqcCsrOwotICAgICAgczIgPSBzMiArIHMxOworICAgICAgcGluICs9IDQ7 CiAgICAgfQogCi0gIHMxICU9IDY1NTIxOwotICBzMiAlPSA2NTUyMTsKLQotICBpZiAodW5saWtl bHkgKChzMiA8PCAxNikgKyBzMSAhPSBja3N1bSkpCisgIGlmIChwaW4gIT0gcGluZW5kKQogICAg IHsKICAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKICAgICAgIHJldHVybiAwOwpAQCAt MjUyNywyMCArNDczOCw4IEBAIGVsZl96bGliX3ZlcmlmeV9jaGVja3N1bSAoY29uc3QgdW5zaWdu ZWQgY2hhciAqY2hlY2tieXRlcywKICAgcmV0dXJuIDE7CiB9CiAKLS8qIEluZmxhdGUgYSB6bGli IHN0cmVhbSBmcm9tIFBJTi9TSU4gdG8gUE9VVC9TT1VULCBhbmQgdmVyaWZ5IHRoZQotICAgY2hl Y2tzdW0uICBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yLiAgKi8KLQotc3RhdGljIGlu dAotZWxmX3psaWJfaW5mbGF0ZV9hbmRfdmVyaWZ5IChjb25zdCB1bnNpZ25lZCBjaGFyICpwaW4s IHNpemVfdCBzaW4sCi0JCQkgICAgIHVpbnQxNl90ICp6ZGVidWdfdGFibGUsIHVuc2lnbmVkIGNo YXIgKnBvdXQsCi0JCQkgICAgIHNpemVfdCBzb3V0KQotewotICBpZiAoIWVsZl96bGliX2luZmxh dGUgKHBpbiwgc2luLCB6ZGVidWdfdGFibGUsIHBvdXQsIHNvdXQpKQotICAgIHJldHVybiAwOwot ICBpZiAoIWVsZl96bGliX3ZlcmlmeV9jaGVja3N1bSAocGluICsgc2luIC0gNCwgcG91dCwgc291 dCkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQorI2RlZmluZSBaREVCVUdfVEFCTEVf U0laRSBcCisgIChaTElCX1RBQkxFX1NJWkUgPiBaU1REX1RBQkxFX1NJWkUgPyBaTElCX1RBQkxF X1NJWkUgOiBaU1REX1RBQkxFX1NJWkUpCiAKIC8qIFVuY29tcHJlc3MgdGhlIG9sZCBjb21wcmVz c2VkIGRlYnVnIGZvcm1hdCwgdGhlIG9uZSBlbWl0dGVkIGJ5CiAgICAtLWNvbXByZXNzLWRlYnVn LXNlY3Rpb25zPXpsaWItZ251LiAgVGhlIGNvbXByZXNzZWQgZGF0YSBpcyBpbgpAQCAtMjYxMSw2 ICs0ODEwLDggQEAgZWxmX3VuY29tcHJlc3NfY2hkciAoc3RydWN0IGJhY2t0cmFjZV9zdGF0ZSAq c3RhdGUsCiAJCSAgICAgdW5zaWduZWQgY2hhciAqKnVuY29tcHJlc3NlZCwgc2l6ZV90ICp1bmNv bXByZXNzZWRfc2l6ZSkKIHsKICAgY29uc3QgYl9lbGZfY2hkciAqY2hkcjsKKyAgY2hhciAqYWxj OworICBzaXplX3QgYWxjX2xlbjsKICAgdW5zaWduZWQgY2hhciAqcG87CiAKICAgKnVuY29tcHJl c3NlZCA9IE5VTEw7CkBAIC0yNjIyLDMxICs0ODIzLDUwIEBAIGVsZl91bmNvbXByZXNzX2NoZHIg KHN0cnVjdCBiYWNrdHJhY2Vfc3RhdGUgKnN0YXRlLAogCiAgIGNoZHIgPSAoY29uc3QgYl9lbGZf Y2hkciAqKSBjb21wcmVzc2VkOwogCi0gIGlmIChjaGRyLT5jaF90eXBlICE9IEVMRkNPTVBSRVNT X1pMSUIpCi0gICAgewotICAgICAgLyogVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gYWxnb3JpdGht LiAgKi8KLSAgICAgIHJldHVybiAxOwotICAgIH0KLQorICBhbGMgPSBOVUxMOworICBhbGNfbGVu ID0gMDsKICAgaWYgKCp1bmNvbXByZXNzZWQgIT0gTlVMTCAmJiAqdW5jb21wcmVzc2VkX3NpemUg Pj0gY2hkci0+Y2hfc2l6ZSkKICAgICBwbyA9ICp1bmNvbXByZXNzZWQ7CiAgIGVsc2UKICAgICB7 Ci0gICAgICBwbyA9ICh1bnNpZ25lZCBjaGFyICopIGJhY2t0cmFjZV9hbGxvYyAoc3RhdGUsIGNo ZHItPmNoX3NpemUsCi0JCQkJCSAgICAgIGVycm9yX2NhbGxiYWNrLCBkYXRhKTsKLSAgICAgIGlm IChwbyA9PSBOVUxMKQorICAgICAgYWxjX2xlbiA9IGNoZHItPmNoX3NpemU7CisgICAgICBhbGMg PSBiYWNrdHJhY2VfYWxsb2MgKHN0YXRlLCBhbGNfbGVuLCBlcnJvcl9jYWxsYmFjaywgZGF0YSk7 CisgICAgICBpZiAoYWxjID09IE5VTEwpCiAJcmV0dXJuIDA7CisgICAgICBwbyA9ICh1bnNpZ25l ZCBjaGFyICopIGFsYzsKICAgICB9CiAKLSAgaWYgKCFlbGZfemxpYl9pbmZsYXRlX2FuZF92ZXJp ZnkgKGNvbXByZXNzZWQgKyBzaXplb2YgKGJfZWxmX2NoZHIpLAotCQkJCSAgICBjb21wcmVzc2Vk X3NpemUgLSBzaXplb2YgKGJfZWxmX2NoZHIpLAotCQkJCSAgICB6ZGVidWdfdGFibGUsIHBvLCBj aGRyLT5jaF9zaXplKSkKLSAgICByZXR1cm4gMTsKKyAgc3dpdGNoIChjaGRyLT5jaF90eXBlKQor ICAgIHsKKyAgICBjYXNlIEVMRkNPTVBSRVNTX1pMSUI6CisgICAgICBpZiAoIWVsZl96bGliX2lu ZmxhdGVfYW5kX3ZlcmlmeSAoY29tcHJlc3NlZCArIHNpemVvZiAoYl9lbGZfY2hkciksCisJCQkJ CWNvbXByZXNzZWRfc2l6ZSAtIHNpemVvZiAoYl9lbGZfY2hkciksCisJCQkJCXpkZWJ1Z190YWJs ZSwgcG8sIGNoZHItPmNoX3NpemUpKQorCWdvdG8gc2tpcDsKKyAgICAgIGJyZWFrOworCisgICAg Y2FzZSBFTEZDT01QUkVTU19aU1REOgorICAgICAgaWYgKCFlbGZfenN0ZF9kZWNvbXByZXNzIChj b21wcmVzc2VkICsgc2l6ZW9mIChiX2VsZl9jaGRyKSwKKwkJCQljb21wcmVzc2VkX3NpemUgLSBz aXplb2YgKGJfZWxmX2NoZHIpLAorCQkJCSh1bnNpZ25lZCBjaGFyICopemRlYnVnX3RhYmxlLCBw bywKKwkJCQljaGRyLT5jaF9zaXplKSkKKwlnb3RvIHNraXA7CisgICAgICBicmVhazsKKworICAg IGRlZmF1bHQ6CisgICAgICAvKiBVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiBhbGdvcml0aG0uICAq LworICAgICAgZ290byBza2lwOworICAgIH0KIAogICAqdW5jb21wcmVzc2VkID0gcG87CiAgICp1 bmNvbXByZXNzZWRfc2l6ZSA9IGNoZHItPmNoX3NpemU7CiAKICAgcmV0dXJuIDE7CisKKyBza2lw OgorICBpZiAoYWxjICE9IE5VTEwgJiYgYWxjX2xlbiA+IDApCisgICAgYmFja3RyYWNlX2ZyZWUg KHN0YXRlLCBhbGMsIGFsY19sZW4sIGVycm9yX2NhbGxiYWNrLCBkYXRhKTsKKyAgcmV0dXJuIDE7 CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciB0ZXN0aW5nIHRoZSB6bGliIHN1 cHBvcnQuICBJdCBpcyBvbmx5CkBAIC0yNjc1LDYgKzQ4OTUsMzEgQEAgYmFja3RyYWNlX3VuY29t cHJlc3NfemRlYnVnIChzdHJ1Y3QgYmFja3RyYWNlX3N0YXRlICpzdGF0ZSwKICAgcmV0dXJuIHJl dDsKIH0KIAorLyogVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIHRlc3RpbmcgdGhlIHpzdGQg c3VwcG9ydC4gIEl0IGlzIG9ubHkgdXNlZCBieQorICAgdGVzdHMuICAqLworCitpbnQKK2JhY2t0 cmFjZV91bmNvbXByZXNzX3pzdGQgKHN0cnVjdCBiYWNrdHJhY2Vfc3RhdGUgKnN0YXRlLAorCQkJ ICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29tcHJlc3NlZCwKKwkJCSAgIHNpemVfdCBjb21wcmVz c2VkX3NpemUsCisJCQkgICBiYWNrdHJhY2VfZXJyb3JfY2FsbGJhY2sgZXJyb3JfY2FsbGJhY2ss CisJCQkgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyICp1bmNvbXByZXNzZWQsCisJCQkgICBz aXplX3QgdW5jb21wcmVzc2VkX3NpemUpCit7CisgIHVuc2lnbmVkIGNoYXIgKnpkZWJ1Z190YWJs ZTsKKyAgaW50IHJldDsKKworICB6ZGVidWdfdGFibGUgPSAoKHVuc2lnbmVkIGNoYXIgKikgYmFj a3RyYWNlX2FsbG9jIChzdGF0ZSwgWkRFQlVHX1RBQkxFX1NJWkUsCisJCQkJCQkgICAgIGVycm9y X2NhbGxiYWNrLCBkYXRhKSk7CisgIGlmICh6ZGVidWdfdGFibGUgPT0gTlVMTCkKKyAgICByZXR1 cm4gMDsKKyAgcmV0ID0gZWxmX3pzdGRfZGVjb21wcmVzcyAoY29tcHJlc3NlZCwgY29tcHJlc3Nl ZF9zaXplLAorCQkJICAgICB6ZGVidWdfdGFibGUsIHVuY29tcHJlc3NlZCwgdW5jb21wcmVzc2Vk X3NpemUpOworICBiYWNrdHJhY2VfZnJlZSAoc3RhdGUsIHpkZWJ1Z190YWJsZSwgWkRFQlVHX1RB QkxFX1NJWkUsCisJCSAgZXJyb3JfY2FsbGJhY2ssIGRhdGEpOworICByZXR1cm4gcmV0OworfQor CiAvKiBOdW1iZXIgb2YgTFpNQSBzdGF0ZXMuICAqLwogI2RlZmluZSBMWk1BX1NUQVRFUyAoMTIp CiAKQEAgLTQ2NzEsNyArNjkxNiw3IEBAIGVsZl9hZGQgKHN0cnVjdCBiYWNrdHJhY2Vfc3RhdGUg KnN0YXRlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRlc2NyaXB0b3IsCiAJICBpZiAoemRl YnVnX3RhYmxlID09IE5VTEwpCiAJICAgIHsKIAkgICAgICB6ZGVidWdfdGFibGUgPSAoKHVpbnQx Nl90ICopCi0JCQkgICAgICBiYWNrdHJhY2VfYWxsb2MgKHN0YXRlLCBaREVCVUdfVEFCTEVfU0la RSwKKwkJCSAgICAgIGJhY2t0cmFjZV9hbGxvYyAoc3RhdGUsIFpMSUJfVEFCTEVfU0laRSwKIAkJ CQkJICAgICAgIGVycm9yX2NhbGxiYWNrLCBkYXRhKSk7CiAJICAgICAgaWYgKHpkZWJ1Z190YWJs ZSA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CkBAIC00Njk3LDggKzY5NDIsMTUgQEAgZWxmX2FkZCAo c3RydWN0IGJhY2t0cmFjZV9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQg ZGVzY3JpcHRvciwKIAl9CiAgICAgfQogCisgIGlmICh6ZGVidWdfdGFibGUgIT0gTlVMTCkKKyAg ICB7CisgICAgICBiYWNrdHJhY2VfZnJlZSAoc3RhdGUsIHpkZWJ1Z190YWJsZSwgWkxJQl9UQUJM RV9TSVpFLAorCQkgICAgICBlcnJvcl9jYWxsYmFjaywgZGF0YSk7CisgICAgICB6ZGVidWdfdGFi bGUgPSBOVUxMOworICAgIH0KKwogICAvKiBVbmNvbXByZXNzIHRoZSBvZmZpY2lhbCBFTEYgZm9y bWF0Ci0gICAgICgtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ2FiaSkuICAqLworICAg ICAoLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16bGliLWdhYmksIC0tY29tcHJlc3MtZGVidWct c2VjdGlvbnM9enN0ZCkuICAqLwogICBmb3IgKGkgPSAwOyBpIDwgKGludCkgREVCVUdfTUFYOyAr K2kpCiAgICAgewogICAgICAgdW5zaWduZWQgY2hhciAqdW5jb21wcmVzc2VkX2RhdGE7CmRpZmYg LS1naXQgYS9saWJiYWNrdHJhY2UvaW50ZXJuYWwuaCBiL2xpYmJhY2t0cmFjZS9pbnRlcm5hbC5o CmluZGV4IDFlNWIyNjlmYjNiLi45NWU4ODQ1NThlNCAxMDA2NDQKLS0tIGEvbGliYmFja3RyYWNl L2ludGVybmFsLmgKKysrIGIvbGliYmFja3RyYWNlL2ludGVybmFsLmgKQEAgLTM2OCw2ICszNjgs MTUgQEAgZXh0ZXJuIGludCBiYWNrdHJhY2VfdW5jb21wcmVzc196ZGVidWcgKHN0cnVjdCBiYWNr dHJhY2Vfc3RhdGUgKiwKIAkJCQkJdW5zaWduZWQgY2hhciAqKnVuY29tcHJlc3NlZCwKIAkJCQkJ c2l6ZV90ICp1bmNvbXByZXNzZWRfc2l6ZSk7CiAKKy8qIEEgdGVzdC1vbmx5IGhvb2sgZm9yIGVs Zl96c3RkX2RlY29tcHJlc3MuICAqLworCitleHRlcm4gaW50IGJhY2t0cmFjZV91bmNvbXByZXNz X3pzdGQgKHN0cnVjdCBiYWNrdHJhY2Vfc3RhdGUgKiwKKwkJCQkgICAgICBjb25zdCB1bnNpZ25l ZCBjaGFyICpjb21wcmVzc2VkLAorCQkJCSAgICAgIHNpemVfdCBjb21wcmVzc2VkX3NpemUsCisJ CQkJICAgICAgYmFja3RyYWNlX2Vycm9yX2NhbGxiYWNrLCB2b2lkICpkYXRhLAorCQkJCSAgICAg IHVuc2lnbmVkIGNoYXIgKnVuY29tcHJlc3NlZCwKKwkJCQkgICAgICBzaXplX3QgdW5jb21wcmVz c2VkX3NpemUpOworCiAvKiBBIHRlc3Qtb25seSBob29rIGZvciBlbGZfdW5jb21wcmVzc19sem1h LiAgKi8KIAogZXh0ZXJuIGludCBiYWNrdHJhY2VfdW5jb21wcmVzc19sem1hIChzdHJ1Y3QgYmFj a3RyYWNlX3N0YXRlICosCmRpZmYgLS1naXQgYS9saWJiYWNrdHJhY2UvenN0ZHRlc3QuYyBiL2xp YmJhY2t0cmFjZS96c3RkdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwLi5mZTMxYjE1N2E0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJhY2t0cmFjZS96c3RkdGVz dC5jCkBAIC0wLDAgKzEsNTIzIEBACisvKiB6dGVzdC5jIC0tIFRlc3QgZm9yIGxpYmJhY2t0cmFj ZSB6c3RkIGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEdvb2dsZS4KKworUmVk aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3 aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgICAoMSkgUmVkaXN0cmlidXRpb25zIG9m IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisK KyAgICAoMikgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo ZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgICAgZGlzdHJpYnV0aW9uLgor CisgICAgKDMpIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvCisgICAg ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdp dGhvdXQKKyAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09G VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNT IE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU SEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg VEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCitJTkRJUkVDVCwgSU5DSURFTlRB TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJ TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP UgorU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ TlRFUlJVUFRJT04pCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCitTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKK0lOIEFOWSBXQVkgT1VUIE9G IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lC SUxJVFkgT0YgU1VDSCBEQU1BR0UuICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNs dWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+Cisj aW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBl cy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZmRlZiBIQVZFX1pTVEQKKyNpbmNsdWRl IDx6c3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJhY2t0cmFjZS5oIgorI2luY2x1ZGUgImJh Y2t0cmFjZS1zdXBwb3J0ZWQuaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAi dGVzdGxpYi5oIgorCisjaWZuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQorCit0eXBlZGVmIGludCB4 Y2xvY2tpZF90OworCitzdGF0aWMgaW50Cit4Y2xvY2tfZ2V0dGltZSAoeGNsb2NraWRfdCBpZCBB VFRSSUJVVEVfVU5VU0VELAorCQlzdHJ1Y3QgdGltZXNwZWMgKnRzIEFUVFJJQlVURV9VTlVTRUQp Cit7CisgIGVycm5vID0gRUlOVkFMOworICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgY2xvY2tp ZF90IHhjbG9ja2lkX3QKKyNkZWZpbmUgY2xvY2tfZ2V0dGltZSB4Y2xvY2tfZ2V0dGltZQorI3Vu ZGVmIENMT0NLX1JFQUxUSU1FCisjZGVmaW5lIENMT0NLX1JFQUxUSU1FIDAKKworI2VuZGlmIC8q ICFkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkgKi8KKworI2lmZGVmIENMT0NLX1BST0NFU1Nf Q1BVVElNRV9JRAorI2RlZmluZSBaU1REX0NMT0NLX0dFVFRJTUVfQVJHIENMT0NLX1BST0NFU1Nf Q1BVVElNRV9JRAorI2Vsc2UKKyNkZWZpbmUgWlNURF9DTE9DS19HRVRUSU1FX0FSRyBDTE9DS19S RUFMVElNRQorI2VuZGlmCisKKy8qIFNvbWUgdGVzdHMgZm9yIHRoZSBsb2NhbCB6c3RkIGluZmxh dGlvbiBjb2RlLiAgKi8KKworc3RydWN0IHpzdGRfdGVzdAoreworICBjb25zdCBjaGFyICpuYW1l OworICBjb25zdCBjaGFyICp1bmNvbXByZXNzZWQ7CisgIHNpemVfdCB1bmNvbXByZXNzZWRfbGVu OworICBjb25zdCBjaGFyICpjb21wcmVzc2VkOworICBzaXplX3QgY29tcHJlc3NlZF9sZW47Cit9 OworCisvKiBFcnJvciBjYWxsYmFjay4gICovCisKK3N0YXRpYyB2b2lkCitlcnJvcl9jYWxsYmFj a19jb21wcmVzcyAodm9pZCAqdmRhdGEgQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNn LAorCQkJIGludCBlcnJudW0pCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzIiwgbXNnKTsKKyAg aWYgKGVycm51bSA+IDApCisgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAlcyIsIHN0cmVycm9yIChl cnJudW0pKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgZXhpdCAoRVhJVF9GQUlMVVJF KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB6c3RkX3Rlc3QgdGVzdHNbXSA9Cit7CisgIHsK KyAgICAiZW1wdHkiLAorICAgICIiLAorICAgIDAsCisgICAgIlx4MjhceGI1XHgyZlx4ZmRceDI0 XHgwMFx4MDFceDAwXHgwMFx4OTlceGU5XHhkOFx4NTEiLAorICAgIDEzLAorICB9LAorICB7Cisg ICAgImhlbGxvIiwKKyAgICAiaGVsbG8sIHdvcmxkXG4iLAorICAgIDAsCisgICAgKCJceDI4XHhi NVx4MmZceGZkXHgyNFx4MGRceDY5XHgwMFx4MDBceDY4XHg2NVx4NmNceDZjXHg2Zlx4MmNceDIw IgorICAgICAiXHg3N1x4NmZceDcyXHg2Y1x4NjRceDBhXHg0Y1x4MWZceGY5XHhmMSIpLAorICAg IDI2LAorICB9LAorICB7CisgICAgImdvb2RieWUiLAorICAgICJnb29kYnllLCB3b3JsZCIsCisg ICAgMCwKKyAgICAoIlx4MjhceGI1XHgyZlx4ZmRceDI0XHgwZVx4NzFceDAwXHgwMFx4NjdceDZm XHg2Zlx4NjRceDYyXHg3OVx4NjUiCisgICAgICJceDJjXHgyMFx4NzdceDZmXHg3Mlx4NmNceDY0 XHg2MVx4N2JceDRiXHg4MyIpLAorICAgIDI3LAorICB9LAorICB7CisgICAgInJhbmdlcyIsCisg ICAgKCJceGNjXHgxMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZDVceDEzXHgwMFx4MDBceDAw XHgwMFx4MDBceDAwIgorICAgICAiXHgxY1x4MTRceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDcy XHgxNFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4OWRceDE0XHgwMFx4MDBceDAw XHgwMFx4MDBceDAwXHhkNVx4MTRceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceDAw XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBc eDAwIgorICAgICAiXHhmYlx4MTJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDA5XHgxM1x4MDBc eDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4MGNceDEzXHgwMFx4MDBceDAwXHgwMFx4MDBc eDAwXHhjYlx4MTNceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceDI5XHgxNFx4MDBc eDAwXHgwMFx4MDBceDAwXHgwMFx4NGVceDE0XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAg ICAiXHg5ZFx4MTRceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGQ1XHgxNFx4MDBceDAwXHgwMFx4 MDBceDAwXHgwMCIKKyAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4 MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceGZiXHgxMlx4MDBceDAwXHgwMFx4 MDBceDAwXHgwMFx4MDlceDEzXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHg2N1x4 MTNceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGNiXHgxM1x4MDBceDAwXHgwMFx4MDBceDAwXHgw MCIKKyAgICAgIlx4OWRceDE0XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhkNVx4MTRceDAwXHgw MFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgw MFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHg1Zlx4MGJceDAwXHgw MFx4MDBceDAwXHgwMFx4MDBceDZjXHgwYlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAg Ilx4N2RceDBiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg3ZVx4MGNceDAwXHgwMFx4MDBceDAw XHgwMFx4MDAiCisgICAgICJceDM4XHgwZlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4NWNceDBm XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAw XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4ODNceDBj XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhmYVx4MGNceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAi CisgICAgICJceGZkXHgwZFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZWZceDBlXHgwMFx4MDBc eDAwXHgwMFx4MDBceDAwIgorICAgICAiXHgxNFx4MGZceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBc eDM4XHgwZlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4OWZceDBmXHgwMFx4MDBc eDAwXHgwMFx4MDBceDAwXHhhY1x4MGZceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJc eGRiXHgwZlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZmZceDBmXHgwMFx4MDBceDAwXHgwMFx4 MDBceDAwIgorICAgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4 MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4ZmRceDBkXHgwMFx4MDBceDAwXHgwMFx4 MDBceDAwXHhkOFx4MGVceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceDlmXHgwZlx4 MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4YWNceDBmXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgor ICAgICAiXHhkYlx4MGZceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGZmXHgwZlx4MDBceDAwXHgw MFx4MDBceDAwXHgwMCIKKyAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgw MFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceGZhXHgwY1x4MDBceDAwXHgw MFx4MDBceDAwXHgwMFx4ZWFceDBkXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHhl Zlx4MGVceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDE0XHgwZlx4MDBceDAwXHgwMFx4MDBceDAw XHgwMCIKKyAgICAgIlx4NWNceDBmXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg5Zlx4MGZceDAw XHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICJceGFjXHgwZlx4MDBceDAwXHgwMFx4MDBceDAw XHgwMFx4ZGJceDBmXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHhmZlx4MGZceDAw XHgwMFx4MDBceDAwXHgwMFx4MDBceDJjXHgxMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAg ICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBc eDAwXHgwMFx4MDAiCisgICAgICJceDYwXHgxMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZDFc eDE2XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHg0MFx4MGJceDAwXHgwMFx4MDBc eDAwXHgwMFx4MDBceDJjXHgxMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4MDBc eDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4 MDAiCisgICAgICJceDdhXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4YjZceDAwXHgwMFx4 MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAiXHg5Zlx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4 MDBceGE3XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4MDBceDAwXHgwMFx4 MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAg ICJceDdhXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4YTlceDAwXHgwMFx4MDBceDAwXHgw MFx4MDBceDAwIgorICAgICAiXHg5Zlx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGE3XHgw MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgw MFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiKSwKKyAgICA2NzIsCisg ICAgKCJceDI4XHhiNVx4MmZceGZkXHg2NFx4YTBceDAxXHgyZFx4MDVceDAwXHhjNFx4MDRceGNj XHgxMVx4MDBceGQ1IgorICAgICAiXHgxM1x4MDBceDFjXHgxNFx4MDBceDcyXHg5ZFx4ZDVceGZi XHgxMlx4MDBceDA5XHgwY1x4MTNceGNiXHgxMyIKKyAgICAgIlx4MjlceDRlXHg2N1x4NWZceDBi XHg2Y1x4MGJceDdkXHgwYlx4N2VceDBjXHgzOFx4MGZceDVjXHgwZlx4ODMiCisgICAgICJceDBj XHhmYVx4MGNceGZkXHgwZFx4ZWZceDBlXHgxNFx4MzhceDlmXHgwZlx4YWNceDBmXHhkYlx4MGZc eGZmIgorICAgICAiXHgwZlx4ZDhceDlmXHhhY1x4ZGJceGZmXHhlYVx4NWNceDJjXHgxMFx4NjBc eGQxXHgxNlx4NDBceDBiXHg3YSIKKyAgICAgIlx4MDBceGI2XHgwMFx4OWZceDAxXHhhN1x4MDFc eGE5XHgzNlx4MjBceGEwXHg4M1x4MTRceDM0XHg2M1x4NGEiCisgICAgICJceDIxXHg3MFx4OGNc eDA3XHg0Nlx4MDNceDRlXHgxMFx4NjJceDNjXHgwNlx4NGVceGM4XHg4Y1x4YjBceDMyIgorICAg ICAiXHgyYVx4NTlceGFkXHhiMlx4ZjFceDAyXHg4Mlx4N2NceDMzXHhjYlx4OTJceDZmXHgzMlx4 NGZceDliXHhiMCIKKyAgICAgIlx4YTJceDMwXHhmMFx4YzBceDA2XHgxZVx4OThceDk5XHgyY1x4 MDZceDFlXHhkOFx4YzBceDAzXHg1Nlx4ZDgiCisgICAgICJceGMwXHgwM1x4MGZceDZjXHhlMFx4 MDFceGYxXHhmMFx4ZWVceDlhXHhjNlx4YzhceDk3XHg5OVx4ZDFceDZjIgorICAgICAiXHhiNFx4 MjFceDQ1XHgzYlx4MTBceGU0XHg3Ylx4OTlceDRkXHg4YVx4MzZceDY0XHg1Y1x4NzdceDA4XHgw MiIKKyAgICAgIlx4Y2JceGUwXHhjZSIpLAorICAgIDE3OSwKKyAgfQorfTsKKworLyogVGVzdCB0 aGUgaGFuZCBjb2RlZCBzYW1wbGVzLiAgKi8KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2FtcGxlcyAo c3RydWN0IGJhY2t0cmFjZV9zdGF0ZSAqc3RhdGUpCit7CisgIHNpemVfdCBpOworCisgIGZvciAo aSA9IDA7IGkgPCBzaXplb2YgdGVzdHMgLyBzaXplb2YgdGVzdHNbMF07ICsraSkKKyAgICB7Cisg ICAgICB1bnNpZ25lZCBjaGFyICp1bmNvbXByZXNzZWQ7CisgICAgICBzaXplX3QgdW5jb21wcmVz c2VkX2xlbjsKKworICAgICAgdW5jb21wcmVzc2VkID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9j ICh0ZXN0c1tpXS51bmNvbXByZXNzZWRfbGVuKTsKKyAgICAgIGlmICh1bmNvbXByZXNzZWQgPT0g TlVMTCkKKwl7CisJICBwZXJyb3IgKCJtYWxsb2MiKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgInRl c3QgJXM6IHVuY29tcHJlc3MgZmFpbGVkXG4iLCB0ZXN0c1tpXS5uYW1lKTsKKwkgICsrZmFpbHVy ZXM7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHVuY29tcHJlc3NlZF9sZW4gPSB0ZXN0c1tp XS51bmNvbXByZXNzZWRfbGVuOworICAgICAgaWYgKHVuY29tcHJlc3NlZF9sZW4gPT0gMCkKKwl1 bmNvbXByZXNzZWRfbGVuID0gc3RybGVuICh0ZXN0c1tpXS51bmNvbXByZXNzZWQpOworCisgICAg ICBpZiAoIWJhY2t0cmFjZV91bmNvbXByZXNzX3pzdGQgKHN0YXRlLAorCQkJCSAgICAgICgoY29u c3QgdW5zaWduZWQgY2hhciAqKQorCQkJCSAgICAgICB0ZXN0c1tpXS5jb21wcmVzc2VkKSwKKwkJ CQkgICAgICB0ZXN0c1tpXS5jb21wcmVzc2VkX2xlbiwKKwkJCQkgICAgICBlcnJvcl9jYWxsYmFj a19jb21wcmVzcywgTlVMTCwKKwkJCQkgICAgICB1bmNvbXByZXNzZWQsIHVuY29tcHJlc3NlZF9s ZW4pKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgInRlc3QgJXM6IHVuY29tcHJlc3MgZmFpbGVk XG4iLCB0ZXN0c1tpXS5uYW1lKTsKKwkgICsrZmFpbHVyZXM7CisJfQorICAgICAgZWxzZQorCXsK KwkgIGlmIChtZW1jbXAgKHRlc3RzW2ldLnVuY29tcHJlc3NlZCwgdW5jb21wcmVzc2VkLCB1bmNv bXByZXNzZWRfbGVuKQorCSAgICAgICE9IDApCisJICAgIHsKKwkgICAgICBzaXplX3QgajsKKwor CSAgICAgIGZwcmludGYgKHN0ZGVyciwgInRlc3QgJXM6IHVuY29tcHJlc3NlZCBkYXRhIG1pc21h dGNoXG4iLAorCQkgICAgICAgdGVzdHNbaV0ubmFtZSk7CisJICAgICAgZm9yIChqID0gMDsgaiA8 IHVuY29tcHJlc3NlZF9sZW47ICsraikKKwkJaWYgKHRlc3RzW2ldLnVuY29tcHJlc3NlZFtqXSAh PSB1bmNvbXByZXNzZWRbal0pCisJCSAgZnByaW50ZiAoc3RkZXJyLCAiICAlenU6IGdvdCAlI3gg d2FudCAlI3hcbiIsIGosCisJCQkgICB1bmNvbXByZXNzZWRbal0sIHRlc3RzW2ldLnVuY29tcHJl c3NlZFtqXSk7CisJICAgICAgKytmYWlsdXJlczsKKwkgICAgfQorCSAgZWxzZQorCSAgICBwcmlu dGYgKCJQQVNTOiB1bmNvbXByZXNzICVzXG4iLCB0ZXN0c1tpXS5uYW1lKTsKKwl9CisKKyAgICAg IGZyZWUgKHVuY29tcHJlc3NlZCk7CisgICAgfQorfQorCisjaWZkZWYgSEFWRV9aU1RECisKKy8q IEdpdmVuIGEgc2V0IG9mIFRSSUFMUyB0aW1pbmdzLCBkaXNjYXJkIHRoZSBsb3dlc3QgYW5kIGhp Z2hlc3QKKyAgIHZhbHVlcyBhbmQgcmV0dXJuIHRoZSBtZWFuIGF2ZXJhZ2Ugb2YgdGhlIHJlc3Qu ICAqLworCitzdGF0aWMgc2l6ZV90CithdmVyYWdlX3RpbWUgKGNvbnN0IHNpemVfdCAqdGltZXMs IHNpemVfdCB0cmlhbHMpCit7CisgIHNpemVfdCBpbWF4OworICBzaXplX3QgbWF4OworICBzaXpl X3QgaW1pbjsKKyAgc2l6ZV90IG1pbjsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCBzdW07CisKKyAg aW1pbiA9IDA7CisgIGltYXggPSAwOworICBtaW4gPSB0aW1lc1swXTsKKyAgbWF4ID0gdGltZXNb MF07CisgIGZvciAoaSA9IDE7IGkgPCB0cmlhbHM7ICsraSkKKyAgICB7CisgICAgICBpZiAodGlt ZXNbaV0gPCBtaW4pCisJeworCSAgaW1pbiA9IGk7CisJICBtaW4gPSB0aW1lc1tpXTsKKwl9Cisg ICAgICBpZiAodGltZXNbaV0gPiBtYXgpCisJeworCSAgaW1heCA9IGk7CisJICBtYXggPSB0aW1l c1tpXTsKKwl9CisgICAgfQorCisgIHN1bSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCB0cmlhbHM7 ICsraSkKKyAgICB7CisgICAgICBpZiAoaSAhPSBpbWF4ICYmIGkgIT0gaW1pbikKKwlzdW0gKz0g dGltZXNbaV07CisgICAgfQorICByZXR1cm4gc3VtIC8gKHRyaWFscyAtIDIpOworfQorCisjZW5k aWYKKworLyogVGVzdCBhIGxhcmdlciB0ZXh0LCBpZiBhdmFpbGFibGUuICAqLworCitzdGF0aWMg dm9pZAordGVzdF9sYXJnZSAoc3RydWN0IGJhY2t0cmFjZV9zdGF0ZSAqc3RhdGUgQVRUUklCVVRF X1VOVVNFRCkKK3sKKyNpZmRlZiBIQVZFX1pTVEQKKyAgdW5zaWduZWQgY2hhciAqb3JpZ19idWY7 CisgIHNpemVfdCBvcmlnX2J1ZnNpemU7CisgIHNpemVfdCBpOworICBjaGFyICpjb21wcmVzc2Vk X2J1ZjsKKyAgc2l6ZV90IGNvbXByZXNzZWRfYnVmc2l6ZTsKKyAgc2l6ZV90IGNvbXByZXNzZWRf c2l6ZTsKKyAgdW5zaWduZWQgY2hhciAqdW5jb21wcmVzc2VkX2J1ZjsKKyAgc2l6ZV90IHI7Cisg IGNsb2NraWRfdCBjaWQ7CisgIHN0cnVjdCB0aW1lc3BlYyB0czE7CisgIHN0cnVjdCB0aW1lc3Bl YyB0czI7CisgIHNpemVfdCBjdGltZTsKKyAgc2l6ZV90IHp0aW1lOworICBjb25zdCBzaXplX3Qg dHJpYWxzID0gMTY7CisgIHNpemVfdCBjdGltZXNbMTZdOworICBzaXplX3QgenRpbWVzWzE2XTsK KyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1tdID0geworICAgICJJc2FhYy5OZXd0 b24tT3B0aWNrcy50eHQiLAorICAgICIuLi9saWJnby9nby90ZXN0ZGF0YS9Jc2FhYy5OZXd0b24t T3B0aWNrcy50eHQiLAorICB9OworCisgIG9yaWdfYnVmID0gTlVMTDsKKyAgb3JpZ19idWZzaXpl ID0gMDsKKyAgdW5jb21wcmVzc2VkX2J1ZiA9IE5VTEw7CisgIGNvbXByZXNzZWRfYnVmID0gTlVM TDsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdOyAr K2kpCisgICAgeworICAgICAgc2l6ZV90IGxlbjsKKyAgICAgIGNoYXIgKm5hbWVidWY7CisgICAg ICBGSUxFICplOworICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICBjaGFyICpyYnVmOworICAg ICAgc2l6ZV90IGdvdDsKKworICAgICAgbGVuID0gc3RybGVuIChTUkNESVIpICsgc3RybGVuIChu YW1lc1tpXSkgKyAyOworICAgICAgbmFtZWJ1ZiA9IG1hbGxvYyAobGVuKTsKKyAgICAgIGlmIChu YW1lYnVmID09IE5VTEwpCisJeworCSAgcGVycm9yICgibWFsbG9jIik7CisJICBnb3RvIGZhaWw7 CisJfQorICAgICAgc25wcmludGYgKG5hbWVidWYsIGxlbiwgIiVzLyVzIiwgU1JDRElSLCBuYW1l c1tpXSk7CisgICAgICBlID0gZm9wZW4gKG5hbWVidWYsICJyIik7CisgICAgICBmcmVlIChuYW1l YnVmKTsKKyAgICAgIGlmIChlID09IE5VTEwpCisJY29udGludWU7CisgICAgICBpZiAoZnN0YXQg KGZpbGVubyAoZSksICZzdCkgPCAwKQorCXsKKwkgIHBlcnJvciAoImZzdGF0Iik7CisJICBmY2xv c2UgKGUpOworCSAgY29udGludWU7CisJfQorICAgICAgcmJ1ZiA9IG1hbGxvYyAoc3Quc3Rfc2l6 ZSk7CisgICAgICBpZiAocmJ1ZiA9PSBOVUxMKQorCXsKKwkgIHBlcnJvciAoIm1hbGxvYyIpOwor CSAgZ290byBmYWlsOworCX0KKyAgICAgIGdvdCA9IGZyZWFkIChyYnVmLCAxLCBzdC5zdF9zaXpl LCBlKTsKKyAgICAgIGZjbG9zZSAoZSk7CisgICAgICBpZiAoZ290ID4gMCkKKwl7CisJICBvcmln X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJidWY7CisJICBvcmlnX2J1ZnNpemUgPSBnb3Q7CisJ ICBicmVhazsKKwl9CisgICAgICBmcmVlIChyYnVmKTsKKyAgICB9CisKKyAgaWYgKG9yaWdfYnVm ID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgY291bGRuJ3QgZmluZCBhbiBpbnB1dCBmaWxl LiAgKi8KKyAgICAgIHByaW50ZiAoIlVOU1VQUE9SVEVEOiB6c3RkIGxhcmdlXG4iKTsKKyAgICAg IHJldHVybjsKKyAgICB9CisKKyAgY29tcHJlc3NlZF9idWZzaXplID0gWlNURF9jb21wcmVzc0Jv dW5kIChvcmlnX2J1ZnNpemUpOworICBjb21wcmVzc2VkX2J1ZiA9IG1hbGxvYyAoY29tcHJlc3Nl ZF9idWZzaXplKTsKKyAgaWYgKGNvbXByZXNzZWRfYnVmID09IE5VTEwpCisgICAgeworICAgICAg cGVycm9yICgibWFsbG9jIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIHIgPSBaU1RE X2NvbXByZXNzIChjb21wcmVzc2VkX2J1ZiwgY29tcHJlc3NlZF9idWZzaXplLAorCQkgICAgIG9y aWdfYnVmLCBvcmlnX2J1ZnNpemUsCisJCSAgICAgWlNURF9DTEVWRUxfREVGQVVMVCk7CisgIGlm IChaU1REX2lzRXJyb3IgKHIpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInpzdGQg Y29tcHJlc3MgZmFpbGVkOiAlc1xuIiwgWlNURF9nZXRFcnJvck5hbWUgKHIpKTsKKyAgICAgIGdv dG8gZmFpbDsKKyAgICB9CisgIGNvbXByZXNzZWRfc2l6ZSA9IHI7CisKKyAgdW5jb21wcmVzc2Vk X2J1ZiA9IG1hbGxvYyAob3JpZ19idWZzaXplKTsKKyAgaWYgKHVuY29tcHJlc3NlZF9idWYgPT0g TlVMTCkKKyAgICB7CisgICAgICBwZXJyb3IgKCJtYWxsb2MiKTsKKyAgICAgIGdvdG8gZmFpbDsK KyAgICB9CisKKyAgaWYgKCFiYWNrdHJhY2VfdW5jb21wcmVzc196c3RkIChzdGF0ZSwgKHVuc2ln bmVkIGNoYXIgKikgY29tcHJlc3NlZF9idWYsCisJCQkJICBjb21wcmVzc2VkX3NpemUsCisJCQkJ ICBlcnJvcl9jYWxsYmFja19jb21wcmVzcywgTlVMTCwKKwkJCQkgIHVuY29tcHJlc3NlZF9idWYs IG9yaWdfYnVmc2l6ZSkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAienN0ZCBsYXJn ZTogYmFja3RyYWNlX3VuY29tcHJlc3NfenN0ZCBmYWlsZWRcbiIpOworICAgICAgZ290byBmYWls OworICAgIH0KKworICBpZiAobWVtY21wICh1bmNvbXByZXNzZWRfYnVmLCBvcmlnX2J1Ziwgb3Jp Z19idWZzaXplKSAhPSAwKQorICAgIHsKKyAgICAgIHNpemVfdCBqOworCisgICAgICBmcHJpbnRm IChzdGRlcnIsICJ6c3RkIGxhcmdlOiB1bmNvbXByZXNzZWQgZGF0YSBtaXNtYXRjaFxuIik7Cisg ICAgICBmb3IgKGogPSAwOyBqIDwgb3JpZ19idWZzaXplOyArK2opCisJaWYgKG9yaWdfYnVmW2pd ICE9IHVuY29tcHJlc3NlZF9idWZbal0pCisJICBmcHJpbnRmIChzdGRlcnIsICIgICV6dTogZ290 ICUjeCB3YW50ICUjeFxuIiwgaiwKKwkJICAgdW5jb21wcmVzc2VkX2J1ZltqXSwgb3JpZ19idWZb al0pOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICBwcmludGYgKCJQQVNTOiB6c3RkIGxh cmdlXG4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgdHJpYWxzOyArK2kpCisgICAgeworICAgICAg Y2lkID0gWlNURF9DTE9DS19HRVRUSU1FX0FSRzsKKyAgICAgIGlmIChjbG9ja19nZXR0aW1lIChj aWQsICZ0czEpIDwgMCkKKwl7CisJICBpZiAoZXJybm8gPT0gRUlOVkFMKQorCSAgICByZXR1cm47 CisJICBwZXJyb3IgKCJjbG9ja19nZXR0aW1lIik7CisJICByZXR1cm47CisJfQorCisgICAgICBp ZiAoIWJhY2t0cmFjZV91bmNvbXByZXNzX3pzdGQgKHN0YXRlLAorCQkJCSAgICAgICh1bnNpZ25l ZCBjaGFyICopIGNvbXByZXNzZWRfYnVmLAorCQkJCSAgICAgIGNvbXByZXNzZWRfc2l6ZSwKKwkJ CQkgICAgICBlcnJvcl9jYWxsYmFja19jb21wcmVzcywgTlVMTCwKKwkJCQkgICAgICB1bmNvbXBy ZXNzZWRfYnVmLAorCQkJCSAgICAgIG9yaWdfYnVmc2l6ZSkpCisJeworCSAgZnByaW50ZiAoc3Rk ZXJyLAorCQkgICAoInpzdGQgbGFyZ2U6ICIKKwkJICAgICJiZW5jaG1hcmsgYmFja3RyYWNlX3Vu Y29tcHJlc3NfenN0ZCBmYWlsZWRcbiIpKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChj bG9ja19nZXR0aW1lIChjaWQsICZ0czIpIDwgMCkKKwl7CisJICBwZXJyb3IgKCJjbG9ja19nZXR0 aW1lIik7CisJICByZXR1cm47CisJfQorCisgICAgICBjdGltZSA9ICh0czIudHZfc2VjIC0gdHMx LnR2X3NlYykgKiAxMDAwMDAwMDAwOworICAgICAgY3RpbWUgKz0gdHMyLnR2X25zZWMgLSB0czEu dHZfbnNlYzsKKyAgICAgIGN0aW1lc1tpXSA9IGN0aW1lOworCisgICAgICBpZiAoY2xvY2tfZ2V0 dGltZSAoY2lkLCAmdHMxKSA8IDApCisJeworCSAgcGVycm9yKCJjbG9ja19nZXR0aW1lIik7CisJ ICByZXR1cm47CisJfQorCisgICAgICByID0gWlNURF9kZWNvbXByZXNzICh1bmNvbXByZXNzZWRf YnVmLCBvcmlnX2J1ZnNpemUsCisJCQkgICBjb21wcmVzc2VkX2J1ZiwgY29tcHJlc3NlZF9zaXpl KTsKKworICAgICAgaWYgKGNsb2NrX2dldHRpbWUgKGNpZCwgJnRzMikgPCAwKQorCXsKKwkgIHBl cnJvciAoImNsb2NrX2dldHRpbWUiKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChaU1RE X2lzRXJyb3IgKHIpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgInpzdGQgbGFyZ2U6 IGJlbmNobWFyayB6bGliIHVuY29tcHJlc3MgZmFpbGVkOiAlc1xuIiwKKwkJICAgWlNURF9nZXRF cnJvck5hbWUgKHIpKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHp0aW1lID0gKHRzMi50dl9z ZWMgLSB0czEudHZfc2VjKSAqIDEwMDAwMDAwMDA7CisgICAgICB6dGltZSArPSB0czIudHZfbnNl YyAtIHRzMS50dl9uc2VjOworICAgICAgenRpbWVzW2ldID0genRpbWU7CisgICAgfQorCisgIC8q IFRvc3MgdGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCB0aW1lcyBhbmQgYXZlcmFnZSB0aGUgcmVzdC4g ICovCisgIGN0aW1lID0gYXZlcmFnZV90aW1lIChjdGltZXMsIHRyaWFscyk7CisgIHp0aW1lID0g YXZlcmFnZV90aW1lICh6dGltZXMsIHRyaWFscyk7CisKKyAgcHJpbnRmICgiYmFja3RyYWNlOiAl enUgbnNcbiIsIGN0aW1lKTsKKyAgcHJpbnRmICgienN0ZCAgICAgOiAlenUgbnNcbiIsIHp0aW1l KTsKKyAgcHJpbnRmICgicmF0aW8gICAgOiAlZ1xuIiwgKGRvdWJsZSkgenRpbWUgLyAoZG91Ymxl KSBjdGltZSk7CisKKyAgcmV0dXJuOworCisgZmFpbDoKKyAgcHJpbnRmICgiRkFJTDogenN0ZCBs YXJnZVxuIik7CisgICsrZmFpbHVyZXM7CisKKyAgaWYgKG9yaWdfYnVmICE9IE5VTEwpCisgICAg ZnJlZSAob3JpZ19idWYpOworICBpZiAoY29tcHJlc3NlZF9idWYgIT0gTlVMTCkKKyAgICBmcmVl IChjb21wcmVzc2VkX2J1Zik7CisgIGlmICh1bmNvbXByZXNzZWRfYnVmICE9IE5VTEwpCisgICAg ZnJlZSAodW5jb21wcmVzc2VkX2J1Zik7CisKKyNlbHNlIC8qICFIQVZFX1pTVEQgKi8KKworIHBy aW50ZiAoIlVOU1VQUE9SVEVEOiB6c3RkIGxhcmdlXG4iKTsKKworI2VuZGlmIC8qICFIQVZFX1pT VEQgKi8KK30KKworaW50CittYWluIChpbnQgYXJnYyBBVFRSSUJVVEVfVU5VU0VELCBjaGFyICoq YXJndikKK3sKKyAgc3RydWN0IGJhY2t0cmFjZV9zdGF0ZSAqc3RhdGU7CisKKyAgc3RhdGUgPSBi YWNrdHJhY2VfY3JlYXRlX3N0YXRlIChhcmd2WzBdLCBCQUNLVFJBQ0VfU1VQUE9SVFNfVEhSRUFE UywKKwkJCQkgIGVycm9yX2NhbGxiYWNrX2NyZWF0ZSwgTlVMTCk7CisKKyAgdGVzdF9zYW1wbGVz IChzdGF0ZSk7CisgIHRlc3RfbGFyZ2UgKHN0YXRlKTsKKworICBleGl0IChmYWlsdXJlcyAhPSAw ID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTKTsKK30K --000000000000a54b8b05ef460a9f--