Received: from makus.postgresql.org (makus.postgresql.org [98.129.198.125]) by mail.postgresql.org (Postfix) with ESMTP id 55E7FC2FBC7 for ; Sun, 27 May 2012 15:06:58 -0300 (ADT) Received: from mail-ob0-f174.google.com ([209.85.214.174]) by makus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1SYhrl-0006Yo-Im for pgsql-www@postgresql.org; Sun, 27 May 2012 18:06:58 +0000 Received: by obbtb18 with SMTP id tb18so4210356obb.19 for ; Sun, 27 May 2012 11:06:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=juffo.org; s=google; h=mime-version:from:date:message-id:subject:to:cc:content-type; bh=N+wjB9PMriDGIkqhivru7ezYGnhz2wAhVZy3Zrn7Z1g=; b=hg1cimPgjtgSPRMaiu3A3k3GxjUdP/DoxwKTtPQqVFUP0CNB7N/1zWoVyZQb1aoKKr s9m/mimL+lqckLLOP9jzPUcxza5WQFifFqslcuapC2RVgVPK2atR3qN6YBWKSnMlr41X dn2h9CtOG7nBwQrVi5SZqnr414czxdfox3h8I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:from:date:message-id:subject:to:cc:content-type :x-gm-message-state; bh=N+wjB9PMriDGIkqhivru7ezYGnhz2wAhVZy3Zrn7Z1g=; b=ZDIbKPWmnLB56MwfH5ZSpCZsb10sV6gswCsVDgeriXB4mlkvqTGd00lYT0ehgZ231K Qq+NAds8D/t8KaKKLNSNB/iSwBirmi7CAZsq6cz/W1R3PgIv4vIsaDV6zUkWQMoNkaVT G3yPsVOVqHNRBBESGxlaY9ezuKSg9IerxZ/7FzS6qa08Hwv6PdLf2SVnECFmUOsS0hdq 7JhKKk1Uui/oLu74oy6iAmUxyWJ3IdKqctffq7TAQgQVnMS+MG1XnfF0H5kesc0HYp3m qYWun2qocQEStdGokqAP0f+X5FDatw44c0RWUl8YvYp6WcK8yeC9ElpG9OZvGTL+thay qpmQ== Received: by 10.182.109.69 with SMTP id hq5mr4535384obb.4.1338142004214; Sun, 27 May 2012 11:06:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.76.82.200 with HTTP; Sun, 27 May 2012 11:06:03 -0700 (PDT) From: Marti Raudsepp Date: Sun, 27 May 2012 21:06:03 +0300 Message-ID: Subject: [PATCH] Cross-version navigation in documentation To: pgsql-www Cc: Andres Freund , Stefan Kaltenbrunner Content-Type: multipart/mixed; boundary=f46d044480f1d1fe4104c108766c X-Gm-Message-State: ALoCoQlS28NZMkwibueSucEFCgbxm4SSpK9VIDDYMXRfOi55z/+C22WlmN29vwsUgWuf2ujJE8En X-Pg-Spam-Score: -2.6 (--) X-Archive-Number: 201205/58 X-Sequence-Number: 20682 --f46d044480f1d1fe4104c108766c Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi list, It always bothers me that Google links to version-specific PostgreSQL documentation pages, usually an obsolete version. This patch lets you easily navigate to the version you want by adding a new line at the top: This page in other versions: 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / devel The same page in different versions is assumed to have the same file name. No effort is done to track pages which have been removed/added/split/renamed -- I think that would be lots of complexity for little gain. For example, The 7.4 version contains 644 doc pages, and only 68 of those (~10%) aren't present in 9.2. In actual relevant versions, the overlap is much greater. I also noticed that the docs table isn't currently indexed at all. docs/models.py now defines a new index/unique constraint, which requires manual migration: alter table docs add unique (file, version); PS: Python projects have a nearly universal style of using 4-space indents (PEP-0008). I understand that PostgreSQL itself uses tabs, but maybe a change is warranted here, since Python is particularly picky about indentation? ---- Attached are two patches: 0001-Allow-documentation-loading-without-tidy-Tidylib-for.patch Just a simple fallback so docs can be imported without =C2=B5Tidylib -- which is not packaged for Arch Linux 0002-Add-basic-version-navigation-support-for-documentati.patch Actual implementation of cross-version navigation Also available from my github fork: https://github.com/intgr/pgweb Regards, Marti --f46d044480f1d1fe4104c108766c Content-Type: application/octet-stream; name="0001-Allow-documentation-loading-without-tidy-Tidylib-for.patch" Content-Disposition: attachment; filename="0001-Allow-documentation-loading-without-tidy-Tidylib-for.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h2qf2i1a0 RnJvbSAxZWNhMTg1OWE5Y2M0MWIyY2RmODkwYzdiMjM2NzUyYWZmNzgxMWEzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aSBSYXVkc2VwcCA8bWFydGlAanVmZm8ub3JnPgpEYXRl OiBTYXQsIDI2IE1heSAyMDEyIDAzOjI1OjQ2ICswMzAwClN1YmplY3Q6IFtQQVRDSCAxLzJdID0/ VVRGLTg/cT9BbGxvdz0yMGRvY3VtZW50YXRpb249MjBsb2FkaW5nPTIwd2l0aG91dD0yMHQ/PQog PT9VVEYtOD9xP2lkeT0yMCg9QzI9QjVUaWR5bGliKT0yMGZvcj0yMGRldmVsb3BtZW50Pz0KTUlN RS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04CkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKCi0tLQogdG9vbHMvZG9jcy9kb2Nsb2FkLnB5 IHwgICAxNCArKysrKysrKysrKy0tLQogMSBmaWxlIGNoYW5nZWQsIDExIGluc2VydGlvbnMoKyks IDMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvdG9vbHMvZG9jcy9kb2Nsb2FkLnB5IGIvdG9v bHMvZG9jcy9kb2Nsb2FkLnB5CmluZGV4IGM4OGRmN2UuLmUxYzBlYzQgMTAwNzU1Ci0tLSBhL3Rv b2xzL2RvY3MvZG9jbG9hZC5weQorKysgYi90b29scy9kb2NzL2RvY2xvYWQucHkKQEAgLTYsNyAr NiwxMSBAQCBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB0YXJmaWxlCiBpbXBvcnQgcmUK LWltcG9ydCB0aWR5Cit0cnk6CisJaW1wb3J0IHRpZHkKK2V4Y2VwdCBJbXBvcnRFcnJvciwgZXJy OgorCXByaW50Pj5zeXMuc3RkZXJyLCAiV0FSTklORzogY2Fubm90IGltcG9ydCB0aWR5OiAlcyIg JSBlcnIKKwl0aWR5ID0gTm9uZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAK IApAQCAtNDMsMTIgKzQ3LDE2IEBAIGRlZiBsb2FkX2RvY19maWxlKGZpbGVuYW1lLCBmKToKIAkJ dGl0bGUgPSAiIgogCWlmIG5vdCBxdWlldDogcHJpbnQgIi0tLSBmaWxlOiAlcyAoJXMpIC0tLSIg JSAoZmlsZW5hbWUsIHRpdGxlKQogCi0JcyA9IHRpZHkucGFyc2VTdHJpbmcoY29udGVudHMuZW5j b2RlKCd1dGYtOCcpLCAqKnRpZHlvcHRzKQorCWlmIHRpZHk6CisJCXMgPSBzdHIodGlkeS5wYXJz ZVN0cmluZyhjb250ZW50cy5lbmNvZGUoJ3V0Zi04JyksICoqdGlkeW9wdHMpKQorCWVsc2U6CisJ CXMgPSBjb250ZW50cworCiAJY3Vycy5leGVjdXRlKCJJTlNFUlQgSU5UTyBkb2NzIChmaWxlLCB2 ZXJzaW9uLCB0aXRsZSwgY29udGVudCkgVkFMVUVTICglKGYpcywgJSh2KXMsICUodClzLCAlKGMp cykiLHsKIAkJJ2YnOiBmaWxlbmFtZSwKIAkJJ3YnOiB2ZXIsCiAJCSd0JzogdGl0bGUsCi0JCSdj Jzogc3RyKHMpLAorCQknYyc6IHMsCiAJfSkKIAlnbG9iYWwgcGFnZWNvdW50CiAJcGFnZWNvdW50 ICs9IDEKLS0gCjEuNy4xMC4yCgo= --f46d044480f1d1fe4104c108766c Content-Type: application/octet-stream; name="0002-Add-basic-version-navigation-support-for-documentati.patch" Content-Disposition: attachment; filename="0002-Add-basic-version-navigation-support-for-documentati.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h2qf2kge1 RnJvbSBiYWFlZjY4NjBmNmVmOTUwZDhmY2UwZTM0NmQ0ZjkyMmFiYTBmYjkxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aSBSYXVkc2VwcCA8bWFydGlAanVmZm8ub3JnPgpEYXRl OiBTYXQsIDI2IE1heSAyMDEyIDAzOjI5OjAyICswMzAwClN1YmplY3Q6IFtQQVRDSCAyLzJdIEFk ZCBiYXNpYyB2ZXJzaW9uIG5hdmlnYXRpb24gc3VwcG9ydCBmb3IgZG9jdW1lbnRhdGlvbgoKQWxz byByZWZhY3RvcmVkICJkZXZlbCIgdmVyc2lvbiBkaXNwbGF5IGxvZ2ljIGludG8KRG9jUGFnZS5k aXNwbGF5X3ZlcnNpb24gZnVuY3Rpb24uCgpSZXF1aXJlcyBkYXRhYmFzZSBtb2RpZmljYXRpb246 CmFsdGVyIHRhYmxlIGRvY3MgYWRkIHVuaXF1ZSAoZmlsZSwgdmVyc2lvbik7Ci0tLQogbWVkaWEv Y3NzL2RvY3MuY3NzICAgICAgICAgICB8ICAgIDIgKy0KIHBnd2ViL2RvY3MvbW9kZWxzLnB5ICAg ICAgICAgfCAgICA5ICsrKysrKysrKwogcGd3ZWIvZG9jcy92aWV3cy5weSAgICAgICAgICB8ICAg IDggKysrKystLS0KIHRlbXBsYXRlcy9kb2NzL2RvY3NwYWdlLmh0bWwgfCAgIDE3ICsrKysrKysr KysrKysrLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDI5IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvbWVkaWEvY3NzL2RvY3MuY3NzIGIvbWVkaWEvY3NzL2RvY3MuY3Nz CmluZGV4IDI0ODU3YjAuLjNiMjcyZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2Nzcy9kb2NzLmNzcwor KysgYi9tZWRpYS9jc3MvZG9jcy5jc3MKQEAgLTUxLDcgKzUxLDcgQEAgZGl2Lk5BVkhFQURFUiB0 YWJsZSB7CiAgIHBhZGRpbmctYm90dG9tOiAycHg7CiB9CiAKLSNkb2NOYXYgeworI2RvY05hdiwg I2RvY1ZlcnNpb25zIHsKICAgcG9zaXRpb246IHJlbGF0aXZlOwogICB0ZXh0LWFsaWduOiBsZWZ0 OwogICBtYXJnaW4tbGVmdDogMTBweDsKZGlmZiAtLWdpdCBhL3Bnd2ViL2RvY3MvbW9kZWxzLnB5 IGIvcGd3ZWIvZG9jcy9tb2RlbHMucHkKaW5kZXggNGFhZmRlNC4uNWVhMTQ5NyAxMDA2NDQKLS0t IGEvcGd3ZWIvZG9jcy9tb2RlbHMucHkKKysrIGIvcGd3ZWIvZG9jcy9tb2RlbHMucHkKQEAgLTEy LDggKzEyLDE3IEBAIGNsYXNzIERvY1BhZ2UobW9kZWxzLk1vZGVsKToKIAl0aXRsZSA9IG1vZGVs cy5DaGFyRmllbGQobWF4X2xlbmd0aD0yNTYsIG51bGw9VHJ1ZSwgYmxhbms9VHJ1ZSkKIAljb250 ZW50ID0gbW9kZWxzLlRleHRGaWVsZChudWxsPVRydWUsIGJsYW5rPVRydWUpCiAKKwlkZWYgZGlz cGxheV92ZXJzaW9uKHNlbGYpOgorCQkiIiJWZXJzaW9uIGFzIHVzZWQgZm9yIGRpc3BsYXlpbmcg YW5kIGluIFVSTHMiIiIKKwkJaWYgc2VsZi52ZXJzaW9uID09IDA6CisJCQlyZXR1cm4gJ2RldmVs JworCQllbHNlOgorCQkJcmV0dXJuIHN0cihzZWxmLnZlcnNpb24pCisKIAljbGFzcyBNZXRhOgog CQlkYl90YWJsZSA9ICdkb2NzJworCQkjIEluZGV4IGZpbGUgZmlyc3QsIGJlY2F1c2Ugd2Ugd2Fu dCB0byBsaXN0IHZlcnNpb25zIGJ5IGZpbGUKKwkJdW5pcXVlX3RvZ2V0aGVyID0gWygnZmlsZScs ICd2ZXJzaW9uJyldCiAKIGNsYXNzIERvY0NvbW1lbnQoUGdNb2RlbCwgbW9kZWxzLk1vZGVsKToK IAl2ZXJzaW9uID0gbW9kZWxzLkRlY2ltYWxGaWVsZChtYXhfZGlnaXRzPTMsIGRlY2ltYWxfcGxh Y2VzPTEsIG51bGw9RmFsc2UpCmRpZmYgLS1naXQgYS9wZ3dlYi9kb2NzL3ZpZXdzLnB5IGIvcGd3 ZWIvZG9jcy92aWV3cy5weQppbmRleCBkNTk2OWE4Li5hYWFmZDFkIDEwMDY0NAotLS0gYS9wZ3dl Yi9kb2NzL3ZpZXdzLnB5CisrKyBiL3Bnd2ViL2RvY3Mvdmlld3MucHkKQEAgLTQxLDE3ICs0MSwx OSBAQCBkZWYgZG9jcGFnZShyZXF1ZXN0LCB2ZXJzaW9uLCB0eXAsIGZpbGVuYW1lKToKIAllbHNl OgogCQlpbmRleG5hbWUgPSAiaW5kZXguaHRtbCIKIAotCXBhZ2UgPSBnZXRfb2JqZWN0X29yXzQw NChEb2NQYWdlLCB2ZXJzaW9uPXZlciwgZmlsZT0iJXMuJXMiICUgKGZpbGVuYW1lLCBleHRlbnNp b24pKQorCWZ1bGxuYW1lID0gIiVzLiVzIiAlIChmaWxlbmFtZSwgZXh0ZW5zaW9uKQorCXBhZ2Ug PSBnZXRfb2JqZWN0X29yXzQwNChEb2NQYWdlLCB2ZXJzaW9uPXZlciwgZmlsZT1mdWxsbmFtZSkK Kwl2ZXJzaW9ucyA9IERvY1BhZ2Uub2JqZWN0cy5maWx0ZXIoZmlsZT1mdWxsbmFtZSkub3JkZXJf YnkoJy12ZXJzaW9uJykub25seSgndmVyc2lvbicsICdmaWxlJykKIAogCWlmIHR5cD09ImludGVy YWN0aXZlIjoKLQkJY29tbWVudHMgPSBEb2NDb21tZW50Lm9iamVjdHMuZmlsdGVyKHZlcnNpb249 dmVyLCBmaWxlPSIlcy4lcyIgJSAoZmlsZW5hbWUsIGV4dGVuc2lvbiksIGFwcHJvdmVkPVRydWUp Lm9yZGVyX2J5KCdwb3N0ZWRfYXQnKQorCQljb21tZW50cyA9IERvY0NvbW1lbnQub2JqZWN0cy5m aWx0ZXIodmVyc2lvbj12ZXIsIGZpbGU9ZnVsbG5hbWUsIGFwcHJvdmVkPVRydWUpLm9yZGVyX2J5 KCdwb3N0ZWRfYXQnKQogCWVsc2U6CiAJCWNvbW1lbnRzID0gTm9uZQogCiAJcmV0dXJuIHJlbmRl cl90b19yZXNwb25zZSgnZG9jcy9kb2NzcGFnZS5odG1sJywgewogCQkncGFnZSc6IHBhZ2UsCisJ CSd2ZXJzaW9ucyc6IHZlcnNpb25zLAogCQkndGl0bGUnOiBwYWdlLnRpdGxlLAotCQknZG9jX25h dl92ZXJzaW9uJzogdmVyID4gMCBhbmQgdmVyIG9yICJkZXZlbCIsCiAJCSdkb2NfdHlwZSc6IHR5 cCwKIAkJJ2NvbW1lbnRzJzogY29tbWVudHMsCiAJCSdjYW5fY29tbWVudCc6ICh0eXA9PSJpbnRl cmFjdGl2ZSIgYW5kIHZlcj09Y3VycnZlciksCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvZG9jcy9k b2NzcGFnZS5odG1sIGIvdGVtcGxhdGVzL2RvY3MvZG9jc3BhZ2UuaHRtbAppbmRleCBkNjhkYWZl Li4yNzI3NTYyIDEwMDY0NAotLS0gYS90ZW1wbGF0ZXMvZG9jcy9kb2NzcGFnZS5odG1sCisrKyBi L3RlbXBsYXRlcy9kb2NzL2RvY3NwYWdlLmh0bWwKQEAgLTEsNyArMSw3IEBACiA8IURPQ1RZUEUg aHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3 dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CiA8aHRtbCB4bWxucz0i aHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiIgZGly PSJsdHIiPgogPGhlYWQ+Ci0gICAgPHRpdGxlPlBvc3RncmVTUUw6IERvY3VtZW50YXRpb246IHt7 ZG9jX25hdl92ZXJzaW9ufX06IHt7cGFnZS50aXRsZX19PC90aXRsZT4KKyAgICA8dGl0bGU+UG9z dGdyZVNRTDogRG9jdW1lbnRhdGlvbjoge3twYWdlLmRpc3BsYXlfdmVyc2lvbn19OiB7e3BhZ2Uu dGl0bGV9fTwvdGl0bGU+CiAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVu IiB0aXRsZT0iTm9ybWFsIFRleHQiPkBpbXBvcnQgdXJsKCIvbWVkaWEvY3NzL2RvY3MuY3NzIik7 PC9zdHlsZT4KICAgICA8bGluayByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiBtZWRpYT0ic2Ny ZWVuIiBocmVmPSIvbWVkaWEvY3NzL2RvY3NfbGFyZ2UuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0 bGU9IkxhcmdlIFRleHQiIC8+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNy Yz0iL21lZGlhL2pzL3N0eWxlc3dpdGNoZXIuanMiPjwvc2NyaXB0PgpAQCAtMzAsMTQgKzMwLDI1 IEBACiA8ZGl2IGlkPSJkb2NTZWFyY2giPgogCTxmb3JtIGFjdGlvbj0iL3NlYXJjaC8iIG1ldGhv ZD0iZ2V0Ij4KIAk8ZGl2PgotCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InUiIHZhbHVlPSIv ZG9jcy97e2RvY19uYXZfdmVyc2lvbn19LyI+CisJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0i dSIgdmFsdWU9Ii9kb2NzL3t7cGFnZS5kaXNwbGF5X3ZlcnNpb259fS8iPgogCTxsYWJlbCBmb3I9 InEiPlNlYXJjaCBEb2N1bWVudGF0aW9uOiZuYnNwOzwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQi IGlkPSJxIiBuYW1lPSJxIiBzaXplPSIyMCIgb25mb2N1cz0iaWYoIHRoaXMudmFsdWU9PXRoaXMu ZGVmYXVsdFZhbHVlICkgdGhpcy52YWx1ZT0nJzsiIHZhbHVlPSJTZWFyY2giIC8+PGlucHV0IGlk PSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCIgLz4KIAk8L2Rpdj4KIAk8L2Zv cm0+CiAgICAgICAgIDxkaXYgaWQ9ImRvY1RleHRTaXplIj5UZXh0IFNpemU6IDxhIGhyZWY9IiMi IG9uY2xpY2s9InNldEFjdGl2ZVN0eWxlU2hlZXQoJ05vcm1hbCBUZXh0Jyk7IHJldHVybiBmYWxz ZTsiIG9ua2V5cHJlc3M9InJldHVybiBmYWxzZTsiIHRpdGxlPSJOb3JtYWwgVGV4dCBTaXplIj5O b3JtYWw8L2E+IC8gPGEgaHJlZj0iIyIgb25jbGljaz0ic2V0QWN0aXZlU3R5bGVTaGVldCgnTGFy Z2UgVGV4dCcpOyByZXR1cm4gZmFsc2U7IiBvbmtleXByZXNzPSJyZXR1cm4gZmFsc2U7IiB0aXRs ZT0iTGFyZ2UgVGV4dCBTaXplIj5MYXJnZTwvYT48L2Rpdj4KIDwvZGl2PgogPGRpdiBpZD0iZG9j TmF2Ij4KLTxhIGhyZWY9Ii8iIHRpdGxlPSJIb21lIj5Ib21lPC9hPiAmcmFycjsgPGEgaHJlZj0i L2RvY3MiIHRpdGxlPSJEb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uPC9hPiAmcmFycjsgPGEg aHJlZj0iL2RvY3MvbWFudWFscyIgdGl0bGU9Ik1hbnVhbHMiPk1hbnVhbHM8L2E+ICZyYXJyOyA8 YSBocmVmPSIvZG9jcy97e2RvY19uYXZfdmVyc2lvbn19L3t7ZG9jX3R5cGV9fS97e2RvY19pbmRl eF9maWxlbmFtZX19Ij5Qb3N0Z3JlU1FMIHt7ZG9jX25hdl92ZXJzaW9ufX08L2E+eyVpZiBsb2Fk ZGF0ZSV9ICh7e2xvYWRkYXRlfGRhdGU6IlktbS1kIEg6aTpzIn19KXslZW5kaWYlfQorPGEgaHJl Zj0iLyIgdGl0bGU9IkhvbWUiPkhvbWU8L2E+ICZyYXJyOyA8YSBocmVmPSIvZG9jcyIgdGl0bGU9 IkRvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb248L2E+ICZyYXJyOyA8YSBocmVmPSIvZG9jcy9t YW51YWxzIiB0aXRsZT0iTWFudWFscyI+TWFudWFsczwvYT4gJnJhcnI7IDxhIGhyZWY9Ii9kb2Nz L3t7cGFnZS5kaXNwbGF5X3ZlcnNpb259fS97e2RvY190eXBlfX0ve3tkb2NfaW5kZXhfZmlsZW5h bWV9fSI+UG9zdGdyZVNRTCB7e3BhZ2UuZGlzcGxheV92ZXJzaW9ufX08L2E+eyVpZiBsb2FkZGF0 ZSV9ICh7e2xvYWRkYXRlfGRhdGU6IlktbS1kIEg6aTpzIn19KXslZW5kaWYlfQorPC9kaXY+Cis8 ZGl2IGlkPSJkb2NWZXJzaW9ucyI+CitUaGlzIHBhZ2UgaW4gb3RoZXIgdmVyc2lvbnM6Cit7JSBm b3IgdmVyIGluIHZlcnNpb25zICV9CisJeyUgaWYgbm90IGZvcmxvb3AuZmlyc3QgJX0veyUgZW5k aWYgJX0KKwl7JSBpZiB2ZXIudmVyc2lvbiA9PSBwYWdlLnZlcnNpb24gJX0KKwk8Yj57e3Zlci5k aXNwbGF5X3ZlcnNpb259fTwvYj4KKwl7JSBlbHNlICV9CisJPGEgaHJlZj0iL2RvY3Mve3t2ZXIu ZGlzcGxheV92ZXJzaW9ufX0ve3tkb2NfdHlwZX19L3t7dmVyLmZpbGV9fSIgdGl0bGU9IlRoaXMg cGFnZSBpbiB2ZXJzaW9uIHt7dmVyLmRpc3BsYXlfdmVyc2lvbn19Ij57e3Zlci5kaXNwbGF5X3Zl cnNpb259fTwvYT4KKwl7JSBlbmRpZiAlfQoreyUgZW5kZm9yICV9CiA8L2Rpdj4KIDwvZGl2Pgog Ci0tIAoxLjcuMTAuMgoK --f46d044480f1d1fe4104c108766c--