Return-Path: Delivered-To: apmail-apr-dev-archive@www.apache.org Received: (qmail 29336 invoked from network); 16 Apr 2004 01:36:48 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 16 Apr 2004 01:36:48 -0000 Received: (qmail 30329 invoked by uid 500); 16 Apr 2004 01:36:29 -0000 Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 30285 invoked by uid 500); 16 Apr 2004 01:36:29 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 30232 invoked from network); 16 Apr 2004 01:36:28 -0000 Message-ID: <407F38A4.3080001@openwave.com> Date: Thu, 15 Apr 2004 18:36:36 -0700 From: Sumeet Singh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7b) Gecko/20040316 MultiZilla/1.6.3.1c X-Accept-Language: en-us, en MIME-Version: 1.0 To: dev@apr.apache.org Subject: apr_tables Content-Type: multipart/mixed; boundary="------------020608080104050508080102" X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. --------------020608080104050508080102 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, In my use-case I am dealing with multiple headers with the same key (e.g. Cookie), and need to modify or remove a specific header based on its key and value (e.g. remove a certain cookie header while leaving the rest in). There is no api in apr_tables that would allow me to remove a given header instance. apr_table_unset will remove all cookies. And I can't have my code remove a header from the apr_array_table_t array because that will render the internal hash index incorrect. Secondly, eventhough I can modify the value of a specific header by iterating over the apr_array_header_t, that would be inefficient because I wouldn't be able to use the internal index_first and index_last values. Therefore I have written three functions (patch files attached) and am hoping that the powers-that-be will be willing to review and roll them into the APR codeline. 1) apr_table_set_one (apr_table_t *t, const char *key, const char *oldVal, const char *newVal) replaces value of header "key" and value "oldVal" with value "newVal". If "oldVal" is null, then the first occurance of the header is replaces (this is an optimization for situations where we know that only one header exists and don't care about its current value). If the header is not found, then it behaves like apr_table_add. 2) apr_table_setn_one(apr_table_t *t, const char *key, const char *oldVal, const char *newVal) Same as apr_table_set_one exept that it doesn't make a copy of key and newVal. 3) apr_table_unset_one(apr_table_t *t, const char *key, const char *oldVal, const char *newVal) Unsets header "key" with value "oldVal". If "oldVal" is null, then the first instance of the header (only) is unset (this is an optimization for situations where we know that only one header exists and don't care about its current value). -regards, S --------------020608080104050508080102 Content-Type: text/plain; name="apr_tables.c.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="apr_tables.c.patch" KioqIGFwcl90YWJsZXMuYwlGcmkgRmViIDEzIDAxOjM4OjM0IDIwMDQKLS0tIGFwcl90YWJs ZXMrKy5jCVRodSBBcHIgMTUgMTg6MjE6NTUgMjAwNAoqKioqKioqKioqKioqKioKKioqIDEy MDQsMTIwNiAqKioqCi0tLSAxMjA0LDEzMDEgLS0tLQogIAogICAgICBhcHJfdGFibGVfY29t cHJlc3MoYSwgZmxhZ3MpOwogIH0KKyAKKyBzdGF0aWMgdm9pZCBhcHJfdGFibGVfc2V0X29u ZV9pbnRlcm5hbChhcHJfdGFibGVfdCAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb2xkVmFsLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5ld1ZhbCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weSkKKyB7CisgICAgIGFw cl90YWJsZV9lbnRyeV90ICpuZXh0X2VsdDsKKyAgICAgYXByX3RhYmxlX2VudHJ5X3QgKmVu ZF9lbHQ7CisgICAgIGFwcl90YWJsZV9lbnRyeV90ICp0YWJsZV9lbmQ7CisgICAgIGFwcl91 aW50MzJfdCBjaGVja3N1bTsKKyAgICAgaW50IGhhc2g7CisgCisgICAgIENPTVBVVEVfS0VZ X0NIRUNLU1VNKGtleSwgY2hlY2tzdW0pOworICAgICBoYXNoID0gVEFCTEVfSEFTSChrZXkp OworICAgICBpZiAoIVRBQkxFX0lOREVYX0lTX0lOSVRJQUxJWkVEKHQsIGhhc2gpKSB7Cisg ICAgICAgICB0LT5pbmRleF9maXJzdFtoYXNoXSA9IHQtPmEubmVsdHM7CisgICAgICAgICBU QUJMRV9TRVRfSU5ERVhfSU5JVElBTElaRUQodCwgaGFzaCk7CisgICAgICAgICBnb3RvIGFk ZF9uZXdfZWx0OworICAgICB9CisgICAgIG5leHRfZWx0ID0gKChhcHJfdGFibGVfZW50cnlf dCAqKSB0LT5hLmVsdHMpICsgdC0+aW5kZXhfZmlyc3RbaGFzaF07OworICAgICBlbmRfZWx0 ID0gKChhcHJfdGFibGVfZW50cnlfdCAqKSB0LT5hLmVsdHMpICsgdC0+aW5kZXhfbGFzdFto YXNoXTsKKyAgICAgdGFibGVfZW5kID0oKGFwcl90YWJsZV9lbnRyeV90ICopIHQtPmEuZWx0 cykgKyB0LT5hLm5lbHRzOworIAorICAgICBmb3IgKDsgbmV4dF9lbHQgPD0gZW5kX2VsdDsg bmV4dF9lbHQrKykgeworICAgICAgICAgaWYgKChjaGVja3N1bSA9PSBuZXh0X2VsdC0+a2V5 X2NoZWNrc3VtKSAmJgorICAgICAgICAgICAgICFzdHJjYXNlY21wKG5leHRfZWx0LT5rZXks IGtleSkgJiYKKyAgICAgICAgICAgICAoIW9sZFZhbCB8fCAhc3RyY21wKG5leHRfZWx0LT52 YWwsIG9sZFZhbCkpKSB7CisgCisgICAgICAgICAgICAgLyogRm91bmQgQW4gRXhpc3Rpbmcg RW50cnkgV2l0aCBUaGUgU2FtZSBLZXksIFNvIE92ZXJ3cml0ZSBJdCAqLworICAgICAgICAg ICAgIG5leHRfZWx0LT52YWwgPSBjb3B5ID8gYXByX3BzdHJkdXAodC0+YS5wb29sLCBuZXdW YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2hhciAqKSBuZXdW YWw7CisgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICB9CisgCisgYWRk X25ld19lbHQ6CisgICAgIHQtPmluZGV4X2xhc3RbaGFzaF0gPSB0LT5hLm5lbHRzOworICAg ICBuZXh0X2VsdCA9IChhcHJfdGFibGVfZW50cnlfdCAqKSB0YWJsZV9wdXNoKHQpOworICAg ICBuZXh0X2VsdC0+a2V5ID0gY29weSA/IGFwcl9wc3RyZHVwKHQtPmEucG9vbCwga2V5KTog KGNoYXIgKikga2V5OworICAgICBuZXh0X2VsdC0+dmFsID0gY29weSA/IGFwcl9wc3RyZHVw KHQtPmEucG9vbCwgbmV3VmFsKTogKGNoYXIgKikgbmV3VmFsOworICAgICBuZXh0X2VsdC0+ a2V5X2NoZWNrc3VtID0gY2hlY2tzdW07CisgfQorIAorIEFQUl9ERUNMQVJFKHZvaWQpIGFw cl90YWJsZV9zZXRfb25lKGFwcl90YWJsZV90ICp0LCBjb25zdCBjaGFyICprZXksIGNvbnN0 IGNoYXIgKm9sZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5l d1ZhbCkKKyB7CisgICAgIHJldHVybiBhcHJfdGFibGVfc2V0X29uZV9pbnRlcm5hbCh0LCBr ZXksIG9sZFZhbCwgbmV3VmFsLCAxKTsKKyB9CisgCisgQVBSX0RFQ0xBUkUodm9pZCkgYXBy X3RhYmxlX3NldG5fb25lKGFwcl90YWJsZV90KiB0LCBjb25zdCBjaGFyICprZXksIGNvbnN0 IGNoYXIgKm9sZFZhbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdWYWwp CisgeworICAgICByZXR1cm4gYXByX3RhYmxlX3NldF9vbmVfaW50ZXJuYWwodCwga2V5LCBv bGRWYWwsIG5ld1ZhbCwgMCk7CisgfQorIAorIEFQUl9ERUNMQVJFKHZvaWQpIGFwcl90YWJs ZV91bnNldF9vbmUoYXByX3RhYmxlX3QgKnQsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hh ciogdmFsKQorIHsKKyAgICAgYXByX3RhYmxlX2VudHJ5X3QgKm5leHRfZWx0OworICAgICBh cHJfdGFibGVfZW50cnlfdCAqZW5kX2VsdDsKKyAgICAgYXByX3RhYmxlX2VudHJ5X3QgKmRz dF9lbHQ7CisgICAgIGFwcl91aW50MzJfdCBjaGVja3N1bTsKKyAgICAgaW50IGhhc2g7Cisg ICAgIGludCBtdXN0X3JlaW5kZXg7CisgCisgICAgIGhhc2ggPSBUQUJMRV9IQVNIKGtleSk7 CisgICAgIGlmICghVEFCTEVfSU5ERVhfSVNfSU5JVElBTElaRUQodCwgaGFzaCkpIHsKKyAg ICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBDT01QVVRFX0tFWV9DSEVDS1NVTShrZXks IGNoZWNrc3VtKTsKKyAgICAgbmV4dF9lbHQgPSAoKGFwcl90YWJsZV9lbnRyeV90ICopIHQt PmEuZWx0cykgKyB0LT5pbmRleF9maXJzdFtoYXNoXTsKKyAgICAgZW5kX2VsdCA9ICgoYXBy X3RhYmxlX2VudHJ5X3QgKikgdC0+YS5lbHRzKSArIHQtPmluZGV4X2xhc3RbaGFzaF07Cisg ICAgIG11c3RfcmVpbmRleCA9IDA7CisgICAgIGZvciAoOyBuZXh0X2VsdCA8PSBlbmRfZWx0 OyBuZXh0X2VsdCsrKSB7CisgICAgICAgICBpZiAoKGNoZWNrc3VtID09IG5leHRfZWx0LT5r ZXlfY2hlY2tzdW0pICYmCisgICAgICAgICAgICAgIXN0cmNhc2VjbXAobmV4dF9lbHQtPmtl eSwga2V5KSAmJgorICAgICAgICAgICAgICghdmFsIHx8ICFzdHJjbXAobmV4dF9lbHQtPnZh bCwgdmFsKSkpIHsKKyAgICAgICAgICAgICAvKiBGb3VuZCBhIG1hdGNoOiByZW1vdmUgdGhp cyBlbnRyeSAqLworICAgICAgICAgICAgIGFwcl90YWJsZV9lbnRyeV90ICp0YWJsZV9lbmQg PSAoKGFwcl90YWJsZV9lbnRyeV90ICopIHQtPmEuZWx0cykgKworICAgICAgICAgICAgICAg ICB0LT5hLm5lbHRzOworICAgICAgICAgICAgIHQtPmEubmVsdHMtLTsKKyAgICAgICAgICAg ICBkc3RfZWx0ID0gbmV4dF9lbHQ7CisgCisgICAgICAgICAgICAgLyogU2hpZnQgb3ZlciB0 aGUgcmVtYWluZGVyIG9mIHRoZSB0YWJsZS4qLworICAgICAgICAgICAgIGZvciAobmV4dF9l bHQrKzsgbmV4dF9lbHQgPCB0YWJsZV9lbmQ7IG5leHRfZWx0KyspIHsKKyAgICAgICAgICAg ICAgICAgKmRzdF9lbHQrKyA9ICpuZXh0X2VsdDsKKyAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgbXVzdF9yZWluZGV4ID0gMTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg IH0KKyAgICAgfQorICAgICBpZiAobXVzdF9yZWluZGV4KSB7CisgICAgICAgICB0YWJsZV9y ZWluZGV4KHQpOworICAgICB9CisgfQo= --------------020608080104050508080102 Content-Type: text/plain; name="apr_tables.h.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="apr_tables.h.patch" KioqIGFwcl90YWJsZXMuaAlUaHUgQXByIDE1IDE4OjEwOjQ5IDIwMDQKLS0tIGFwcl90YWJs ZXMrKy5oCVRodSBBcHIgMTUgMTg6MTA6MjYgMjAwNAoqKioqKioqKioqKioqKioKKioqIDIz MCwyMzUgKioqKgotLS0gMjMwLDI1NCAtLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBjaGFyICp2YWwpOwogIAogIC8qKgorICAqIFJlcGxhY2UgdGhlIHZh bHVlIG9mICBhbiBlbGVtZW50IHdpdGggYSBzcGVjaWZpYyAga2V5IGFuZCB2YWx1ZS4gSWYK KyAgKiA8b2xkVmFsPiBpcyBOVUxMLCAgaXQgd2lsbCBtb2RpZnkgdGhlIHZhbHVlICBvZiB0 aGUgZmlyc3Qgb2NjdXJlbmNlCisgICogb2YgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBr ZXkuIElmIHN1Y2ggYW4gIGVsZW1lbnQgaXMgbm90IGZvdW5kLAorICAqIGl0IHdpbGwgYWRk IGEgbmV3IGVsZW1lbnQgdG8gIHRoZSB0YWJsZS4gVW5saWtlIGFwcl90YWJsZV9zZXQgd2hp Y2gKKyAgKiB3aWxsIHJlbW92ZSAgYW55IG11bHRpcGxlIGluc3RhbmNlcyAgIG9mIGFuIGVs ZW1lbnQsIHRoaXMgIGZ1bmN0aW9uCisgICogbW9kaWZpZXMgb3IgYWRkcyBleGFjdGx5IG9u ZSBlbGVtZW50IGluIHRoZSB0YWJsZS4KKyAgKiBAcGFyYW0gdCBUaGUgdGFibGUgdG8gYWRk IHRoZSBkYXRhIHRvLgorICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgZWxlbWVudCB0 byBtb2RpZnkuCisgICogQHBhcmFtIG9sZFZhbCBUaGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQg dG8gbW9kaWZ5LgorICAqIEBwYXJhbSBuZXdWYWwgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgZWxl bWVudC4KKyAgKiBAcmVtYXJrIFdoZW4gYWRkaW5nIGRhdGEsIHRoaXMgZnVuY3Rpb24gbWFr ZXMgYSBjb3B5IG9mIGJvdGggdGhlIGtleSBhbmQgdGhlCisgICogICAgICAgICB2YWx1ZS4K KyAgKi8KKyBBUFJfREVDTEFSRSh2b2lkKSBhcHJfdGFibGVfc2V0X29uZShhcHJfdGFibGVf dCogdCwKKyAJCQkJCQkJCQljb25zdCBjaGFyKiBrZXksCisgCQkJCQkJCQkJY29uc3QgY2hh ciogb2xkVmFsLAorIAkJCQkJCQkJCWNvbnN0IGNoYXIqIG5ld1ZhbCk7CisgCQorIC8qKgog ICAqIEFkZCBhIGtleS92YWx1ZSBwYWlyIHRvIGEgdGFibGUsIGlmIGFub3RoZXIgZWxlbWVu dCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZQogICAqIHNhbWUga2V5LCB0aGlzIHdpbGwgb3Zl ci13cml0ZSB0aGUgb2xkIGRhdGEuCiAgICogQHBhcmFtIHQgVGhlIHRhYmxlIHRvIGFkZCB0 aGUgZGF0YSB0by4KKioqKioqKioqKioqKioqCioqKiAyNDMsMjQ4ICoqKioKLS0tIDI2Miwy ODggLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIg KnZhbCk7CiAgCiAgLyoqCisgICogUmVwbGFjZSB0aGUgdmFsdWUgb2YgIGFuIGVsZW1lbnQg d2l0aCBhIHNwZWNpZmljICBrZXkgYW5kIHZhbHVlLiBJZgorICAqIDxvbGRWYWw+IGlzIE5V TEwsICBpdCB3aWxsIG1vZGlmeSB0aGUgdmFsdWUgIG9mIHRoZSBmaXJzdCBvY2N1cmVuY2UK KyAgKiBvZiBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGtleS4gSWYgc3VjaCBhbiAgZWxl bWVudCBpcyBub3QgZm91bmQsCisgICogaXQgd2lsbCBhZGQgYSBuZXcgZWxlbWVudCB0byB0 aGUgdGFibGUuIFVubGlrZSBhcHJfdGFibGVfc2V0biB3aGljaAorICAqIHdpbGwgcmVtb3Zl ICBhbnkgbXVsdGlwbGUgaW5zdGFuY2VzICBvZiB0aGUgZWxlbWVudCwgdGhpcyAgZnVuY3Rp b24KKyAgKiBtb2RpZmllcyBvciBhZGRzIGV4YWN0bHkgb25lIGVsZW1lbnQgaW4gdGhlIHRh YmxlLgorICAqIEBwYXJhbSB0IFRoZSB0YWJsZSB0byBhZGQgdGhlIGRhdGEgdG8uCisgICog QHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBlbGVtZW50IHRvIG1vZGlmeS4KKyAgKiBAcGFy YW0gb2xkVmFsIFRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBtb2RpZnkuCisgICogQHBh cmFtIG5ld1ZhbCBUaGUgbmV3IHZhbHVlIG9mIHRoZSBlbGVtZW50LgorICAqIEByZW1hcmsg VGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gYXByX3RhYmxlX3NldF9vbmUgZXhjZXB0 IHRoYXQKKyAgKgkJICAgaXQgZG9lcyBub3QgbWFrZSBjb3BpZXMgb2Yga2V5IG9yIG5ld1Zh bCBzbyBjYXJlIHNob3VsZCBiZQorICAqCQkgICB0YWtlbiB0byBlbnN1cmUgdGhhdCB0aGUg dmFsdWVzIHdpbGwgbm90IGNoYW5nZSBhZnRlciB0aGV5IGhhdmUKKyAgKgkJICAgYmVlbiBh ZGRlZC4KKyAgKi8KKyBBUFJfREVDTEFSRSh2b2lkKSBhcHJfdGFibGVfc2V0bl9vbmUoYXBy X3RhYmxlX3QqIHQsCisgCQkJCQkJCQkJIGNvbnN0IGNoYXIqIGtleSwKKyAJCQkJCQkJCQkg Y29uc3QgY2hhciogb2xkVmFsLAorIAkJCQkJCQkJCSBjb25zdCBjaGFyKiBuZXdWYWwpOwor IAkKKyAvKioKICAgKiBSZW1vdmUgZGF0YSBmcm9tIHRoZSB0YWJsZQogICAqIEBwYXJhbSB0 IFRoZSB0YWJsZSB0byByZW1vdmUgZGF0YSBmcm9tCiAgICogQHBhcmFtIGtleSBUaGUga2V5 IG9mIHRoZSBkYXRhIGJlaW5nIHJlbW92ZWQKKioqKioqKioqKioqKioqCioqKiAyNTAsMjU1 ICoqKioKLS0tIDI5MCwzMTEgLS0tLQogIEFQUl9ERUNMQVJFKHZvaWQpIGFwcl90YWJsZV91 bnNldChhcHJfdGFibGVfdCAqdCwgY29uc3QgY2hhciAqa2V5KTsKICAKICAvKioKKyAgKiBS ZW1vdmUgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLiAgSXQgZG9l cyBub3RoaW5nIGlmCisgICogaXQgY2FuJ3QgZmluZCBhIGhlYWRlciAgd2l0aCB0aGUgZ2l2 ZW4ga2V5ICBhbmQgdmFsdWUuIElmIDx2YWw+ICBpcworICAqIE5VTEwsIGl0ICB3aWxsIHJl bW92ZSAgdGhlIGZpcnN0ICBvY2N1cmFuY2Ugb2YgYW4gIGVsZW1lbnQgd2l0aCB0aGUKKyAg KiBnaXZlbiAga2V5IC0gdGhpcyBmZWF0dXJlIGlzICAgYW4gb3B0aW1pemF0aW9uIGZvciBz aXR1YXRpb25zIHdoZXJlCisgICogeW91IGtub3cgIHRoYXQgb25seSAgb25lIGVsZW1lbnQg ZXhpc3RzICBhbmQgZG9uJ3QgIGNhcmUgYWJvdXQgIGl0cworICAqIGN1cnJlbnQgdmFsdWUu ICBVbmxpa2UgIGFwcl90YWJsZV91bnNldCAod2hpY2ggcmVtb3ZlcyBhbGwgZWxlbWVudHMK KyAgKiBoYXZpbmcgIHRoZSBnaXZlIGtleSkgIHRoaXMgZnVuY3Rpb24gIHdpbGwgIHJlbW92 ZSBhdCB0aGUgbW9zdCAgb25lCisgICogZWxlbWVudCBmcm9tIHRoZSB0YWJsZS4KKyAgKiBA cGFyYW0gdCBUaGUgdGFibGUgdG8gcmVtb3ZlIGRhdGEgZnJvbQorICAqIEBwYXJhbSBrZXkg VGhlIGtleSBvZiB0aGUgZGF0YSBiZWluZyByZW1vdmVkCisgICogQHBhcmFtIHZhbCBWYWx1 ZSBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUuCisgICovCisgQVBSX0RFQ0xBUkUodm9pZCkg YXByX3RhYmxlX3Vuc2V0X29uZShhcHJfdGFibGVfdCogdCwKKyAJCQkJCQkJCQkgIGNvbnN0 IGNoYXIqIGtleSwKKyAJCQkJCQkJCQkgIGNvbnN0IGNoYXIqIHZhbCk7CisgLyoqCiAgICog QWRkIGRhdGEgdG8gYSB0YWJsZSBieSBtZXJnaW5nIHRoZSB2YWx1ZSB3aXRoIGRhdGEgdGhh dCBoYXMgYWxyZWFkeSBiZWVuIAogICAqIHN0b3JlZAogICAqIEBwYXJhbSB0IFRoZSB0YWJs ZSB0byBzZWFyY2ggZm9yIHRoZSBkYXRhCg== --------------020608080104050508080102--