Textpattern Forum

You are not logged in. Register | Login | Help

#1 2004-06-15 03:40:20

santheo
Plugin Author
From: Chicago
Registered: 2004-05-27
Posts: 62
Website

[Archived] stw_category_tree

ARCHIVED PLUGIN: this can be acheived with a combination of native tags
==============================

Name: stw_category_tree
Author: Sandor Weisz
Created: 2004-06-14
Modified: 2006-11-21
Version: 1.0.1
Download: stw_category_tree

<?php

$plugin='YTo4OntzOjQ6Im5hbWUiO3M6MTc6InN0d19jYXRlZ29yeV90cmVlIjtzOjc6InZlcnNpb24iO3M6NToiMS4wLjEiO3M6NjoiYXV0aG9yIjtzOjEyOiJTYW5kb3IgV2Vpc3oiO3M6MTA6ImF1dGhvcl91cmkiO3M6MjM6Imh0dHA6Ly93d3cuc2FudGhlby5jb20vIjtzOjExOiJkZXNjcmlwdGlvbiI7czoxMjk6IkRpc3BsYXlzIGxpbmtzIHRvIGNhdGVnb3JpZXMgaW4gYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlLCBhbG9uZyB3aXRoIGNvbnRlbnQgY291bnQuIEluY2x1ZGVzIHNjYWRzIG9mIGhpZGluZyBhbmQgc2hvd2luZyBvcHRpb25zLiI7czo0OiJoZWxwIjtzOjg0MDY6IgoJPHA+PHN0eWxlPjxiciAvPgp0ZCB7cGFkZGluZzoycHg7fTxiciAvPgo8L3N0eWxlPjwvcD4KCgk8cD5UaGlzIHdvcmtzIGxpa2UgdGhlIGNhdGVnb3J5X2xpc3QgdGFnLCBidXQgaW5zdGVhZCBvZiBsaXN0aW5nIHRoZSBjYXRlZ29yaWVzIGxpbmVhcmx5LCBpdCBjcmVhdGVzIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSAoYnkgZGVmYXVsdCwgdGhyb3VnaCB1bm9yZGVyZWQgbGlzdHMpLiBJdCBhbGxvd3MgZm9yIGRlcHRoIGNvbnRyb2wsIHBydW5pbmcsIGNvbnRlbnQgY291bnQgdG90YWxzLCBhbmQgc29tZSBDU1MgcHJvcGVydGllcy48L3A+CgoJPHA+PHN0cm9uZz5ORVcgSU4gMS4wLjE8L3N0cm9uZz46PC9wPgoJPHVsPgoJPGxpPlN1cHBvcnRzIGNsZWFuIGNhdGVnb3J5IFVSTHMgYXMgZGVmaW5lZCBieSB0aGUgPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm9yZy9wbHVnaW5zLzIwOS9zZ2JfdXJsX2hhbmRsZXIiPnNnYl91cmxfaGFuZGxlciBwbHVnaW48L2E+LiBTdWNoIGxpbmtzIG11c3QgYmUgaW4gdGhlIGZvcm1hdCBvZiBzZWN0aW9uL2NhdGVnb3J5IChhcyBkZWZpbmVkIGJ5IGRlZmF1bHQpLjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+TkVXIElOIDEuMDwvc3Ryb25nPjo8L3A+Cgk8dWw+Cgk8bGk+U3VwcG9ydCBmb3IgPGNvZGU+d3JhcHRhZzwvY29kZT4gYW5kIDxjb2RlPmJyZWFrPC9jb2RlPiBwcm9wZXJ0aWVzLjwvbGk+CgkJPGxpPlRoZSA8Y29kZT5raWxsZW1wdGllczwvY29kZT4gcHJvcGVydHkgcmVzdHJpY3RzIHRoZSBwbHVnaW4gdG8gb25seSBkaXNwbGF5IGNhdGVnb3JpZXMgdGhhdCBoYXZlIG9uZSBtb3JlIG1vcmUgaXRlbXMgaW4gdGhlbSwgb3IgdGhhdCBoYXZlIHN1Yi1jYXRlZ29yaWVzIHRoYXQgaGF2ZSBvbmUgb3IgbW9yZSBpdGVtcyBpbiB0aGVtLjwvbGk+CgkJPGxpPk5ldyBwcm9wZXJ0eTogPGNvZGU+bG9jYWxpemVkPC9jb2RlPi4gU2V0IDxjb2RlPmxvY2FsaXplZDwvY29kZT4gdG8gJiM4MjIwO3kmIzgyMjE7IHRvIG1ha2UgdGhlIHBsdWdpbiBzaG93IG9ubHkgY2F0ZWdvcmllcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uPC9saT4KCQk8bGk+TmV3IHByb3BlcnR5OiA8Y29kZT50aW1lPC9jb2RlPi4gRWFjaCBjYXRlZ29yeSBhcnRpY2xlIGNvdW50IGlzIG5vdywgYnkgZGVmYXVsdCwgb25seSBjb3VudGluZyBhcnRpY2xlcyBkYXRlZCBpbiB0aGUgcGFzdC4gU2V0IDxjb2RlPnRpbWU8L2NvZGU+IHRvICYjODIyMDtmdXR1cmUmIzgyMjE7IG9yICYjODIyMDthbGwmIzgyMjE7IHRvIGFsdGVyIHRoYXQuPC9saT4KCQk8bGk+TmV3IHByb3BlcnR5OiA8Y29kZT5zdWJ0b3RhbDwvY29kZT4uIFRvIG1ha2UgdGhlIGl0ZW0gY291bnQgc2hvdyB0aGUgc3VtIG9mIHRoZSBpdGVtcyBpbiB0aGUgY2F0ZWdvcnkgYXMgd2VsbCBhcyBpdHMgc3ViLWNhdGVnb3JpZXMsIHNldCA8Y29kZT5zdWJ0b3RhbDwvY29kZT4gdG8gJiM4MjIwO3kmIzgyMjE7LjwvbGk+CgkJPGxpPlRlc3RlZCBpbiBUWFAgdi4gNC4wLjQuPC9saT4KCTwvdWw+CgoJPHA+SXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgoKCTx0YWJsZT4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5zdGFydDwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+SWYgeW91JiM4MjE3O2QgbGlrZSB0aGUgY2F0ZWdvcnkgdHJlZSB0byBzdGFydCBhdCBhIG5vZGUgZGVlcGVyIHRoYW4gdGhlIHJvb3QsIHNldCB0aGlzIGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGF0IGNhdGVvZ3J5LiBBbGwgY2F0ZWdvcmllcyB1bmRlcm5lYXRoIHNwZWNpZmllZCBub2RlIHdpbGwgYmUgZGlzcGxheWVkLiBJZiB1bnNwZWNpZmllZCwgdHJlZSBzdGFydHMgYXQgcm9vdC4gSWYgc2V0IHRvICosIGl0JiM4MjE3O2xsIGJlIHNldCB0byB0aGUgY3VycmVudCBjYXRlZ29yeS4gSWYgc2V0IHRvICpzLCBpdCYjODIxNztsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgPGk+c2VjdGlvbjwvaT4sIGluIGNhc2UgeW91IHByZWZlciB0byBoYWNrIHRoZSBzeXN0ZW0gdGhhdCB3YXkuPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij48c3Ryb25nPjxjb2RlPm1heGxldmVsPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD5UaGUgZGVlcGVzdCBsZXZlbCB5b3UmIzgyMTc7ZCBsaWtlIGRpc3BsYXllZC4gSWYgdW5hc3NpZ25lZCwgdGhlcmUgaXMgbm8gbWF4aW11bS48L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDsiPjxzdHJvbmc+PGNvZGU+bWlubGV2ZWw8L2NvZGU+PC9zdHJvbmc+PC90ZD4KCQkJPHRkPlRoZSBzaGFsbG93ZXN0IGxldmVsIHlvdSYjODIxNztkIGxpa2UgZGlzcGxheWVkLiBJZiB1bmFzc2lnbmVkLCB0aGVyZSBpcyBubyBtaW5pbXVtLjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5wcnVuZTwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+V2hlbiBzZXQgdG8gJiM4MjIwO3kmIzgyMjE7LCB0aGUgdHJlZSB3aWxsIHBydW5lIGF3YXkgYW55IGNhdGVnb3JpZXMgdGhhdCBhcmUgbm90IGVpdGhlciBhKSBhbmNlc3RvcnMgb2YgdGhlIGN1cnJlbnQgY2F0ZWdvcnksIGIpIHRoZSBjdXJyZW50IGNhdGVnb3J5LCBjKSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBjYXRlZ29yeSwgb3IgZCkgc2libGluZ3Mgb2Yge2F9IGFuZCB7Yn0uIElzIGZhbHNlIGJ5IGRlZmF1bHQuPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij48c3Ryb25nPjxjb2RlPmNhdDwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+V29ya3MgaW4gY29tYmluYXRpb24gd2l0aCA8Y29kZT5wcnVuZTwvY29kZT4gb3IgPGNvZGU+b25jbGFzczwvY29kZT4gKGJlbG93KS4gU2V0dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgdG8gYSBjYXRlZ29yeSBvdmVycmlkZXMgdGhlIGN1cnJlbnQgY2F0ZWdvcnkgd2hlbiBwcnVuaW5nIGlzIHR1cm5lZCBvbi4gSXQmIzgyMTc7bGwgYWxzbyBhZmZlY3QgdGhlIGFzc2lnbm1lbnQgb2YgdGhlIGNsYXNzPSYjODIyMTsuLi4mIzgyMjE7LCBpZiA8Y29kZT5vbmNsYXNzPC9jb2RlPiBpcyBzZXQgdG8gc29tZXRoaW5nLjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5zZWN0aW9uPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD5JZiB5b3UmIzgyMTc7ZCBsaWtlIGFsbCBjYXRlZ29yeSBsaW5rcyB0byBnbyB0byBhIHNwZWNpZmljIHNlY3Rpb24sIHNldCB0aGlzIHRvIHRoZSBwcmVmZXJyZWQgc2VjdGlvbi4gSWYgeW91JiM4MjE3O2QgbGlrZSB0byB1c2UgdGhlIGN1cnJlbnQgc2VjdGlvbiwgd2hhdGV2ZXIgaXQgaXMsIHNldCB0aGlzIHRvICYjODIyMTsqJiM4MjIxOy4gSWYgdW5zcGVjaWZpZWQsIG5vIHNlY3Rpb24gd2lsbCBiZSBzcGVjaWZpZWQuIChOb3RlIHRoYXQgaW4gVFhQLCBpZiB5b3UgcmVxdWlyZSBhIGNhdGVnb3J5IGxpbmsgdG8gc3BlY2lmeSBib3RoIGEgY2F0ZWdvcnkgYW5kIGEgc2VjdGlvbiwgdGhlIGxpbmsgd2lsbCBhbHdheXMgYmUgbWVzc3kmIzgyMTI7aS5lLiBpbiB0aGUgZm9ybWF0IC9wYXRoL3RvL3NpdGUvU0VDVElPTi8/Yz1DQVRFR09SWS4pPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij48c3Ryb25nPjxjb2RlPmNzc2lkPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD5UaGUgdmFsdWUgeW91JiM4MjE3O2QgbGlrZSBhc3NpZ25lZCB0byB0aGUgPGNvZGU+aWQ8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSB0b3AtbGV2ZWwgPGNvZGU+dWw8L2NvZGU+IHRhZy4gSWYgdW5hc3NpZ25lZCwgdGhlIGF0dHJpYnV0ZSBpcyBvbWl0dGVkLjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5vbmNsYXNzPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD5UaGUgdmFsdWUgeW91JiM4MjE3O2QgbGlrZSBhc3NpZ25lZCB0byB0aGUgPGNvZGU+Y2xhc3M8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBjdXJyZW50IGNhdGVvZ3J5IGFuZCBhbGwgb2YgaXRzIGFuY2VzdG9ycy4gTm90ZTogaWYgdGhpcyBpcyBhc3NpZ25lZCB0byBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGVtcHR5IHN0cmluZywgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZXMgd2lsbCBhbHNvIGJlIGFzc2lnbmVkIHRvIDxpPmFsbDwvaT4gPGNvZGU+bGk8L2NvZGU+IHRhZ3Mgd2l0aCB0aGUgdmFsdWUgc2V0IHRvIHRoYXQgPGNvZGU+bGk8L2NvZGU+JiM4MjE3O3MgY2F0ZWdvcnkuIElmIHVuYXNzaWduZWQsIG5vIDxjb2RlPmNsYXNzPC9jb2RlPiBvciA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlcyB3aWxsIGJlIGFzc2lnbmVkLjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT50eXBlPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD5EZWZpbmVzIHdoaWNoIHR5cGUgb2YgY2F0ZWdvcmllcyB0byBnZW5lcmF0ZTogJiM4MjE2O2FydGljbGUmIzgyMTc7LCAmIzgyMTY7aW1hZ2UmIzgyMTc7IG9yICYjODIxNjtsaW5rJiM4MjE3Oy4gSXMgc2V0IHRvICYjODIxNjthcnRpY2xlJiM4MjE3OyBieSBkZWZhdWx0LjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5jb3VudDwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+V2hlbiBzZXQgdG8gJiM4MjIwO3kmIzgyMjE7LCBlYWNoIGNhdGVnb3J5IGxpbmsgd2lsbCBiZSBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGxpdmUgaXRlbXMgd2l0aGluIHRoYXQgY2F0ZWdvcnksIHNldCBpbnNpZGUgcGFyZW50aGVzZXMuIElmIHlvdSYjODIxNztkIGxpa2UgdGhlIG51bWJlciB0byBiZSBzZXQgaW5zaWRlIGEgZGlmZmVyZW50IHBhaXIgb2YgY2hhcmFjdGVycywgc2V0IDxjb2RlPmNvdW50PC9jb2RlPiB0byB0aG9zZSBjaGFyYWN0ZXJzLiBGb3IgZXhhbXBsZSwgdG8gbWFrZSBpdCBvdXRwdXQgJiM4MjIwO0NhdGVnb3J5TmFtZSB7M30mIzgyMjE7LCBzZXQgPGNvZGU+Y291bnQ8L2NvZGU+IHRvICYjODIyMTt7fSYjODIyMTsuIElzIGZhbHNlIGJ5IGRlZmF1bHQuIE5ldyBpbiB2ZXJzaW9uIDAuNjogSWYgeW91JiM4MjE3O2QgbGlrZSB0aGUgY291bnQgdG8gYXBwZWFyIG9ubHkgd2hlbiBpdCYjODIxNztzIGdyZWF0ZXIgdGhhbiAwLCBzZXQgdGhlIHRoaXJkIGNoYXJhY3RlciBvZiB0aGUgYXR0cmlidXRlIHRvICYjODIxNzshJiM4MjE3Oy4gRm9yIGV4YW1wbGUsICYjODIyMTt7fSEmIzgyMjE7IHdpbGwgYXBwZW50ICYjODIyMTsgeyN9JiM4MjIxOyB0byB0aGUgZW5kIG9mIHRoZSBjYXRlZ29yeSBuYW1lIG9ubHkgd2l0aCB0aGF0IGNhdGVnb3J5IGhhcyBvbmUgb3IgbW9yZSBpdGVtcyBpbiBpdC48L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDsiPjxzdHJvbmc+PGNvZGU+a2lsbGVtcHRpZXM8L2NvZGU+PC9zdHJvbmc+PC90ZD4KCQkJPHRkPihDaGFuZ2VkIGluIDEuMCkgV2hlbiBzZXQgdG8gJiM4MjIwO3kmIzgyMjE7LCBpdCB3aWxsIHJlc3RyaWN0IHRoZSBwbHVnaW4gdG8gb25seSBkaXNwbGF5IGNhdGVnb3JpZXMgdGhhdCBoYXZlIG9uZSBtb3JlIG1vcmUgaXRlbXMgaW4gdGhlbSwgb3IgdGhhdCBoYXZlIHN1Yi1jYXRlZ29yaWVzIHRoYXQgaGF2ZSBvbmUgb3IgbW9yZSBpdGVtcyBpbiB0aGVtLjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5sb2NhbGl6ZWQ8L2NvZGU+PC9zdHJvbmc+PC90ZD4KCQkJPHRkPihOZXcgaW4gMS4wKSBXaGVuIHNldCB0byAmIzgyMjA7eSYjODIyMTssIGl0IHdpbGwgcmVzdHJpY3QgdGhlIHBsdWdpbiB0byBvbmx5IGRpc3BsYXkgY2F0ZWdvcmllcyB0aGUgcGx1Z2luIHNob3cgb25seSBjYXRlZ29yaWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi48L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDsiPjxzdHJvbmc+PGNvZGU+dGltZTwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+KE5ldyBpbiAxLjApIFRoZSBhcnRpY2xlIGNvdW50IG5vdyBvbmx5IGluY2x1ZGVzIGFydGljbGVzIHdyaXR0ZW4gaW4gdGhlIHBhc3QuIFRvIGluY2x1ZGUgZnV0dXJlIGNhdGVnb3JpZXMsIHNldCB0aGlzIHByb3BlcnR5IHRvICYjODIyMDthbGwmIzgyMjE7LiBUbyBzaG93IG9ubHkgZnV0dXJlIGNhdGVnb3JpZXMsIHNldCB0aGlzIHByb3BlcnR5IHRvICYjODIyMDtmdXR1cmUmIzgyMjE7LjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5zdWJ0b3RhbDwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+KE5ldyBpbiAxLjApIFdoZW4gc2V0IHRvICYjODIyMDt5JiM4MjIxOywgZWFjaCBjYXRlZ29yeSYjODIxNztzIGl0ZW0gY291bnQgd2lsbCBiZSB0aCBzdW0gb2YgdGhlIGl0ZW1zIHdpdGhpbiBpdHNlbGYgcGx1cyB0aGUgbnVtYmVyIHdpdGhpbiBhbGwgaXRzIHN1Yi1jYXRlZ29yaWVzLjwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHN0cm9uZz48Y29kZT5sYWJlbDwvY29kZT4sIDxjb2RlPmxhYmVsdGFnPC9jb2RlPjwvc3Ryb25nPjwvdGQ+CgkJCTx0ZD5Xb3JrcyBsaWtlIGFsbCBvdGhlciBUWFAgdGFncy4gV2hlbiBhdCBsZWFzdCB0aGUgZm9ybWVyIGlzIHNldCwgcHJlZml4ZXMgeW91ciBvdXRwdXQgd2l0aCBhIGxpbmUgb2YgdGhlIGZvcm1hdCA8Y29kZT4mbHQ7bGFiZWx0YWcmZ3Q7bGFiZWwmbHQ7L2xhYmVsdGFnJmd0OzwvY29kZT4uPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij48c3Ryb25nPjxjb2RlPndyYXB0YWc8L2NvZGU+LCA8Y29kZT5icmVhazwvY29kZT48L3N0cm9uZz48L3RkPgoJCQk8dGQ+KE5ldyBpbiAxLjApIFdvcmtzIGxpa2UgYWxsIG90aGVyIFRYUCB0YWdzLiBXcmFwcyBlYWNoIGNhdGVnb3J5IGxpbmsgaW4gdGhlIDxjb2RlPmJyZWFrPC9jb2RlPiB0YWcsIGFuZCB3cmFwcyBlYWNoIGxldmVsIG9mIDxjb2RlPmJyZWFrPC9jb2RlPnMgd2l0aCB0aGUgPGNvZGU+d3JhcHRhZzwvY29kZT4uIElmIDxjb2RlPmJyZWFrPC9jb2RlPiBpcyBzZXQgdG8gJiM4MjIwO2hyJiM4MjIxOyBvciAmIzgyMjA7YnImIzgyMjE7LCBpdCYjODIxNztsbCBhcHBlbmQgdGhlIHRhZyB0byB0aGUgZW5kIG9mIHRoZSBsaW5rIGluc3RlYWQgb2Ygc3Vycm91bmQgaXQuIFNldCBlaXRoZXIgdG8gYSBzcGFjZSAoJiM4MjIxOyAmIzgyMjE7KSB0byB1c2UgcmVtb3ZlIHRoZSB0YWcuIElzIHNldCB0byAmIzgyMjA7dWwmIzgyMjE7IGFuZCAmIzgyMjA7bGkmIzgyMjE7IGJ5IGRlZmF1bHQuPC90ZD4KCQk8L3RyPgoJPC90YWJsZT4KCgk8cD5UcnkgaXQgb3V0IGFuZCBzZWUuIEJlc3QgdW5kZXJzdG9vZCBieSB0cmlhbCBhbmQgZXJyb3IuIFBsZWFzZSByZXBvcnQgYW55IGhpbmtpbmVzcyBieSBwb3N0aW5nIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTE0MjYzIj5UWFAgZm9ydW08L2E+LjwvcD4KCgk8cD4oTm90ZTogSSBoYWQgdG8gY3JlYXRlIHNvbWUgYWRqdW5jdCBmdW5jdGlvbnMgdG8gd29yayB3aXRoIHRoaXMgdGFnLCBzbyB3aGlsZSBJIGhhdmVuJiM4MjE3O3QgaW5jbHVkZWQgZG9jdW1lbmF0aW9uIGZvciA8Y29kZT5zdHdfZ2V0X2xpbmVhZ2U8L2NvZGU+IGFuZCA8Y29kZT5zdHdfZ2V0X3BhcmVudDwvY29kZT4gW2FuZCBvdGhlcnNdLCB0aGV5JiM4MjE3O3JlIHRoZXJlIGFuZCBmcmVlIHRvIGJlIHBsYXllZCB3aXRoLiBOb29kbGUgYXJvdW5kIGFuZCB0cnkgdGhlbSBvdXQsIGlmIHlvdSYjODIxNztkIGxpa2UuKTwvcD4KCgk8cD48aHIgLz48L3A+CgoJPHA+VGhhbmtzIHRvIDxhIGhyZWY9Im1haWx0bzp0b25kYUBrYWYuY3oiPlBpbjAwNzwvYT4gZm9yIGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+dHlwZTwvY29kZT4gcHJvcGVydHkuPGJyIC8+ClRoYW5rcyB0byA8YSBocmVmPSJodHRwOi8vd3d3LnRpbnlmbHkuY29tLyI+VGlueWZseTwvYT4gZm9yIHRoZSBhc3Npc3RhbmNlIGluIG1ha2luZyA8Y29kZT5zdHdfZ2V0X2xpdmVfY291bnQ8L2NvZGU+IHdvcmsgd2l0aCBsaW5rcyBhbmQgaW1hZ2VzLjwvcD4KCgoKICI7czo0OiJjb2RlIjtzOjc2Njg6IgpmdW5jdGlvbiBzdHdfY2F0ZWdvcnlfdHJlZSAoJGF0dHMpIHsKCWdsb2JhbCAkcHJldGV4dDsKCWV4dHJhY3QoJHByZXRleHQpOwoKCWlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOwoJJHN0YXJ0ICAgICAgICAgPSAgKGVtcHR5KCRzdGFydCkpICAgICAgID8gICJyb290IiAgICAgICAgOiAgJHN0YXJ0OwoJJGNzc19pZCAgICAgICAgPSAgKGVtcHR5KCRjc3NpZCkpICAgICAgID8gICIiICAgICAgICAgICAgOiAgJGNzc2lkOwoJJGNzc19vbl9jbGFzcyAgPSAgKGVtcHR5KCRvbmNsYXNzKSkgICAgID8gICIiICAgICAgICAgICAgOiAgJG9uY2xhc3M7CgkkbWlubGV2ZWwgICAgICA9ICAoZW1wdHkoJG1pbmxldmVsKSkgICAgPyAgMSAgICAgICAgICAgICA6ICAkbWlubGV2ZWw7CgkkbWF4bGV2ZWwgICAgICA9ICAoZW1wdHkoJG1heGxldmVsKSkgICAgPyAgLTEgICAgICAgICAgICA6ICAkbWF4bGV2ZWw7Cgkkc2VjdGlvbiAgICAgICA9ICAoZW1wdHkoJHNlY3Rpb24pKSAgICAgPyAgIiIJCQkgOiAgJHNlY3Rpb247CgkkcHJ1bmUgICAgICAgICA9ICAoZW1wdHkoJHBydW5lKSkgICAgICAgPyAgZmFsc2UgICAgICAgICA6ICAkcHJ1bmU7CgkkdHlwZSAgICAgICAgICA9ICAoZW1wdHkoJHR5cGUpKSAgICAgICAgPyAgImFydGljbGUiICAgICA6ICAkdHlwZTsKCSRjb3VudCAgICAgICAgID0gIChlbXB0eSgkY291bnQpKSAgICAgICA/ICBmYWxzZSAgICAgICAgIDogICRjb3VudDsKCSRraWxsZW1wdGllcyAgID0gIChlbXB0eSgka2lsbGVtcHRpZXMpKSA/ICBmYWxzZSAgICAgICAgIDogICRraWxsZW1wdGllczsKCSRsb2NhbGl6ZWQgICAgID0gIChlbXB0eSgkbG9jYWxpemVkKSkgICA/ICBmYWxzZSAgICAgICAgIDogICRsb2NhbGl6ZWQ7CgkkdGltZSAgICAgICAgICA9ICAoZW1wdHkoJHRpbWUpKSAgICAgICAgPyAgInBhc3QiICAgICAgICA6ICAkdGltZTsKCSRzdWJ0b3RhbCAgICAgID0gIChlbXB0eSgkc3VidG90YWwpKSAgICA/ICBmYWxzZSAgICAgICAgIDogICRzdWJ0b3RhbDsKCgkkbGFiZWwgICAgICAgICA9ICAoZW1wdHkoJGxhYmVsKSkgICAgICAgPyAgIiIgICAgICAgICAgICA6ICAkbGFiZWw7CgkkbGFiZWx0YWcgICAgICA9ICAoZW1wdHkoJGxhYmVsdGFnKSkgICAgPyAgIiIgICAgICAgICAgICA6ICAkbGFiZWx0YWc7Cgkkd3JhcHRhZyAgICAgICA9ICAoZW1wdHkoJHdyYXB0YWcpKSAgICAgPyAgInVsIiAgICAgICAgICA6ICAkd3JhcHRhZzsKCSRicmVhayAgICAgICAgID0gIChlbXB0eSgkYnJlYWspKSAgICAgICA/ICAibGkiICAgICAgICAgIDogICRicmVhazsKCglpZiAoJHN0YXJ0ID09ICIqIikgJHN0YXJ0ID0gJGMgPyAkYyA6ICJyb290IjsKCWlmICgkc3RhcnQgPT0gIipzIikgJHN0YXJ0ID0gJEdMT0JBTFNbJ3MnXTsKCWlmICgkc2VjdGlvbiA9PSAiKiIpICRzZWN0aW9uID0gJEdMT0JBTFNbJ3MnXTsKCWlmICgkbG9jYWxpemVkKSAkbG9jYWxpemVkID0gJEdMT0JBTFNbJ3MnXTsKCWlmICgkd3JhcHRhZyA9PSAiICIpICR3cmFwdGFnID0gIiI7CglpZiAoJGJyZWFrID09ICIgIikgJGJyZWFrID0gIiI7CgoJJG91dCA9ICcnOwoJJGxhc3RsZXZlbCA9IDA7CgkkdGhpc2NhdCA9IChlbXB0eSgkY2F0KSkgPyAoJGMgPyAkYyA6ICRzdGFydCkgOiAkY2F0OwoJJGNvdW50ID0gKCRjb3VudCA9PSAidHJ1ZSIpID8gIigpIiA6ICRjb3VudDsKCSRsaW5lYWdlID0gc3R3X2dldF9saW5lYWdlKCR0aGlzY2F0LCAkdHlwZSk7CgoJJHZhcnMgPSBjb21wYWN0KCJzdGFydCIsImNzc19pZCIsImNzc19vbl9jbGFzcyIsIm1pbmxldmVsIiwibWF4bGV2ZWwiLCJzZWN0aW9uIiwicHJ1bmUiLCJ0eXBlIiwiY291bnQiLCJraWxsZW1wdGllcyIsImxhYmVsIiwibGFiZWx0YWciLCJsb2NhbGl6ZWQiLCJ0aW1lIiwic3VidG90YWwiLCJ3cmFwdGFnIiwiYnJlYWsiLCJ0aGlzY2F0IiwibGluZWFnZSIpOwoKCSRjcyA9IHN0d19nZXRfY2F0X2xpc3QoJHN0YXJ0LCR0eXBlKTsKCglpZiAoJGNzKSB7CgkJYXJyYXlfc2hpZnQoJGNzKTsKCQlsaXN0ICgkdHJlZSkgPSBzdHdfbWFrZV90cmVlKCRjcywkdmFycyk7CgkJcmV0dXJuIGRvTGFiZWwoJGxhYmVsLCAkbGFiZWx0YWcpLiJcbiIuJHRyZWU7Cgl9CglyZXR1cm4gIiI7Cn0KCmZ1bmN0aW9uIHN0d19tYWtlX3RyZWUgKCRycywkdmFycykgewoJJG91dCA9ICIiOwoJd2hpbGUgKCRjYXQgPSBhcnJheV9zaGlmdCgkcnMpKSB7CgkJZXh0cmFjdCgkY2F0KTsKCgkJJGxhc3RsZXZlbCA9ICRsZXZlbDsKCgkJLy8gSUYgVEhJUyBJVEVNIElTIE9VVCBPRiBPVVIgUkFOR0UsIFNLSVAgSVQKCQkkcGFyZW50X2luX3RyZWUgPSAkdmFyc1sncHJ1bmUnXSA/IGluX2FycmF5KCRwYXJlbnQsJHZhcnNbJ2xpbmVhZ2UnXSkgOiB0cnVlOwoJCWlmICgoJGxldmVsID4gJHZhcnNbJ21heGxldmVsJ10gJiYgJHZhcnNbJ21heGxldmVsJ10gIT0gLTEpIHx8ICRsZXZlbCA8ICR2YXJzWydtaW5sZXZlbCddIHx8ICEkcGFyZW50X2luX3RyZWUpIGNvbnRpbnVlOwoKCQkvLyBCVUlMRCBUSEUgUFJPUEVSVElFUyBPRiBUSEUgQ0FURUdPUlkgSVRFTVMgVEFHCgkJJHRhZ19jbGFzcyA9ICR2YXJzWydjc3Nfb25fY2xhc3MnXSAmJiBpbl9hcnJheSgkbmFtZSwkdmFyc1snbGluZWFnZSddKSA/ICR2YXJzWydjc3Nfb25fY2xhc3MnXSA6ICcnOwoJCSR0YWdfYXR0cyA9ICR2YXJzWydjc3Nfb25fY2xhc3MnXSA/ICcgaWQ9ImNhdC0nLnN0d19jc3NfZW5jb2RlKCRuYW1lKS4nIicgOiAnJzsKCgkJLy8gSUYgVEhFIENBVEVHT1JZIEhBUyBDSElMRFJFTiwgQ1JFQVRFIFRIRSBTVUItTElTVC4gSUYgVEhFIFNVQi1MSVNUIElTIEVNUFRZLCBTRVQgSVQgVE8gQU4gRU1QVFkgU1RSSU5HCgkJJG1lX2luX3RyZWUgPSAkdmFyc1sncHJ1bmUnXSA/IGluX2FycmF5KCRuYW1lLCR2YXJzWydsaW5lYWdlJ10pIDogdHJ1ZTsKCQkkY2hpbGRyZW5fdHJlZSA9ICIiOwoJCSRzdWJfY291bnQgPSAwOwoJCWlmICgkY2hpbGRyZW4gJiYgJGxldmVsIT0kdmFyc1snbWF4bGV2ZWwnXSAmJiAkbWVfaW5fdHJlZSkKCQkJbGlzdCgkY2hpbGRyZW5fdHJlZSwkc3ViX2NvdW50KSA9IHN0d19tYWtlX3RyZWUoYXJyYXlfc3BsaWNlKCRycywwLCRjaGlsZHJlbiksJHZhcnMpOwoJCSRjaGlsZHJlbl90cmVlID0gcHJlZ19yZXBsYWNlKCIvXHQqPCIuJHZhcnNbJ3dyYXB0YWcnXS4iPlxuXHQqPFwvIi4kdmFyc1snd3JhcHRhZyddLiI+LyIsIiIsJGNoaWxkcmVuX3RyZWUpOwoKCQkvLyBCVUlMRCBUSEUgVEVYVCBPRiBUSEUgQ0FURUdPUlkgTElOSwoJCSR0aXRsZSA9IChlbXB0eSgkdGl0bGUpKSA/ICRuYW1lIDogJHRpdGxlOwoJCSRjb3VudCA9IHN0d19nZXRfbGl2ZV9jb3VudCgkbmFtZSwkdHlwZSwkdmFyc1snbG9jYWxpemVkJ10sJHZhcnNbJ3RpbWUnXSkgKyAoJHZhcnNbJ3N1YnRvdGFsJ10gPyAkc3ViX2NvdW50IDogMCk7CgkJJGNvdW50X3N1YnRvdGFsICs9ICRjb3VudDsKCQkkbGluayA9IHN0d19jYXRfbGluaygkbmFtZSwkdmFyc1snc2VjdGlvbiddLCR0aXRsZSkuKCR2YXJzWydjb3VudCddICYmICgkdmFyc1snY291bnQnXXsyfSE9IiEiIHx8ICRjb3VudCkgPyAiICIuJHZhcnNbJ2NvdW50J117MH0uJGNvdW50LiR2YXJzWydjb3VudCddezF9IDogIiIpOwoKCQkvLyBJRiBUSElTIElURU0gSVMgSEFTIE5PIElURU1TIChPUiBDSElMRFJFTiBXSVRIIElURU1TKSwgQU5EIEtJTExFTVBUSUVTIElTIE9OLCBTS0lQIElUCgkJaWYgKCR2YXJzWydraWxsZW1wdGllcyddICYmICEkY291bnQgJiYgJGNoaWxkcmVuX3RyZWU9PSIiKSBjb250aW51ZTsKCgkJLy8gR0VORVJBVEUgVEhFIENBVEVHT1JZIExJTkssIFNVUlJPVU5ERUQgQlkgVEhFIE5FQ0VTU0FSWSBUQUcKCQkkYnJlYWsgPSAkdmFyc1snYnJlYWsnXTsKCQlpZiAoJGJyZWFrID09ICJiciIgfHwgJGJyZWFrID09ICJociIpIHsKCQkJJGxpbmsgPSBzdHdfdGFicygkbGV2ZWwpLmpvaW4oZG9UYWcoIiIsJGJyZWFrKSxhcnJheSgkbGluaywkY2hpbGRyZW5fdHJlZSkpOwoJCX0gZWxzZSB7CgkJCSRsaW5rID0gc3R3X3RhYnMoJGxldmVsKS5kb1dyYXAoYXJyYXkoJGxpbmssJGNoaWxkcmVuX3RyZWUpLCRicmVhaywiIiwkdGFnX2NsYXNzLCIiLCR0YWdfYXR0cyk7CgkJfQoJCSRvdXQgLj0gc3Vic3RyX3JlcGxhY2UoJGxpbmssIiIsc3RycnBvcygkbGluaywiXG4iKSwxKS4iXG4iOwoJfQoJJGxldmVsID0gJGxhc3RsZXZlbDsKCSRvdXQgPSBzdHJfcmVwbGFjZSgiPjwvIi4kdmFyc1snd3JhcHRhZyddLCI+XG4iLnN0d190YWJzKCRsZXZlbCkuIjwvIi4kdmFyc1snd3JhcHRhZyddLCRvdXQpOwoJcmV0dXJuIGFycmF5KHN0d190YWJzKCRsZXZlbC0xKS5kb1dyYXAoYXJyYXkoIlxuIi4kb3V0KSwkdmFyc1snd3JhcHRhZyddLCIiLCIiLCIiLCgkdmFyc1snY3NzX2lkJ10gJiYgJGxldmVsPT0xKSA/ICcgaWQ9IicuJHZhcnNbJ2Nzc19pZCddLiciJyA6ICIiKSwkY291bnRfc3VidG90YWwpOwp9CgpmdW5jdGlvbiBzdHdfdGFicyAoJGxldmVsKSB7CglyZXR1cm4gc3RyX3JlcGVhdCgiXHQiLG1heCgkbGV2ZWwsMCkpOwp9CgovLyBzdHdfY2F0X2xpbms6IHJldHVybnMgYSBsaW5rIHRvIHRoZSBwYXNzZWQgY2F0ZWdvcnkuIFN1cHBvcnRzIGNsZWFuIGxpbmtzIGFzIGRlZmluZWQgYnkgdGhlIGRlZmF1bHQgc2V0dGluZyBvZiB0aGUgc2diX3VybF9oYW5kbGVyIHBsdWdpbgovLyAtIC0gLSAtIC0gLQpmdW5jdGlvbiBzdHdfY2F0X2xpbmsgKCRjYXQsJHNlYywkdGl0bGUpIHsKCWdsb2JhbCAkc2diX3VybF9oYW5kbGVyX2NmZzsKCgkkY2F0X2xpbmsgPSBwYWdlbGlua3VybChhcnJheSgnYyc9PiRjYXQsICdzJz0+JHNlYykpOwoJaWYgKCRzZ2JfdXJsX2hhbmRsZXJfY2ZnICYmICFlbXB0eSgkc2VjKSAmJiAkc2VjIT0nZGVmYXVsdCcgJiYgJHBlcm1saW5rX21vZGUhPSdtZXNzeScpIHsKCQkkY2xlYW51cmwgPSBzZ2JfdXJsX2hhbmRsZXJfY29uZmlnKCk7CgkJaWYgKCRjbGVhbnVybFsnc2NoZW1lcyddWydzZWN0aW9uX2NhdGVnb3J5J10gPT0gIiVzZWN0aW9uJS8lY2F0ZWdvcnklIikKCQkJJGNhdF9saW5rID0gaHUudXJsZW5jb2RlKCRzZWMpLiIvIi51cmxlbmNvZGUoJGNhdCk7Cgl9CglyZXR1cm4gdGFnKGh0bWxzcGVjaWFsY2hhcnMoJHRpdGxlKSwnYScsJyBocmVmPSInLiRjYXRfbGluay4nIiB0aXRsZT0iJy5odG1sc3BlY2lhbGNoYXJzKCR0aXRsZSkuJyInKTsKfQoKZnVuY3Rpb24gc3R3X2Nzc19lbmNvZGUgKCR0eHQpIHsKCXJldHVybiBzdHJfcmVwbGFjZSgiKyIsIi0iLHVybGVuY29kZSgkdHh0KSk7Cn0KCi8vIHN0d19nZXRfcGFyZW50OiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIHBhc3NlZCBjYXRlZ29yeQovLyAtIC0gLSAtIC0gLQpmdW5jdGlvbiBzdHdfZ2V0X3BhcmVudCAoJGNoaWxkLCAkdHlwZSA9ICdhcnRpY2xlJykgewoJJHJvdyA9IHNhZmVfcm93KCJwYXJlbnQiLCAidHhwX2NhdGVnb3J5IiwgIm5hbWU9JyRjaGlsZCcgYW5kIHR5cGU9JyR0eXBlJyIpOwoJaWYgKCRyb3cpIHJldHVybiAkcm93WydwYXJlbnQnXTsKCXJldHVybiAiIjsKfQoKLy8gc3R3X2dldF9saW5lYWdlOiByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBwYXNzZWQgY2F0ZWdvcnkncyBhbmNlc3RvcnMsIGZyb20gaXRzIHBhcmVudCB1cCB0byB0aGUgcm9vdAovLyAtIC0gLSAtIC0gLQpmdW5jdGlvbiBzdHdfZ2V0X2xpbmVhZ2UgKCRjaGlsZCwgJHR5cGUgPSAnYXJ0aWNsZScpIHsKCSRwYXJlbnQgPSBzdHdfZ2V0X3BhcmVudCgkY2hpbGQsICR0eXBlKTsKCWlmICghJHBhcmVudCkgewoJCXJldHVybiBhcnJheSgicm9vdCIpOwoJfSBlbHNlIHsKCQkkYXJyID0gc3R3X2dldF9saW5lYWdlKCRwYXJlbnQsICR0eXBlKTsKCQkkYXJyW10gPSAkY2hpbGQ7Cgl9CglyZXR1cm4gJGFycjsKfQoKLy8gc3R3X2dldF9hbmNlc3RvcjogcmV0dXJucyBhIHBhcnRpY3VsYXIgYW5jZXN0b3J5IG9mIHRoZSBwYXNzZWQgY2F0ZWdvcnkuIE5vdCBjdXJyZW50bHkgdXNlZC4KLy8gLSAtIC0gLSAtIC0KZnVuY3Rpb24gc3R3X2dldF9hbmNlc3RvciAoJGF0dHMpIHsKCWlmIChpc19hcnJheSgkYXR0cykpIGV4dHJhY3QoJGF0dHMpOwoJJGNoaWxkID0gKGVtcHR5KCRjaGlsZCkpID8gZ3BzKCJjIikgOiAkY2hpbGQ7CgkkbGV2ZWwgPSAoZW1wdHkoJGxldmVsKSkgPyAxIDogJGxldmVsOwoJJHR5cGUgPSAoZW1wdHkoJHR5cGUpKSA/ICJhcnRpY2xlIiA6ICR0eXBlOwoJJGxpbmVhZ2UgPSBzdHdfZ2V0X2xpbmVhZ2UoJGNoaWxkLCAkdHlwZSk7CgkkYW5jZXN0b3IgPSAoJGxldmVsPjApID8gJGxpbmVhZ2VbJGxldmVsXSA6ICIiOwoJcmV0dXJuICRhbmNlc3RvcjsKfQoKZnVuY3Rpb24gc3R3X2dldF9saXZlX2NvdW50ICgkY2F0LCR0eXBlLCRzZWN0aW9uLCR0aW1lKSB7Cgkkc2VjdF9wcmVkaWNhdGUgPSAkc2VjdGlvbiA/ICIgQU5EIFNlY3Rpb249JyIuJHNlY3Rpb24uIiciIDogIiI7CgkkdGltZV9wcmVkaWNhdGUgPSAiIEFORCBQb3N0ZWQgPCBub3coKSI7CiAgICBpZiAoJHRpbWU9PSJmdXR1cmUiKSAkdGltZV9wcmVkaWNhdGUgPSAiIEFORCBQb3N0ZWQgPiBub3coKSI7CiAgICBlbHNlaWYgKCR0aW1lID09ICJhbGwiKSAkdGltZV9wcmVkaWNhdGUgPSAiIjsKCglpZiAoJHR5cGU9PSJsaW5rIikgewoJCSRxID0gc2FmZV9jb3VudCgidHhwX2xpbmsiLCJjYXRlZ29yeT0nIi4kY2F0LiInIik7Cgl9IGVsc2VpZiAoJHR5cGU9PSJpbWFnZSIpIHsKCQkkcSA9IHNhZmVfY291bnQoInR4cF9pbWFnZSIsImNhdGVnb3J5PSciLiRjYXQuIiciKTsKCX0gZWxzZWlmICgkdHlwZT09ImZpbGUiKSB7CgkJJHEgPSBzYWZlX2NvdW50KCJ0eHBfZmlsZSIsImNhdGVnb3J5PSciLiRjYXQuIiciKTsKCX0gZWxzZSB7CgkJJHEgPSBzYWZlX2NvdW50KCJ0ZXh0cGF0dGVybiIsIihDYXRlZ29yeTE9JyIuJGNhdC4iJyBPUiBDYXRlZ29yeTI9JyIuJGNhdC4iJykgQU5EIFN0YXR1cz0nNCciLiRzZWN0X3ByZWRpY2F0ZS4kdGltZV9wcmVkaWNhdGUpOwoJfQoJcmV0dXJuICRxOwp9CgpmdW5jdGlvbiBzdHdfZ2V0X2NhdF9saXN0KCRyb290LCAkdHlwZSkgewoJJHJvb3QgPSBkb1NsYXNoKCRyb290KTsKCglleHRyYWN0KHNhZmVfcm93KAoJCSJsZnQgYXMgbCwgcmd0IGFzIHIiLAoJCSJ0eHBfY2F0ZWdvcnkiLAoJCSJuYW1lPSckcm9vdCcgYW5kIHR5cGUgPSAnJHR5cGUnIgoJKSk7CgoJJHJpZ2h0ID0gYXJyYXkoKTsKCgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoCgkJIm5hbWUsIGxmdCwgcmd0LCBwYXJlbnQsIHRpdGxlIiwKCQkidHhwX2NhdGVnb3J5IiwKCQkibGZ0IGJldHdlZW4gJGwgYW5kICRyIGFuZCB0eXBlID0gJyR0eXBlJyBvcmRlciBieSBsZnQgYXNjIgoJKTsKCgl3aGlsZSAoJHJvdyA9IG5leHRSb3coJHJzKSkgewoJCWV4dHJhY3QoJHJvdyk7CgkJd2hpbGUgKGNvdW50KCRyaWdodCkgPiAwICYmICRyaWdodFtjb3VudCgkcmlnaHQpLTFdIDwgJHJndCkgewoJCQlhcnJheV9wb3AoJHJpZ2h0KTsKCQl9CgoJCSRvdXRbXSA9IGFycmF5KAoJCQknbmFtZScgPT4gJG5hbWUsCgkJCSd0aXRsZScgPT4gJHRpdGxlLAoJCQknbGV2ZWwnID0+IGNvdW50KCRyaWdodCksCgkJCSdwYXJlbnQnID0+ICRwYXJlbnQsCgkJCSdjaGlsZHJlbicgPT4gKCRyZ3QgLSAkbGZ0IC0gMSkgLyAyCgkJKTsKCgkJJHJpZ2h0W10gPSAkcmd0OwoJfQoJcmV0dXJuKCRvdXQpOwp9CiI7czozOiJtZDUiO3M6MzI6ImRiNTFlNjUyY2Q2MjcxODEwMjczZDEwN2JmYjlmODM1Ijt9'
?>

Update: Starting with version 0.7, you should be using TXP 4.0.3 or later. I haven’t tested it with any earlier version, so caveat emptor. If you’d like to use an earlier version download version 0.5 or version 0.6.1.

———

This works like the category_list tag, but instead of listing the categories linearly, it creates a hierarchical structure (by default, through unordered lists). It allows for depth control, pruning, content count totals, and some CSS properties.

NEW IN 1.0.1:

  • Supports clean category URLs as defined by the sgb_url_handler plugin, if you have that plug-in installed. Such links must be in the format of section/category (as defined by default).

NEW IN 1.0:

  • Support for wraptag and break properties.
  • The killempties property restricts the plugin to only display categories that have one more more items in them, or that have sub-categories that have one or more items in them.
  • New property: localized. Set localized to “y” to make the plugin show only categories that are part of the current section.
  • New property: time. Each category article count is now, by default, only counting articles dated in the past. Set time to “future” or “all” to alter that.
  • New property: subtotal. To make the item count show the sum of the items in the category as well as its sub-categories, set subtotal to “y”.
  • Tested in TXP v. 4.0.3.

It accepts the following attributes:

@start@ If you’d like the category tree to start at a node deeper than the root, set this attribute to the name of that cateogry. All categories underneath specified node will be displayed. If unspecified, tree starts at root. If set to *, it’ll be set to the current category. If set to *s, it’ll be set to the current <i>section</i>, in case you prefer to hack the system that way.
@maxlevel@ The deepest level you’d like displayed. If unassigned, there is no maximum.
@minlevel@ The shallowest level you’d like displayed. If unassigned, there is no minimum.
@prune@ When set to “y”, the tree will prune away any categories that are not either a) ancestors of the current category, b) the current category, c) children of the current category, or d) siblings of {a} and {b}. Is false by default.
@cat@ Works in combination with prune or onclass (below). Setting the value of this attribute to a category overrides the current category when pruning is turned on. It’ll also affect the assignment of the class=”…”, if onclass is set to something.
@section@ If you’d like all category links to go to a specific section, set this to the preferred section. If you’d like to use the current section, whatever it is, set this to “*”. If unspecified, no section will be specified. (Note that in TXP, if you require a category link to specify both a category and a section, the link will always be messy — i.e. in the format /path/to/site/SECTION/?c=CATEGORY.)
@cssid@ The value you’d like assigned to the id property of the top-level ul tag. If unassigned, the attribute is omitted.
@onclass@ The value you’d like assigned to the class property of the current cateogry and all of its ancestors. Note: if this is assigned to anything other than an empty string, id attributes will also be assigned to <i>all</i> li tags with the value set to that li’s category. If unassigned, no class or id attributes will be assigned.
@type@ Defines which type of categories to generate: ‘article’, ‘image’ or ‘link’. Is set to ‘article’ by default.
@count@ When set to “y”, each category link will be followed by the number of live items within that category, set inside parentheses. If you’d like the number to be set inside a different pair of characters, set count to those characters. For example, to make it output “CategoryName {3}”, set count to “{}”. Is false by default. New in version 0.6: If you’d like the count to appear only when it’s greater than 0, set the third character of the attribute to ‘!’. For example, “{}!” will appent “ {#}” to the end of the category name only with that category has one or more items in it.
@killempties@ (Changed in 1.0) When set to “y”, it will restrict the plugin to only display categories that have one more more items in them, or that have sub-categories that have one or more items in them.
@localized@ (New in 1.0) When set to “y”, it will restrict the plugin to only display categories the plugin show only categories that are part of the current section.
@time@ (New in 1.0) The article count now only includes articles written in the past. To include future categories, set this property to “all”. To show only future categories, set this property to “future”.
@subtotal@ (New in 1.0) When set to “y”, each category’s item count will be th sum of the items within itself plus the number within all its sub-categories.
@label@, labeltag Works like all other TXP tags. When at least the former is set, prefixes your output with a line of the format <labeltag>label</labeltag>.
@wraptag@, break (New in 1.0) Works like all other TXP tags. Wraps each category link in the break tag, and wraps each level of breaks with the wraptag. If break is set to “hr” or “br”, it’ll append the tag to the end of the link instead of surround it. Set either to a space (” “) to use remove the tag. Is set to “ul” and “li” by default.

Try it out and see. Best understood by trial and error. Please report any hinkiness by posting in the TXP forum.

(Note: I had to create some adjunct functions to work with this tag, so while I haven’t included documenation for stw_get_lineage and stw_get_parent [and others], they’re there and free to be played with. Noodle around and try them out, if you’d like.)

———

Thanks to Pin007 for his implementation of the type property.
Thanks to Tinyfly for the assistance in making stw_get_live_count work with links and images.

Last edited by santheo (2006-11-21 17:04:13)

Offline

#2 2004-06-15 03:47:43

santheo
Plugin Author
From: Chicago
Registered: 2004-05-27
Posts: 62
Website

Re: [Archived] stw_category_tree

Meant to say: this plugin was inspired by Dean’s Article by Category plugin and would not exist but for the slick code I copped from within that plugin. Which code made understanding the architecture of TXP so much easier.

Offline

#3 2004-06-15 04:19:26

schussat
Plugin Author
Registered: 2004-02-24
Posts: 99
Website

Re: [Archived] stw_category_tree

Great plugin, santheo. Seems to work really nicely.


-Alan

Offline

#4 2004-06-15 13:35:42

Benoit
Member
From: Montreal, QC
Registered: 2004-05-23
Posts: 26
Website

Re: [Archived] stw_category_tree

Love the plugin, it does exactly what I want, with one exception: I would use it twice on the same page, to list two different set of sub-categories, but it only displays the first instance.

Any idea if it is possible to use in that way, and how?

Offline

#5 2004-06-15 14:17:31

santheo
Plugin Author
From: Chicago
Registered: 2004-05-27
Posts: 62
Website

Re: [Archived] stw_category_tree

Love the plugin, it does exactly what I want, with one exception: I would use it twice on the same page, to list two different set of sub-categories, but it only displays the first instance.

I’ve tested this situation out on my install, and it seems to work fine. My only guess at this point is that you’re misspelling the name of the category you’re putting in the start attribute.

Can you post or email me the tags you’re using, and, if possible, your category tree? That’ll make it easier to debug.

Offline

#6 2004-06-15 15:00:03

Benoit
Member
From: Montreal, QC
Registered: 2004-05-23
Posts: 26
Website

Re: [Archived] stw_category_tree

The tags I am using are:

txp:stw_category_tree start=“English” prune=“true”

and

txp:stw_category_tree start=“Fran

Offline

#7 2004-06-15 15:42:17

santheo
Plugin Author
From: Chicago
Registered: 2004-05-27
Posts: 62
Website

Re: [Archived] stw_category_tree

Figured it out. It wasn’t the

Last edited by santheo (2004-06-15 15:44:29)

Offline

#8 2004-06-15 17:06:13

Benoit
Member
From: Montreal, QC
Registered: 2004-05-23
Posts: 26
Website

Re: [Archived] stw_category_tree

Tried a number of combination, including the one I’d mentioned above, and still get the same problem.

If you go check http://blog-cafe.com (don’t mind the mess, it’s very much under construction), you’ll see what gets output when using the tag

txp:stw_category_tree start=

Last edited by Benoit (2004-06-15 17:49:56)

Offline

#9 2004-06-15 18:16:29

santheo
Plugin Author
From: Chicago
Registered: 2004-05-27
Posts: 62
Website

Re: [Archived] stw_category_tree

Benoit-

From looking at your source code, I can actually see the TXP tag, which means it’s not being picked up by the TXP interpreter. Not sure how that happened, but you’ll need to fix that first.

One suggestion: add a trailing slash to the tag. So instead of this:
<code><txp:stw_category_tree start=

Offline

#10 2004-06-15 18:22:44

Benoit
Member
From: Montreal, QC
Registered: 2004-05-23
Posts: 26
Website

Re: [Archived] stw_category_tree

OK. I’ll try that. And I’ll do some additional checking on the CSS side. Got a feeling that may be part of the problem too. Have to get back to work now, but will get back to you with what I find. Thanks again for all the help!

Offline

Board footer

Powered by FluxBB