# tru_tags v1.5 # Tagging support with full integration # Nathan Arthur # http://rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS41IjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6MTYwMzQ6IgoJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hl Y2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVm PSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt bGlzdCI+ZmVhdHVyZSBsaXN0PC9hPi48L3A+Cgk8cD5Db3B5cmlnaHQgMjAwNiBOYXRoYW4g QXJ0aHVyPC9wPgoJPHA+UmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwg c2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhw IGZvciBkZXRhaWxzPC9wPgoJPHA+VGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5 IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9h cnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4uICBJdCBhbHNvIGNvbnRhaW5zIGNvZGUg YWRhcHRlZCBmcm9tIGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUuPC9wPgoJPGgzPkNvbmZpZ3Vy YXRpb248L2gzPgoJPGg0PlN0ZXAgMTogQ3JlYXRlIGEgbmV3IHNlY3Rpb248L2g0PgoJPHA+ dHJ1X3RhZ3MgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lhbCBUZXh0cGF0 dGVybiBzZWN0aW9uIG5hbWVkICYjODIyMDt0YWcsJiM4MjIxOyBieSBkZWZhdWx0PHN1cD48 YSBocmVmPSIjZm4xMjEyNDE4MTM0NDQ1NzAzOTIwYTljIj4xPC9hPjwvc3VwPi4gIENyZWF0 ZSB0aGF0IHNlY3Rpb24sIHVzaW5nIHdoYXRldmVyIHNldHRpbmdzIHlvdSBsaWtlLiAgKFlv dSB3b24mIzgyMTc7dCBiZSBwdWJsaXNoaW5nIGFydGljbGVzIHRvIHRoYXQgc2VjdGlvbi4p ICBIZXJlJiM4MjE3O3Mgd2hhdCBJIHVzZTxzdXA+PGEgaHJlZj0iI2ZuMTUwOTA0Mjg3MTQ0 NDU3MDM5MjU4YjgiPjI8L2E+PC9zdXA+OjwvcD4KCTxwPjxpbWcgc3JjPSJodHRwOi8vd3d3 LnRydWlzdC5jb20vaW1hZ2VzLzIucG5nIiBoZWlnaHQ9IjI4MCIgd2lkdGg9IjM5OCIgYWx0 PSJ0YWcgc2VjdGlvbiBjb25maWd1cmF0aW9uIiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8 cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjEyMTI0MTgxMzQ0NDU3MDM5MjBhOWMiPjxzdXA+ MTwvc3VwPiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBuYW1lLCBidXQgeW91IGhhdmUgdG8g dXNlIGEgc3BlY2lhbCBhdHRyaWJ1dGUgaW4gc29tZSBvZiB0aGUgcGx1Z2luIGNhbGxzIHRv IG1ha2UgIGV2ZXJ5dGhpbmcgd29yayBjb3JyZWN0bHkuICBTZWUgYmVsb3cgZm9yIGRldGFp bHMuPC9wPgoJPHAgY2xhc3M9ImZvb3Rub3RlIiBpZD0iZm4xNTA5MDQyODcxNDQ0NTcwMzky NThiOCI+PHN1cD4yPC9zdXA+IE5vdGUgdGhhdCBJIHVzZSB0aGUgJiM4MjE2O2RlZmF1bHQm IzgyMTc7IHBhZ2UgJiM4MjExOyB0aGF0IGNob2ljZSBtYXkgbm90IGJlIHJpZ2h0IGZvciB5 b3UuICBUaGlzIHNlY3Rpb24gd2lsbCBiZSBzaG93biB3aGVuZXZlciB5b3UgY2xpY2sgb24g YSB0YWcsIHRvIGRpc3BsYXkgdGhlIHRhZyBzZWFyY2ggcmVzdWx0cy4gIFlvdSYjODIxNzts bCB3YW50IGEgcGFnZSB0aGF0IGhhcyB0aGUgY29ycmVjdCBsYXlvdXQvaGVhZGVycy9mb290 ZXJzLiAgSSB1c2UgbXkgZGVmYXVsdCBwYWdlLCB3aXRoIDxjb2RlPiZsdDt0eHA6aWZfc2Vj dGlvbiBuYW1lPSJ0YWciJmd0OzwvY29kZT4gdG8gY2hhbmdlIHRoZSBwYWdlIGRpc3BsYXkg aW4gdGhpcyBjYXNlLjwvcD4KCTxoND5TdGVwIDI6IENhbGwgdGhlIHBsdWdpbiBmcm9tIHRo YXQgc2VjdGlvbjwvaDQ+Cgk8cD5UbyBtYWtlIHRhZyBzZWFyY2hpbmcgYW5kIHRoZSBkZWZh dWx0IHRhZyBjbG91ZCB3b3JrLCB5b3UmIzgyMTc7bGwgbmVlZCB0byBjYWxsIDxjb2RlPiZs dDt0eHA6dHJ1X3RhZ3NfaGFuZGxlciAvJmd0OzwvY29kZT4gZnJvbSB0aGUgcGFnZSB5b3Ug Y2hvc2UgaW4gU3RlcCAxLiAgSSByZXBsYWNlZCB0aGUgZGVmYXVsdCA8Y29kZT4mbHQ7dHhw OmFydGljbGUgLyZndDs8L2NvZGU+IHdpdGggc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Cjxw cmU+Jmx0O3R4cDppZl9zZWN0aW9uIG5hbWU9InRhZyImZ3Q7CiAgJmx0O3R4cDp0cnVfdGFn c19oYW5kbGVyIC8mZ3Q7CiZsdDt0eHA6ZWxzZSAvJmd0OwogICZsdDt0eHA6YXJ0aWNsZSAv Jmd0OwombHQ7L3R4cDppZl9zZWN0aW9uJmd0OzwvcHJlPgoJPGg0PlN0ZXAgMzogQ29uZmln dXJlIHlvdXIgYXJ0aWNsZSBmb3JtIHRvIGRpc3BsYXkgdGFnczwvaDQ+Cgk8cD5UbyBtYWtl IGVhY2ggYXJ0aWNsZSBzaG93IGEgbGlzdCBvZiBhbGwgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3 aXRoIGl0LCBwdXQgc29tZXRpbmcgbGlrZSB0aGlzIGluIHlvdXIgYXJ0aWNsZSBmb3JtOjwv cD4KPHByZT4mbHQ7dHhwOnRydV90YWdzX2lmX2hhc190YWdzJmd0OwogIHRhZ3M6ICZsdDt0 eHA6dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlIC8mZ3Q7CiZsdDsvdHhwOnRydV90YWdzX2lmX2hh c190YWdzJmd0OzwvcHJlPgoJPGg0PlN0ZXAgNDogRHJvcCBhIGN1c3RvbSB0YWcgY2xvdWQg c29tZXdoZXJlLCBpZiB5b3Ugd2FudDwvaDQ+Cgk8cD5JZiB5b3UmIzgyMTc7ZCBsaWtlIHRv IHNob3cgYSB0YWcgY2xvdWQgc29tZXdoZXJlIG9uIHlvdXIgc2l0ZSAob3RoZXIgdGhhbiAv dGFnLyksIHB1dCBzb21ldGhpbmcgbGlrZSB0aGlzIGluIHRoYXQgcGFnZTo8L3A+CjxwcmU+ Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCAvJmd0OzwvcHJlPgoJPHA+U2VlIGJlbG93IGZvciBs b3RzIG9mIGZvcm1hdHRpbmcgb3B0aW9ucywgaW5jbHVkaW5nIHRoZSBhYmlsaXR5IHRvIG91 dHB1dCBhIHNpbXBsZSBsaXN0IGluc3RlYWQgb2YgYSBjbG91ZCAodXNpbmcgPGNvZGU+dHJ1 X3RhZ3NfbGlzdDwvY29kZT4pLjwvcD4KCTxoND5TdGVwIDU6IFN0YXJ0IHRhZ2dpbmchPC9o ND4KCTxwPldoZW5ldmVyIHlvdSB3cml0ZSBhbiBhcnRpY2xlLCBwdXQgeW91ciB0YWdzIGlu dG8gdGhlIEtleXdvcmRzIGZpZWxkIGluIFRleHRwYXR0ZXJuLiAgKFRoZSBLZXl3b3JkcyBm aWVsZCBoaWRlcyBiZWhpbmQgdGhlICYjODIyMDtBZHZhbmNlZCBPcHRpb25zJiM4MjIxOyBs aW5rIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlICYjODIyMDt3cml0ZSYjODIyMTsgcGFnZS4p ICBUYWdzIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQgY2FuIGhhdmUgc3Bh Y2VzPHN1cD48YSBocmVmPSIjZm4xMjEyNDE4MTM0NDQ1NzAzOTIwYTljIj4xPC9hPjwvc3Vw Pi48L3A+Cgk8cD5Zb3UmIzgyMTc7bGwgcHJvYmFibHkgd2FudCB0byBpbnN0YWxsIFJvYiBT YWJsZSYjODIxNztzIDxhIGhyZWY9Imh0dHA6Ly93d3cud2lsc2hpcmVvbmUuY29tL3RleHRw YXR0ZXJuLXBsdWdpbnMvcnNzLWFkbWluLXNob3ctYWR2LW9wdHMiPnJzc19hZG1pbl9zaG93 X2Fkdl9vcHRzPC9hPiwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGFuZCB0aGUgJiM4 MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7IHNlY3Rpb24gb2YgdGhlICYjODIyMDt3cml0 ZSYjODIyMTsgcGFnZSwgd2hlbiB5b3UgYXJlIHdyaXRpbmcgYXJ0aWNsZXMuICBUaGF0IGdp dmVzIHlvdSBlYXN5IGFjY2VzcyB0byB0aGUgS2V5d29yZHMgZmllbGQuPC9wPgoJPHAgY2xh c3M9ImZvb3Rub3RlIiBpZD0iZm4xMjEyNDE4MTM0NDQ1NzAzOTIwYTljIj48c3VwPjE8L3N1 cD4gVGFncyB3aXRoIHNwYWNlcyB3aWxsIGdlbmVyYXRlIHVybHMgd2l0aCBkYXNoZXMsIHdo aWNoIHdpbGwgd29yayBjb3JyZWN0bHkuICBUYWdzIHdpdGggZGFzaGVzIHdpbGwgYWxzbyB3 b3JrIGNvcnJlY3RseS48L3A+Cgk8aDQ+U3RlcCA2OiBGYW5jeSBkaXNwbGF5IGN1c3RvbWl6 YXRpb248L2g0PgoJPHA+WW91IGNhbiB1c2UgPGNvZGU+dHJ1X3RhZ3NfaWZfdGFnX3NlYXJj aDwvY29kZT4sIDxjb2RlPnRydV90YWdzX3RhZ19wYXJhbWV0ZXI8L2NvZGU+LCBhbmQgPGNv ZGU+dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcjwvY29kZT4gdG8gY3VzdG9taXplIHlvdXIg cGFnZSB0aXRsZXMgb3IgdGFnIHNlYXJjaCByZXN1bHRzLiAgU2VlIGJlbG93IGZvciBkZXRh aWxzLiAgU2VlIHRoZSB0aXRsZWJhciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5j b20vIj50cnVpc3QuY29tPC9hPiBmb3IgYW4gZXhhbXBsZS48L3A+Cgk8aDQ+U3RlcCA3OiBU dXJuIG9uIGNsZWFuIHVybHM8L2g0PgoJPHA+Q2xlYW4gdXJscyBhcmUgbm93IHBvc3NpYmxl IHdpdGggdHJ1X3RhZ3MsIHByb3ZpZGVkIHRoYXQgeW91IGFyZSB3aWxsaW5nIHRvIG1vZGlm eSBUZXh0cGF0dGVybiYjODIxNztzIHJld3JpdGUgcnVsZXMgKGluIHRoZSAuaHRhY2Nlc3Mg ZmlsZSkuICBCdXQgYmUgd2FybmVkICYjODIxMTsgcmV3cml0ZSBydWxlcyBhcmUgY29tcGxl eC4gIEkgbWFrZSBubyBndWFyYW50ZWVzIHRoYXQgdGhpcyB3b24mIzgyMTc7dCBlYXQgeW91 ciBjaGlsZHJlbi4gIDxzdHJvbmc+WW91IGRvbiYjODIxNzt0IGhhdmUgdG8gZG8gdGhpczwv c3Ryb25nPiBidXQgYSBsb3Qgb2YgcGVvcGxlIHdhbnQgaXQuICBUaGlzIHNpdGUgdXNlcyBp dCwgaWYgdGhhdCBoZWxwcy48L3A+Cgk8cD5IZXJlJiM4MjE3O3Mgd2hhdCB0byBkbzo8L3A+ Cgk8b2w+CgkJPGxpPkFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIFRleHRwYXR0ZXJuJiM4 MjE3O3MgLmh0YWNjZXNzIGZpbGUgKGZvdW5kIGluIHRoZSByb290IG9mIHlvdXIgVGV4dHBh dHRlcm4gZGlyZWN0b3J5KSwgYWRqdXN0aW5nIHRoZW0gaWYgbmVjZXNzYXJ5LiAgVGhlc2Ug bGluZXMgc2hvdWxkIGJlIDxzdHJvbmc+YWZ0ZXI8L3N0cm9uZz4gdGhlPC9saT4KCTwvb2w+ Cgk8cD48ZGl2IGNsYXNzPSJwcmUiPjwvcD4KCTxwPlJld3JpdGVSdWxlICYjOTQ7KC4mIzQz OykgJiM0NTsgW1BULExdPC9wPgoJPHA+PC9kaXY+PC9wPgoJPHA+YW5kIDxzdHJvbmc+YmVm b3JlPC9zdHJvbmc+IHRoZTwvcD4KCTxwPjxkaXYgY2xhc3M9InByZSI+PC9wPgoJPHA+UmV3 cml0ZVJ1bGUgJiM5NDsoLiYjNDI7KSBpbmRleC5waHA8L3A+Cgk8cD48L2Rpdj48L3A+Cgk8 cD5IZXJlJiM4MjE3O3MgdGhlIGJpdCB0byBpbnNlcnQ6PC9wPgoJPHA+PGRpdiBjbGFzcz0i cHJlIj48L3A+Cgk8cD4jVGhpcyBwYXRoIHNob3VsZCBtYXRjaCB0aGUgcmVsYXRpdmUgdXJs IG9mIHlvdXIgVGV4dHBhdHRlcm4gaW5zdGFsbDxiciAvPgpSZXdyaXRlQmFzZSAvPGJyIC8+ CiNJZiB5b3UncmUgdXNpbmcgYSBzZWN0aW9uIG90aGVyIHRoYW4gJiMzNDt0YWcmIzM0Oywg Y2hhbmdlIHRoZSBmb2xsb3dpbmcgdHdvIHJ1bGVzIGFjY29yZGluZ2x5PGJyIC8+ClJld3Jp dGVSdWxlICYjOTQ7dGFnLyhbJiM5NDsvXSYjNDM7KSQgdGFnLyQxLyBbUixMXTxiciAvPgpS ZXdyaXRlUnVsZSAmIzk0O3RhZy8oLiYjNDM7KS8kICYjNjM7cyYjNjE7dGFnJmFtcDt0JiM2 MTskMTwvcD4KCTxwPjwvZGl2PjwvcD4KCTxvbD4KCQk8bGk+PHN0cm9uZz5DaGVjayB0byBt YWtlIHN1cmUgeW91ciBzaXRlIGlzIHN0aWxsIHdvcmtpbmcuPC9zdHJvbmc+PC9saT4KCQk8 bGk+RWRpdCB0aGUgdHJ1X3RhZ3MgcGx1Z2luIChhZG1pbiAtPiBwbHVnaW5zLCBjbGljayAm IzgyMTY7RWRpdCYjODIxNzspIGFuZCBjaGFuZ2UgdGhlIDxjb2RlPnRydV90YWdzX3VzZV9j bGVhbl91cmxzKCk8L2NvZGU+IGZ1bmN0aW9uIHRvIHJldHVybiA8Y29kZT4xPC9jb2RlPi4g IChJdCYjODIxNztzIHRoZSBmaXJzdCBmdW5jdGlvbi4pPC9saT4KCQk8bGk+Q2xlYW4gdXJs cyBzaG91bGQgYmUgd29ya2luZyBub3cuICBUcnkgY2xpY2tpbmcgYSB0YWcgbGluayB0byBz ZWUgd2hhdCB1cmwgaXQgcmVmZXJlbmNlcy48L2xpPgoJCTxsaT5CeSBkZWZhdWx0LCBhcnRp Y2xlIHRhZ3Mgd2lsbCBzZXQgdGhlIDxjb2RlPnJlbD0idGFnIjwvY29kZT4gYXR0cmlidXRl LCBhbmQgdGhlIHRhZyBjbG91ZCAob3IgbGlzdCkgd29uJiM4MjE3O3QuICBUaGlzIGNhbiBi ZSBjb250cm9sbGVkIHdpdGggdGhlIDxjb2RlPnVzZXJlbHRhZzwvY29kZT4gYXR0cmlidXRl OyBzZWUgYmVsb3cgZm9yIGRldGFpbHMuPC9saT4KCTwvb2w+Cgk8aDM+VGFnIHJlZmVyZW5j ZTwvaDM+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfaGFuZGxlcjwvY29kZT48L2g0PgoJPHA+VGhp cyBpcyB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGRyaXZlcyB0YWcgc2VhcmNoIGFuZCBzaG93 cyB0aGUgZ2VuZXJpYyB0YWcgY2xvdWQuICBJdCBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhl IHBhZ2UgdGhhdCBpcyB1c2VkIGluIHRoZSAmIzgyMTY7dGFnJiM4MjE3OyBzZWN0aW9uLiAg SXQgZ2VuZXJhbGx5IGNhbGxzIDxjb2RlPmRvQXJ0aWNsZXMoKTwvY29kZT4gKGluIHRoZSBU ZXh0cGF0dGVybiBjb2RlKSB0byBkaXNwbGF5IHRhZyBzZWFyY2ggcmVzdWx0cywgYnV0IGlm IG5vIHRhZyB3YXMgcGFzc2VkIGluIHRoZSB1cmwgaXQgd2lsbCBjYWxsIDxjb2RlPnRydV90 YWdzX2Nsb3VkPC9jb2RlPiBpbnN0ZWFkLjwvcD4KCTxwPlRoaXMgdGFnIGFjY2VwdHMgbW9z dCBvZiB0aGUgc3RhbmRhcmQgPGNvZGU+dHhwOmFydGljbGU8L2NvZGU+IGF0dHJpYnV0ZXMs IHdoaWNoIHdpbGwgYmUgYXBwbGllZCBkdXJpbmcgdGhlIHRhZyBzZWFyY2guICBOb3RlIHRo YXQgPGNvZGU+dHJ1X3RhZ3NfaGFuZGxlcjwvY29kZT4gPHN0cm9uZz5kb2VzIG5vdDwvc3Ry b25nPiBzdXBwb3J0IHVzaW5nIG11bHRpcGxlIHNlY3Rpb25zIHdpdGggdGhlIDxjb2RlPnNl Y3Rpb248L2NvZGU+IGF0dHJpYnV0ZSwgd2hlbiBkb2luZyBhIHRhZyBzZWFyY2guICBJZiBt dWx0aXBsZSBzZWN0aW9ucyBhcmUgcGFzc2VkLCBub25lIGFyZSB1c2VkLjwvcD4KCTxwPjxz dHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW4gVGV4dHBhdHRlcm4sIHRoZSA8Y29kZT5saW1pdDwv Y29kZT4gYXR0cmlidXRlIGlzIGRlZmF1bHRlZCB0byA8Y29kZT4xMDwvY29kZT4sIHRvIGxp bWl0IHRoZSBvdXRwdXQgdG8gMTAgYXJ0aWNsZXMgcGVyIHBhZ2UsIGFuZCB0aGUgPGNvZGU+ dHhwOm9sZGVyPC9jb2RlPiBhbmQgPGNvZGU+dHhwOm5ld2VyPC9jb2RlPiB0YWdzIGFyZSB1 c2VkIHRvIHBhZ2luYXRlIHRoZSBmdWxsIGxpc3QuICBUaGUgPGNvZGU+dHhwOm9sZGVyPC9j b2RlPiBhbmQgPGNvZGU+dHhwOm5ld2VyPC9jb2RlPiB0YWdzIGRvIG5vdCB3b3JrIHdpdGgg dHJ1X3RhZ3MsIGJ1dCB0aGUgPGNvZGU+bGltaXQ8L2NvZGU+IGlzIHN0aWxsIHVzZWQgYnkg VGV4dHBhdHRlcm4gd2hlbiBpdCBvdXRwdXRzIHRoZSBhcnRpY2xlcy4gIFRoZXJlZm9yZSwg dHJ1X3RhZ3MgdXNlcyBhIGRlZmF1bHQgbGltaXQgb2YgPGNvZGU+MTAwMDwvY29kZT4gd2hl biBkb2luZyBhbiBhcnRpY2xlIHNlYXJjaC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBsaW1p dCBieSBzZXR0aW5nIHRoZSA8Y29kZT5saW1pdDwvY29kZT4gYXR0cmlidXRlIG9uIDxjb2Rl PnRydV90YWdzX2hhbmRsZXI8L2NvZGU+LjwvcD4KCTxwPlRoaXMgdGFnIHdpbGwgYWxzbyBh Y2NlcHQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIHVzZWQgYnkgPGNvZGU+dHJ1X3RhZ19jbG91 ZDwvY29kZT4uICBTZWUgYmVsb3cgZm9yIGRldGFpbHMuPC9wPgoJPGg0Pjxjb2RlPnRydV90 YWdzX2lmX2hhc190YWdzPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIGNvbmRpdGlvbmFsIHRhZyBj YW4gYmUgdXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0sIGFuZCB3aWxsIGV2YWx1YXRlIGl0cyBj b250ZW50cyAoZS5nLiAmIzgyMjA7cmV0dXJuIHRydWUmIzgyMjE7KSBpZiB0aGUgY3VycmVu dCBhcnRpY2xlIGhhcyB0YWdzLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19mcm9tX2FydGlj bGU8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGluIGFuIGFydGljbGUg Zm9ybSB0byByZXR1cm4gYSBsaXN0IG9mIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJy ZW50IGFydGljbGUuICBUeXBpY2FsbHkgKHNlZSBiZWxvdyksIGVhY2ggdGFnIGluIHRoZSBs aXN0IHdpbGwgYmUgYSBsaW5rICg8Y29kZT4mbHQ7YSBocmVmPS4uLiZndDs8L2NvZGU+KSB0 byB0aGUgdGFnIHNlYXJjaCB1cmwgZm9yIHRoYXQgcGFydGljdWxhciB0YWcuPC9wPgoJPHA+ VGhpcyB0YWcgYWNjZXB0cyB0aGUgc3RhbmRhcmQgPGNvZGU+d3JhcHRhZzwvY29kZT4sIDxj b2RlPmJyZWFrPC9jb2RlPiwgPGNvZGU+Y2xhc3M8L2NvZGU+LCBhbmQgPGNvZGU+YnJlYWtj bGFzczwvY29kZT4gYXR0cmlidXRlcy48L3A+Cgk8cD5JZiB5b3UgZG9uJiM4MjE3O3Qgd2Fu dCB0byBoYXZlIHRoZSB0YWdzIGJlIGxpbmtzLCB5b3UgY2FuIHNldCA8Y29kZT5nZW5lcmF0 ZWxpbmtzPSIwIjwvY29kZT4gdG8gdHVybiB0aGUgbGlua3Mgb2ZmLjwvcD4KCTxwPkl0IGFs c28gYWNjZXB0cyBhIDxjb2RlPnRhZ3NlY3Rpb248L2NvZGU+IGF0dHJpYnV0ZSwgd2hpY2gg dGVsbHMgdHJ1X3RhZ3Mgd2hhdCByZWxhdGl2ZSB1cmwgdG8gdXNlIHRvIGZpbmQgdGhlICYj ODIxNjt0YWcmIzgyMTc7IHNlY3Rpb24uICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhh dmUgbmFtZWQgdGhlIHNlY3Rpb24gc29tZXRoaW5nIG90aGVyIHRoYW4gJiM4MjE2O3RhZyYj ODIxNzsuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byA8Y29kZT50YWc8L2NvZGU+Ljwv cD4KCTxwPklmIHlvdSBoYXZlIGNsZWFuIHVybHMgdHVybmVkIG9uIChzZWUgYWJvdmUpLCB5 b3UgY2FuIHVzZSB0aGUgPGNvZGU+dXNlcmVsdGFnczwvY29kZT4gYXR0cmlidXRlIHRvIHNw ZWNpZnkgd2hldGhlciBsaW5rcyBpbiB0aGUgbGlzdCBzaG91bGQgaGF2ZSB0aGUgPGEgaHJl Zj0iaHR0cDovL21pY3JvZm9ybWF0cy5vcmcvd2lraS9yZWx0YWciPjxjb2RlPnJlbD0idGFn IjwvY29kZT48L2E+ICAodXNlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRlY2hub3JhdGku Y29tLyI+VGVjaG5vcmF0aTwvYT4pIGF0dHJpYnV0ZSBzZXQuICBOb3RlIHRoYXQgdGhpcyB3 b24mIzgyMTc7dCB3b3JrIGlmIHlvdSB0dXJuIG9mZiBsaW5rcy4gIEFsc28gbm90ZSB0aGF0 IHRhZ3MgZG9uJiM4MjE3O3Qgc2hvdyB1cCBpbiB0aGUgUlNTL0F0b20gZmVlZHMsIHVubGVz cyB5b3UgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMu cGhwP3BpZD00MDkwNyNwNDA5MDciPmhhY2sgdGhlIHRleHRwYXR0ZXJuIHNvdXJjZTwvYT4u ICBUaGlzIGlzIG9uIGJ5IGRlZmF1bHQuPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2Nsb3Vk PC9jb2RlPjwvaDQ+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT48L2g0PgoJPHA+ VGhlc2UgdHdvIHRhZ3MgZG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgJiM4MjExOyA8Y29kZT50 cnVfdGFnc19jbG91ZDwvY29kZT4ganVzdCBwcm92aWRlcyBkaWZmZXJlbnQgZGVmYXVsdHMg dG8gPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4uPC9wPgo8cD48Y29kZT50cnVfdGFnc19j bG91ZDwvY29kZT4gY2FuIGJlIHVzZWQgb24gYW55IHBhZ2UsIGFuZCBpcyBnZW5lcmFsbHkg dXNlZCB0byBnZW5lcmF0ZSBhIHNpbXBsZSB0YWcgY2xvdWQgb2YgYWxsIHRoZSB0YWdzIHVz ZWQgb24geW91ciBzaXRlLiAgVGhlIGNsb3VkIGlzIHJlYWxseSBqdXN0IGEgbGlzdCBvZiBs aW5rcywgbXVjaCBsaWtlIHRoYXQgZ2VuZXJhdGVkIGJ5IDxjb2RlPnRydV90YWdzX2Zyb21f YXJ0aWNsZTwvY29kZT4sIGJ1dCB3aXRoIGEgPGNvZGU+c3R5bGU8L2NvZGU+IGF0dHJpYnV0 ZSBzZXQgb24gZWFjaCBsaW5rIHRvIGdpdmUgaXQgYSBmb250IHNpemUgcmFuZ2luZyBmcm9t IDEwMCUgdG8gMjAwJS48L3A+CjxwPjxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+IGNhbiBi ZSB1c2VkIG9uIGFueSBwYWdlLCBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gb3V0cHV0IGEg YnVsbGV0ZWQgbGlzdCBvZiBhbGwgdGhlIHRhZ3MgdXNlZCBvbiB5b3VyIHNpdGUuICBCeSBk ZWZhdWx0LCB0aGUgdGFncyB3aWxsIGFsbCBoYXZlIGEgZm9udC1zaXplIG9mIDEwMCUuPC9w Pgo8cD48Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT4gYW5kIDxjb2RlPnRydV90YWdzX2xp c3Q8L2NvZGU+IGJvdGggc2V0IHRoZSA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9m IGVhY2ggdGFnLCBzcGVjaWZ5aW5nIHR3byBjbGFzc2VzLiAgVGhlIGZpcnN0IGNsYXNzIGdy b3VwcyB0aGUgdGFncyBpbnRvIGNhdGVnb3JpZXMsIHdpdGggY2xhc3NlcyBvZiA8Y29kZT50 YWdTaXplU21hbGxlc3Q8L2NvZGU+LCA8Y29kZT50YWdTaXplTWVkaXVtPC9jb2RlPiwgYW5k IDxjb2RlPnRhZ1NpemVMYXJnZXN0PC9jb2RlPi4gIFVzaW5nIHRoZXNlLCB5b3UgY291bGQg bWFrZSB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgdGFncyBoYXZlIGRpZmZlcmVudCBzdHls ZXMgdGhhbiBhbGwgdGhlIG90aGVycy48L3A+Cgk8cD5UaGUgc2Vjb25kIGNsYXNzIGluZGlj YXRlcyB0aGUgJiM4MjIwO3N0ZXAmIzgyMjE7IG9mIHRoZSBjdXJyZW50IHRhZywgd2l0aCBj bGFzc2VzIG9mIDxjb2RlPnRhZ1NpemUxPC9jb2RlPiwgPGNvZGU+dGFnU2l6ZTI8L2NvZGU+ LCBhbmQgc28gb24uICBUaGVzZSBnaXZlIHlvdSBwcmVjaXNlIGNvbnRyb2wgb3ZlciBlYWNo IHRhZyBzaXplLCBpZiB5b3Ugd2FudCBpdC48L3A+Cgk8cD5JZiB5b3UgdXNlIHRoZXNlIGNs YXNzZXMgdG8gY3JlYXRlIHNwZWNpYWwgQ1NTIHJ1bGVzLCB5b3UgbWF5IGFsc28gd2FudCB0 byBzZXQgdGhlIDxjb2RlPnNldHNpemVzPC9jb2RlPiBhdHRyaWJ1dGUsIGRlc2NyaWJlZCBi ZWxvdy48L3A+Cgk8aDU+Qm90aCB0YWdzIGFjY2VwdCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0 ZXM6PC9oNT4KCTx1bD4KCQk8bGk+VGhlIHN0YW5kYXJkIDxjb2RlPndyYXB0YWc8L2NvZGU+ LCA8Y29kZT5icmVhazwvY29kZT4sIDxjb2RlPmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJy ZWFrY2xhc3M8L2NvZGU+IGF0dHJpYnV0ZXMuICA8Y29kZT50cnVfdGFnc19jbG91ZDwvY29k ZT4gaGFzIGEgZGVmYXVsdCA8Y29kZT5icmVhazwvY29kZT4gb2YgYSBjb21tYS4gIDxjb2Rl PnRydV90YWdzX2xpc3Q8L2NvZGU+IGhhcyBhIGRlZmF1bHQgPGNvZGU+d3JhcHRhZzwvY29k ZT4gb2YgPGNvZGU+dWw8L2NvZGU+IGFuZCBhIGRlZmF1bHQgPGNvZGU+YnJlYWs8L2NvZGU+ IG9mIDxjb2RlPmxpPC9jb2RlPi48L2xpPgoJCTxsaT48Y29kZT50YWdzZWN0aW9uPC9jb2Rl Piwgd2hpY2ggdGVsbHMgdHJ1X3RhZ3Mgd2hhdCByZWxhdGl2ZSB1cmwgdG8gdXNlIHRvIGZp bmQgdGhlICYjODIxNjt0YWcmIzgyMTc7IHNlY3Rpb24uICBUaGlzIGNhbiBiZSB1c2VmdWwg aWYgeW91IGhhdmUgbmFtZWQgdGhlIHNlY3Rpb24gc29tZXRoaW5nIG90aGVyIHRoYW4gJiM4 MjE2O3RhZyYjODIxNzsuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byA8Y29kZT50YWc8 L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2RlPnNlY3Rpb248L2NvZGU+LCB3aGljaCB0ZWxscyBp dCB0byBsaW1pdCB0aGUgbGlzdCB0byB0YWdzIGZyb20gdGhlIGdpdmVuIHNlY3Rpb24gb3Ig c2VjdGlvbnMuICBGb3IgZXhhbXBsZSwgPGNvZGU+Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCBz ZWN0aW9uPSJibG9nLHJlZmVyZW5jZSIgLyZndDs8L2NvZGU+IHdvdWxkIG9ubHkgc2hvdyB0 YWdzIGZyb20gdGhlICYjODIyMDtibG9nJiM4MjIxOyBhbmQgJiM4MjIwO3JlZmVyZW5jZSYj ODIyMTsgc2VjdGlvbnMuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBibGFuayAodG8g c2hvdyB0YWdzIGZyb20gYWxsIHNlY3Rpb25zKS4KCTx1bD4KCQk8bGk+PHN0cm9uZz5Ob3Rl Ojwvc3Ryb25nPiBpZiB5b3UgdXNlIDxjb2RlPnNlY3Rpb248L2NvZGU+IHRvIGxpbWl0IHRo ZSBjbG91ZCB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiwgaXQgd29uJiM4MjE3O3QgbGltaXQg dGhlIHRhZyBzZWFyY2ggZmVhdHVyZSB0byB0aGF0IHNlY3Rpb24uICBUaGUgdGFnIHNlYXJj aCBmaW5kcyAodGFnZ2VkKSBhcnRpY2xlcyBmcm9tIGFsbCBzZWN0aW9ucywgbm8gbWF0dGVy IHdoYXQuICBUaGF0JiM4MjE3O3MgYSBzaWRlLWVmZmVjdCBvZiB0aGUgdXNlIG9mIDxjb2Rl PmRvQXJ0aWNsZXMoKTwvY29kZT4sIGFuZCBJIGRvbiYjODIxNzt0IHRoaW5rIHRoZXJlJiM4 MjE3O3MgYW55dGhpbmcgSSBjYW4gZG8gYWJvdXQgaXQuPC9saT4KCTwvdWw+PC9saT4KCQk8 bGk+PGNvZGU+bWlucGVyY2VudDwvY29kZT4gYW5kIDxjb2RlPm1heHBlcmNlbnQ8L2NvZGU+ LCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSB3ZWlnaHRlZCBmb250IHNpemVz IGluIHRoZSB0YWcgY2xvdWQvbGlzdC4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBk ZWZhdWx0cyB0byA8Y29kZT4xMDA8L2NvZGU+IGFuZCA8Y29kZT4yMDA8L2NvZGU+LCByZXNw ZWN0aXZlbHksIGFuZCA8Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPiBkZWZhdWx0cyB0byA8 Y29kZT4xMDA8L2NvZGU+IGFuZCA8Y29kZT4xMDA8L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2Rl PnNob3djb3VudHM8L2NvZGU+LCB3aGljaCB3aWxsIGFwcGVuZCBhIG51bWJlciBpbmRpY2F0 aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgYSB0YWcgaGFzIGJlZW4gdXNlZCwgdG8gZWFjaCB0 YWcgaW4gdGhlIGxpc3QuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHNlZTogPHNwYW4gY2xh c3M9InByZSI+PGEgaHJlZj0iLz9zPXRhZyYjMzg7dD1saWZlIj5saWZlPC9hPiBbM10sIDxh IGhyZWY9Ii8/cz10YWcmIzM4O3Q9dGVjaCI+dGVjaDwvYT4gWzVdPC9zcGFuPiBpbiBteSB0 YWcgY2xvdWQsIGlmIHRoaXMgd2FzIHR1cm5lZCBvbi4gIFRoaXMgaXMgb2ZmIGJ5IGRlZmF1 bHQuICBVc2UgPGNvZGU+MTwvY29kZT4gb3IgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gdHVybiBp dCBvbi4KCTx1bD4KCQk8bGk+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIHB1dCB0aGUgY291 bnRzIGluIHRoZSA8Y29kZT50aXRsZTwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSBsaW5rcywg d2hpY2ggd2lsbCBtYWtlIGl0IGFwcGVhciBpbiBhIHRvb2x0aXAuICBVc2UgPGNvZGU+c2hv d2NvdW50cz0idGl0bGUiPC9jb2RlPiBvciA8Y29kZT5zaG93Y291bnRzPSJib3RoIjwvY29k ZT4gKHRvIHNob3cgaXQgaW4gYm90aCBwbGFjZXMpIHRvIHR1cm4gaXQgb24uPC9saT4KCTwv dWw+PC9saT4KCQk8bGk+PGNvZGU+Y291bnR3cmFwY2hhcnM8L2NvZGU+LCB3aGljaCBjb250 cm9scyB0aGUgY2hhcmFjdGVycyB1c2VkIHRvIHNob3cgdGhlIHRhZyBjb3VudCwgaWYgPGNv ZGU+c2hvd2NvdW50czwvY29kZT4gaXMgdHVybmVkIG9uLiAgQnkgZGVmYXVsdCB0aGlzIGlz IDxjb2RlPltdPC9jb2RlPi4gIFRoZSBmaXJzdCBjaGFyYWN0ZXIgd2lsbCBiZSBwdXQgb24g dGhlIGxlZnQgc2lkZSBvZiB0aGUgbnVtYmVyLCBhbmQgdGhlIHNlY29uZCBjaGFyYWN0ZXIg d2lsbCBiZSBwdXQgb24gdGhlIHJpZ2h0LiAgRm9yIGV4YW1wbGUsIGEgPGNvZGU+Y291bnR3 cmFwY2hhcnM8L2NvZGU+IG9mIDxjb2RlPigpPC9jb2RlPiB3b3VsZCBzaG93OiA8c3BhbiBj bGFzcz0icHJlIj48YSBocmVmPSIvP3M9dGFnJiMzODt0PWxpZmUiPmxpZmU8L2E+ICgzKSwg PGEgaHJlZj0iLz9zPXRhZyYjMzg7dD10ZWNoIj50ZWNoPC9hPiAoNSk8L3NwYW4+PC9saT4K CQk8bGk+SWYgeW91IGhhdmUgY2xlYW4gdXJscyB0dXJuZWQgb24gKHNlZSBhYm92ZSksIHlv dSBjYW4gdXNlIHRoZSA8Y29kZT51c2VyZWx0YWdzPC9jb2RlPiBhdHRyaWJ1dGUgdG8gc3Bl Y2lmeSB3aGV0aGVyIGxpbmtzIGluIHRoZSBsaXN0IHNob3VsZCBoYXZlIHRoZSA8YSBocmVm PSJodHRwOi8vbWljcm9mb3JtYXRzLm9yZy93aWtpL3JlbHRhZyI+PGNvZGU+cmVsPSJ0YWci PC9jb2RlPjwvYT4gICh1c2VkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cudGVjaG5vcmF0aS5j b20vIj5UZWNobm9yYXRpPC9hPikgYXR0cmlidXRlIHNldC4gIFRoaXMgaXMgb2ZmIGJ5IGRl ZmF1bHQuPC9saT4KCQk8bGk+SWYgeW91IGRvbiYjODIxNzt0IHdhbnQgdGhlIHRhZ3MgdG8g YmUgbGlua3MsIHlvdSBjYW4gc2V0IDxjb2RlPmdlbmVyYXRlbGlua3M9IjAiPC9jb2RlPiB0 byB0dXJuIHRoZW0gb2ZmLjwvbGk+CgkJPGxpPjxjb2RlPm1pbnRhZ2NvdW50PC9jb2RlPiBh bmQgPGNvZGU+bWF4dGFnY291bnQ8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIGhpZGUgdGFncyB0 aGF0IG9ubHkgaGF2ZSBhIGZldyBhcnRpY2xlcywgb3IgdGhhdCBoYXZlIHRvbyBtYW55LiAg VGhleSBhcmUgZGVmYXVsdGVkIHRvIDxjb2RlPjA8L2NvZGU+IGFuZCA8Y29kZT4xMDAwPC9j b2RlPiwgcmVzcGVjdGl2ZWx5LiAgRm9yIGV4YW1wbGUsIDxjb2RlPm1pbnRhZ2NvdW50PSIy IjwvY29kZT4gd291bGQgaGlkZSBhbnkgdGFncyB0aGF0IHdlcmUgb25seSBhc3NvY2lhdGVk IHdpdGggYSBzaW5nbGUgYXJ0aWNsZS4gIElmIHlvdSBkbyB0aGlzLCB5b3UgbWF5IHdhbnQg dG8gYWRkIGEgbGluayB0byB0aGUgZGVmYXVsdCB0YWcgY2xvdWQsIHVzdWFsbHkgZm91bmQg YXQgPGNvZGU+L3RhZy88L2NvZGU+LjwvbGk+CgkJPGxpPklmIHlvdSB3YW50IHRvIGNvbnRy b2wgdGhlIHNpemUocykgb2YgdGhlIHRhZ3MgeW91cnNlbGYgKHRocm91Z2ggQ1NTKSwgc2V0 IDxjb2RlPnNldHNpemVzPSIwIjwvY29kZT4gdG8gdHVybiBvZmYgdGhlIDxjb2RlPnN0eWxl PSJmb250LXNpemU6IFhYWCUiPC9jb2RlPiBhdHRyaWJ1dGUgZ2VuZXJhdGlvbi4gIFRoYXQg d2lsbCBsZWF2ZSBiZWhpbmQgdGhlIGRlZmF1bHQgQ1NTIGNsYXNzZXMsIHdoaWNoIHlvdSBj YW4gdXNlIHRvIGNvbnRyb2wgdGhlIGRpc3BsYXkgb2YgeW91ciBjbG91ZC48L2xpPgoJPC91 bD4KCTxwPk5vdGUgdGhhdCB5b3UgY2FuIHVzZSB0aGUgYXR0cmlidXRlcyB0byBtYWtlIGVh Y2ggdGFnIGRvIHRoZSBzYW1lIHRoaW5nLiAgPGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+ IGlzIGp1c3QgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBhIHRhZyBj bG91ZCB1c2luZyA8Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPi4gIFRoZXJlZm9yZSwgaXQm IzgyMTc7cyBwb3NzaWJsZSB0byBoYXZlIGEgdGFnIGNsb3VkIHdpdGggdGFnIGNvdW50cyBz aG93aW5nLCBvciBoYXZlIGEgYnVsbGV0ZWQgbGlzdCB3aXRoIHZhcmlhYmxlIGZvbnQgc2l6 ZXMsIGV0Yy48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfaWZfdGFnX3NlYXJjaDwvY29kZT48 L2g0PgoJPHA+VGhpcyBjb25kaXRpb25hbCB0YWcgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW5k IHdpbGwgZXZhbHVhdGUgaXRzIGNvbnRlbnRzIChlLmcuICYjODIyMDtyZXR1cm4gdHJ1ZSYj ODIyMTspIGlmIHRoZSBjdXJyZW50IHVybCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIHRh ZyBzZWFyY2ggZ29pbmcgb24uICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8g ZG8gc29tZXRoaW5nIGxpa2UgY3VzdG9taXplIHRoZSB0aXRsZWJhciB3aGVuIHVzaW5nIHRo ZSB0YWcgc2VhcmNoLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc190YWdfcGFyYW1ldGVyPC9j b2RlPjwvaDQ+Cgk8cD5UaGlzIHRhZyBjYW4gYmUgdXNlZCBhbnl3aGVyZSBhbmQgd2lsbCBy ZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIHVuZGVyIHNlYXJjaCwgZHVyaW5n IGEgdGFnIHNlYXJjaC4gIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgd2l0aCA8Y29kZT50cnVf dGFnc19pZl90YWdfc2VhcmNoPC9jb2RlPi48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3Nfc2Vh cmNoX3BhcmFtZXRlcjwvY29kZT48L2g0PgoJPHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55 d2hlcmUgYW5kIHdpbGwgcmV0dXJuIHRoZSB0ZXh0IHRoZSB1c2VyIHR5cGVkIGludG8gdGhl IHN0YW5kYXJkIHNlYXJjaCBib3gsIGR1cmluZyBhIHJlZ3VsYXIgc2VhcmNoLiAgVGhpcyB0 YWcgaXMgbm90IHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHRhZ2dpbmcsIGJ1dCBjYW4gYmUg aGFuZHkgZm9yIGN1c3RvbWl6aW5nIHRoZSB0aXRsZWJhciBvbiBzZWFyY2ggcmVzdWx0IHBh Z2VzLjwvcD4KCgogIjtzOjQ6ImNvZGUiO3M6NjU3NToiCgoKI0NvcHlyaWdodCAyMDA2IE5h dGhhbiBBcnRodXIKI1JlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHNl ZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocCBm b3IgZGV0YWlscwojVGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5IFJhbiBBcm91 c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1 L3RhZ2dpbmctdGV4dHBhdHRlcm4KCgojU2VlIGh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZl cmVuY2UvNDk3L3RydXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIGZvciBpbnN0cnVjdGlvbnMK ZnVuY3Rpb24gdHJ1X3RhZ3NfdXNlX2NsZWFuX3VybHMoKQp7CglyZXR1cm4gMDsgI0RPIE5P VCBFTkFCTEUgVEhJUyB1bmxlc3MgeW91J3ZlIHJlYWQgdGhlIGluc3RydWN0aW9ucwp9CgoK ZnVuY3Rpb24gdHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgewoJZXh0cmFjdCgkX0dFVCk7Cglp ZiAoaXNzZXQoJHQpKSB7CgkJJGtleXdvcmRzID0gZXhwbG9kZSgnLCcsIHN0cmlwX3RhZ3Mo JHQpKTsKCQlmb3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsKCQkJaWYgKHN0cnBv cygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpCgkJCQkka2V5d29yZHNbXSA9IHN0cl9yZXBs YWNlKCctJywgJyAnLCAka2V5d29yZCk7CgkJfQoJCXByaW50ICRhdHRzWydrZXl3b3Jkcydd OwoJCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgkJaWYg KCRhdHRzWydzZWN0aW9uJ10gJiYgc3RycG9zKCRhdHRzWydzZWN0aW9uJ10sICcsJykgIT09 IGZhbHNlKQoJCQkkYXR0c1snc2VjdGlvbiddID0gJyc7CgkJaWYgKCEkYXR0c1snbGltaXQn XSkKCQkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7CgoJCXJldHVybiBkb0FydGljbGVzKCRh dHRzLCB0cnVlKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHRydV90YWdzX2Nsb3VkKCRhdHRzKTsK CX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX2hhc190YWdzKCRhdHRzLCAkdGhpbmcpIHsK CWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3Nf ZmllbGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxk LCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIp OwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAk c2l0ZXVybCwgJHBhdGhfZnJvbV9yb290OwoKCWV4dHJhY3QoJF9TRVJWRVIpOwoJZXh0cmFj dCgkdGhpc2FydGljbGUpOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3dyYXB0YWcnICAgICAg ID0+ICcnLAoJCQkJCQknYnJlYWsnICAgICAgICAgPT4gJywgJywKCQkJCQkJJ2NsYXNzJyAg ICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCQkJCSd0YWdzZWN0 aW9uJwk9PiAndGFnJywKCQkJCQkJJ3VzZXJlbHRhZycJPT4gJzEnLAoJCQkJCQknZ2VuZXJh dGVsaW5rcycJPT4gJzEnCgkJCQkJCSksJGF0dHMpKTsKCgkkdGFnc19maWVsZCA9IHRydV90 YWdzX2ZpZWxkKCk7CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVy biIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkkYWxsX3RhZ3Mg PSBleHBsb2RlKCIsIiwgdHJpbShzdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0pKSk7Cglz b3J0KCRhbGxfdGFncyk7CgkkYWxsX3RhZ3MgPSBhcnJheV91bmlxdWUoJGFsbF90YWdzKTsK CglpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQlpZiAodHJ1X3RhZ3NfdXNlX2NsZWFuX3VybHMo KSkgewoJCQkkdXJscHJlZml4ID0gJ2h0dHA6Ly8nIC4gJHNpdGV1cmwgLiAkcGF0aF9mcm9t X3Jvb3QgLiAkdGFnc2VjdGlvbiAuICcvJzsKCQkJJHVybHN1ZmZpeCA9ICR1c2VyZWx0YWcg PyAnLyIgcmVsPSJ0YWcnOiAnLyc7CgkJfSBlbHNlIHsKCQkJJHVybHByZWZpeCA9ICdodHRw Oi8vJyAuICRzaXRldXJsIC4gJHBhdGhfZnJvbV9yb290IC4gJz9zPScgLiAkdGFnc2VjdGlv biAuICcmYW1wO3Q9JzsKCQkJJHVybHN1ZmZpeCA9ICcnOwoJCX0KCgkJZm9yKCRpPTA7ICRp PGNvdW50KCRhbGxfdGFncyk7ICRpKyspIHsKCQkJJHRhZ3NfaHRtbFtdID0gJzxhIGhyZWY9 IicgLiAkdXJscHJlZml4IC4gc3RyX3JlcGxhY2UoJyAnLCAnLScsICRhbGxfdGFnc1skaV0p IC4gJHVybHN1ZmZpeCAuICciPicgLiAkYWxsX3RhZ3NbJGldIC4nPC9hPic7CgkJfQoJfSBl bHNlIHsKCQkkdGFnc19odG1sID0gJGFsbF90YWdzOwoJfQoKCXJldHVybiBkb1dyYXAoJHRh Z3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc19jbG91ZCgkYXR0cykgewoJJGF0dHMgPSBsQXR0cyhhcnJheSgn d3JhcHRhZycJPT4gJycsCgkJCQknYnJlYWsnCT0+ICcsICcsCgkJCQknY2xhc3MnCT0+ICcn LAoJCQkJJ2JyZWFrY2xhc3MnCT0+ICcnLAoJCQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJ CQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ21h eHBlcmNlbnQnCT0+ICcyMDAnLAoJCQkJJ3Nob3djb3VudHMnCT0+ICcnLAoJCQkJJ2NvdW50 d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkJJ3VzZXJlbHRhZycJPT4gJycsCgkJCQknZ2VuZXJh dGVsaW5rcycJPT4gJzEnLAoJCQkJJ21pbnRhZ2NvdW50Jwk9PiAnMCcsCgkJCQknbWF4dGFn Y291bnQnCT0+ICcxMDAwJywKCQkJCSdzZXRzaXplcycJPT4gJzEnCgkJCSksJGF0dHMpOwoK CXJldHVybiB0cnVfdGFnc19saXN0KCRhdHRzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xp c3QoJGF0dHMpIHsKCWdsb2JhbCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9yb290OwoJZXh0cmFj dCgkX1NFUlZFUik7CgoJJGF0dHMgPSBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gJ3VsJywK CQkJCSdicmVhaycJPT4gJ2xpJywKCQkJCSdjbGFzcycJPT4gJycsCgkJCQknYnJlYWtjbGFz cycJPT4gJycsCgkJCQkndGFnc2VjdGlvbicJPT4gJ3RhZycsCgkJCQknc2VjdGlvbicJPT4g JycsCgkJCQknbWlucGVyY2VudCcJPT4gJzEwMCcsCgkJCQknbWF4cGVyY2VudCcJPT4gJzEw MCcsCgkJCQknc2hvd2NvdW50cycJPT4gJycsCgkJCQknY291bnR3cmFwY2hhcnMnCT0+ICdb XScsCgkJCQkndXNlcmVsdGFnJwk9PiAnJywKCQkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScs CgkJCQknbWludGFnY291bnQnCT0+ICcwJywKCQkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAn LAoJCQkJJ3NldHNpemVzJwk9PiAnMScKCQkJKSwkYXR0cyk7CglleHRyYWN0KCRhdHRzKTsK CgkkdGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxkKCk7CgoJJHNlY3Rpb25fY2xhdXNlID0g Jyc7CglpZiAoJHNlY3Rpb24gPD4gJycpIHsKCQkka2V5cyA9IHNwbGl0KCcsJywgJHNlY3Rp b24pOwoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAiIFNl Y3Rpb24gPSAnIiAuIHRyaW0oJGtleSkgLiAiJyI7CgkJfQoJCSRzZWN0aW9uX2NsYXVzZSA9 ICIgQU5EICgiIC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJaW5jbHVk ZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvc2VhcmNoLnBocCc7CgkkZmlsdGVyID0gZmlsdGVy U2VhcmNoKCk7CgkkYWxsX3RhZ3MgPSBhcnJheSgpOwoJJHJzID0gc2FmZV9yb3dzKCIkdGFn c19maWVsZCIsICJ0ZXh0cGF0dGVybiIsICIkdGFnc19maWVsZCA8PiAnJyIgLiAkc2VjdGlv bl9jbGF1c2UgLiAkZmlsdGVyIC4gIiBhbmQgU3RhdHVzID49ICc0JyBhbmQgUG9zdGVkIDwg bm93KCkiKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJJHRlbXBfYXJyYXkgPSBleHBs b2RlKCIsIiwgdHJpbShzdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOwoJCWZvciAo JGkgPSAwOyAkaSA8IGNvdW50KCR0ZW1wX2FycmF5KTsgJGkrKykgewoJCQkkdGVtcF9hcnJh eVskaV0gPSB0cmltKCR0ZW1wX2FycmF5WyRpXSk7CgkJfQoJCSRhbGxfdGFncyA9IGFycmF5 X21lcmdlKCRhbGxfdGFncywgJHRlbXBfYXJyYXkpOwoJfQoJc29ydCgkYWxsX3RhZ3MpOwoK CSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3MpOwoJJHRhZ3Nf dW5pcXVlID0gYXJyYXlfdW5pcXVlKCRhbGxfdGFncyk7CgoJZm9yZWFjaCAoJHRhZ3NfdW5p cXVlIGFzICRrZXkgPT4gJHRhZykgewoJCWlmICgkdGFnc193ZWlnaHRbJHRhZ10gPCAkbWlu dGFnY291bnQgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddID4gJG1heHRhZ2NvdW50KSB7CgkJCXVu c2V0KCR0YWdzX3VuaXF1ZVska2V5XSk7CgkJCXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7 CgkJfQoJfQoKCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsKCSRtaW4gPSBtaW4oJHRhZ3Nf d2VpZ2h0KTsKCSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAgOiAoJG1heHBlcmNl bnQgLSAkbWlucGVyY2VudCkgLyAoJG1heCAtICRtaW4pOwoKCWlmICgkZ2VuZXJhdGVsaW5r cykgewoJCWlmICh0cnVfdGFnc191c2VfY2xlYW5fdXJscygpKSB7CgkJCSR1cmxwcmVmaXgg PSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICR0YWdzZWN0aW9u IC4gJy8nOwoJCQkkdXJsc3VmZml4ID0gJHVzZXJlbHRhZyA/ICcvIiByZWw9InRhZyc6ICcv JzsKCQl9IGVsc2UgewoJCQkkdXJscHJlZml4ID0gJ2h0dHA6Ly8nIC4gJHNpdGV1cmwgLiAk cGF0aF9mcm9tX3Jvb3QgLiAnP3M9JyAuICR0YWdzZWN0aW9uIC4gJyZhbXA7dD0nOwoJCQkk dXJsc3VmZml4ID0gJyc7CgkJfQoJfQoKCWZvcmVhY2ggKCR0YWdzX3VuaXF1ZSBhcyAkdGFn KSB7CgkJJHRhZ193ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkdGFnc193ZWlnaHRb JHRhZ10gLSAkbWluKSAqICRzdGVwdmFsdWUpOwoKCQlpZiAoJHNldHNpemVzKQoJCQkkc3R5 bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOwoKCQkk dGFnX2NsYXNzID0gJyBjbGFzcz0iJzsKCQlpZiAoJHRhZ3Nfd2VpZ2h0WyR0YWddID09ICRt aW4pCgkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJZWxzZSBpZiAoJHRh Z3Nfd2VpZ2h0WyR0YWddID09ICRtYXgpCgkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVMYXJn ZXN0IjsKCQllbHNlCgkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOwoJCSR0YWdf Y2xhc3MgLj0gJyB0YWdTaXplJyAuICgkdGFnc193ZWlnaHRbJHRhZ10gKyAxIC0gJG1pbik7 CgkJJHRhZ19jbGFzcyAuPSAnIic7CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUgYnkgZ2R0cm9p YW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3Bp ZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7CgkJJGRpc3BsYXljb3VudD0g Jyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4gJHRhZ3Nfd2VpZ2h0WyR0YWdd IC4gJGNvdW50d3JhcGNoYXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUnIHx8 ICRzaG93Y291bnRzID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4g JGNvdW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0 bGUnKQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAoJGdlbmVyYXRl bGlua3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHN0cl9yZXBsYWNl KCcgJywgJy0nLCAkdGFnKSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9 ICc8YSBocmVmPScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxl Y291bnQgLiAnPicgLiAkdGFnIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVsc2Ug ewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0 aXRsZWNvdW50IC4gJz4nIC4gJHRhZyAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7CgkJ fQoJfQoKCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNs YXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNo KCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfc2VhcmNoaW5nID0gZ3BzKCd0Jyk7CgkkY29uZGl0 aW9uID0gKCFlbXB0eSgkdGFnX3NlYXJjaGluZykpPyB0cnVlIDogZmFsc2U7CglyZXR1cm4g cGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgpmdW5jdGlvbiB0cnVf dGFnc190YWdfcGFyYW1ldGVyKCkKewoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCd0JykpOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBzdHJp cF90YWdzKGdwcygncScpKTsKfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmllbGQoKSB7CglyZXR1 cm4gJ0tleXdvcmRzJzsKfQoKCgoiO3M6MzoibWQ1IjtzOjMyOiI5ZGQ5YzlhYmY2MmQzYTlj YTIyYTE3NDM2MjZkMDQxMSI7fQ==