# tru_tags v1.4 # 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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS40IjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6MTY0NTU6IgoJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hl Y2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVm PSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt bGlzdCI+ZmVhdHVyZSBsaXN0PC9hPi48L3A+Cgk8cD5Db3B5cmlnaHQgMjAwNiBOYXRoYW4g QXJ0aHVyPC9wPgoJPHA+UmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwg c2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhw IGZvciBkZXRhaWxzPC9wPgoJPHA+VGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5 IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9h cnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4uICBJdCBhbHNvIGNvbnRhaW5zIGNvZGUg YWRhcHRlZCBmcm9tIGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUuPC9wPgoJPGgzPkNvbmZpZ3Vy YXRpb248L2gzPgoJPGg0PlN0ZXAgMTogQ3JlYXRlIGEgbmV3IHNlY3Rpb248L2g0PgoJPHA+ dHJ1X3RhZ3MgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lhbCBUZXh0cGF0 dGVybiBzZWN0aW9uIG5hbWVkICYjODIyMDt0YWcsJiM4MjIxOyBieSBkZWZhdWx0PHN1cD48 YSBocmVmPSIjZm4xOTkyMjM1MTc2NDQyNWRiMzE4OTIzMSI+MTwvYT48L3N1cD4uICBDcmVh dGUgdGhhdCBzZWN0aW9uLCB1c2luZyB3aGF0ZXZlciBzZXR0aW5ncyB5b3UgbGlrZS4gIChZ b3Ugd29uJiM4MjE3O3QgYmUgcHVibGlzaGluZyBhcnRpY2xlcyB0byB0aGF0IHNlY3Rpb24u KSAgSGVyZSYjODIxNztzIHdoYXQgSSB1c2U8c3VwPjxhIGhyZWY9IiNmbjE1ODk4MDI5NDY0 NDI1ZGIzMThlMDdlIj4yPC9hPjwvc3VwPjo8L3A+Cgk8cD48aW1nIHNyYz0iaHR0cDovL3d3 dy50cnVpc3QuY29tL2ltYWdlcy8yLnBuZyIgaGVpZ2h0PSIyODAiIHdpZHRoPSIzOTgiIGFs dD0idGFnIHNlY3Rpb24gY29uZmlndXJhdGlvbiIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJ PHAgY2xhc3M9ImZvb3Rub3RlIiBpZD0iZm4xOTkyMjM1MTc2NDQyNWRiMzE4OTIzMSI+PHN1 cD4xPC9zdXA+IFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IG5hbWUsIGJ1dCB5b3UgaGF2ZSB0 byB1c2UgYSBzcGVjaWFsIGF0dHJpYnV0ZSBpbiBzb21lIG9mIHRoZSBwbHVnaW4gY2FsbHMg dG8gbWFrZSAgZXZlcnl0aGluZyB3b3JrIGNvcnJlY3RseS4gIFNlZSBiZWxvdyBmb3IgZGV0 YWlscy48L3A+Cgk8cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjE1ODk4MDI5NDY0NDI1ZGIz MThlMDdlIj48c3VwPjI8L3N1cD4gTm90ZSB0aGF0IEkgdXNlIHRoZSAmIzgyMTY7ZGVmYXVs dCYjODIxNzsgcGFnZSAmIzgyMTE7IHRoYXQgY2hvaWNlIG1heSBub3QgYmUgcmlnaHQgZm9y IHlvdS4gIFRoaXMgc2VjdGlvbiB3aWxsIGJlIHNob3duIHdoZW5ldmVyIHlvdSBjbGljayBv biBhIHRhZywgdG8gZGlzcGxheSB0aGUgdGFnIHNlYXJjaCByZXN1bHRzLiAgWW91JiM4MjE3 O2xsIHdhbnQgYSBwYWdlIHRoYXQgaGFzIHRoZSBjb3JyZWN0IGxheW91dC9oZWFkZXJzL2Zv b3RlcnMuICBJIHVzZSBteSBkZWZhdWx0IHBhZ2UsIHdpdGggPGNvZGU+Jmx0O3R4cDppZl9z ZWN0aW9uIG5hbWU9InRhZyImZ3Q7PC9jb2RlPiB0byBjaGFuZ2UgdGhlIHBhZ2UgZGlzcGxh eSBpbiB0aGlzIGNhc2UuPC9wPgoJPGg0PlN0ZXAgMjogQ2FsbCB0aGUgcGx1Z2luIGZyb20g dGhhdCBzZWN0aW9uPC9oND4KCTxwPlRvIG1ha2UgdGFnIHNlYXJjaGluZyBhbmQgdGhlIGRl ZmF1bHQgdGFnIGNsb3VkIHdvcmssIHlvdSYjODIxNztsbCBuZWVkIHRvIGNhbGwgPGNvZGU+ Jmx0O3R4cDp0cnVfdGFnc19oYW5kbGVyIC8mZ3Q7PC9jb2RlPiBmcm9tIHRoZSBwYWdlIHlv dSBjaG9zZSBpbiBTdGVwIDEuICBJIHJlcGxhY2VkIHRoZSBkZWZhdWx0IDxjb2RlPiZsdDt0 eHA6YXJ0aWNsZSAvJmd0OzwvY29kZT4gd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4K PHByZT4mbHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDsKICAmbHQ7dHhwOnRydV90 YWdzX2hhbmRsZXIgLyZndDsKJmx0O3R4cDplbHNlIC8mZ3Q7CiAgJmx0O3R4cDphcnRpY2xl IC8mZ3Q7CiZsdDsvdHhwOmlmX3NlY3Rpb24mZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCAzOiBDb25m aWd1cmUgeW91ciBhcnRpY2xlIGZvcm0gdG8gZGlzcGxheSB0YWdzPC9oND4KCTxwPlRvIG1h a2UgZWFjaCBhcnRpY2xlIHNob3cgYSBsaXN0IG9mIGFsbCB0aGUgdGFncyBhc3NvY2lhdGVk IHdpdGggaXQsIHB1dCBzb21ldGluZyBsaWtlIHRoaXMgaW4geW91ciBhcnRpY2xlIGZvcm06 PC9wPgo8cHJlPiZsdDt0eHA6dHJ1X3RhZ3NfaWZfaGFzX3RhZ3MmZ3Q7CiAgdGFnczogJmx0 O3R4cDp0cnVfdGFnc19mcm9tX2FydGljbGUgLyZndDsKJmx0Oy90eHA6dHJ1X3RhZ3NfaWZf aGFzX3RhZ3MmZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCA0OiBEcm9wIGEgY3VzdG9tIHRhZyBjbG91 ZCBzb21ld2hlcmUsIGlmIHlvdSB3YW50PC9oND4KCTxwPklmIHlvdSYjODIxNztkIGxpa2Ug dG8gc2hvdyBhIHRhZyBjbG91ZCBzb21ld2hlcmUgb24geW91ciBzaXRlIChvdGhlciB0aGFu IC90YWcvKSwgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhhdCBwYWdlOjwvcD4KPHBy ZT4mbHQ7dHhwOnRydV90YWdzX2Nsb3VkIC8mZ3Q7PC9wcmU+Cgk8cD5TZWUgYmVsb3cgZm9y IGxvdHMgb2YgZm9ybWF0dGluZyBvcHRpb25zLCBpbmNsdWRpbmcgdGhlIGFiaWxpdHkgdG8g b3V0cHV0IGEgc2ltcGxlIGxpc3QgaW5zdGVhZCBvZiBhIGNsb3VkICh1c2luZyA8Y29kZT50 cnVfdGFnc19saXN0PC9jb2RlPikuPC9wPgoJPGg0PlN0ZXAgNTogU3RhcnQgdGFnZ2luZyE8 L2g0PgoJPHA+V2hlbmV2ZXIgeW91IHdyaXRlIGFuIGFydGljbGUsIHB1dCB5b3VyIHRhZ3Mg aW50byB0aGUgS2V5d29yZHMgZmllbGQgaW4gVGV4dHBhdHRlcm4uICAoVGhlIEtleXdvcmRz IGZpZWxkIGhpZGVzIGJlaGluZCB0aGUgJiM4MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7 IGxpbmsgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdl LikgIFRhZ3Mgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBjYW4gaGF2ZSBz cGFjZXM8c3VwPjxhIGhyZWY9IiNmbjE5OTIyMzUxNzY0NDI1ZGIzMTg5MjMxIj4xPC9hPjwv c3VwPi4gIEJlIGNhcmVmdWwgbm90IHRvIGxlYXZlIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5n IGFuZCBlbmQgb2YgdGFncy4gIEhlcmUmIzgyMTc7cyBhIGdvb2QgZXhhbXBsZTo8L3A+Cgk8 cD48aW1nIHNyYz0iaHR0cDovL3d3dy50cnVpc3QuY29tL2ltYWdlcy8zLnBuZyIgaGVpZ2h0 PSIxMTAiIHdpZHRoPSIxMTgiIGFsdD0idGFncyB3aXRoIHNwYWNlcywgYnV0IG5vdCBuZXh0 IHRvIHRoZSBjb21tYXMiIGNsYXNzPSJkaWFncmFtIiAvPjwvcD4KCTxwPi4uLmFuZCBhIGJh ZCBvbmU6PC9wPgoJPHA+PGltZyBzcmM9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9pbWFnZXMv NC5wbmciIGhlaWdodD0iMTEyIiB3aWR0aD0iMTE5IiBhbHQ9InRhZ3Mgd2l0aCBzcGFjZXMg YWZ0ZXIgdGhlIGNvbW1hcyAoV1JPTkcpIiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8cD5Z b3UmIzgyMTc7bGwgcHJvYmFibHkgd2FudCB0byBpbnN0YWxsIFJvYiBTYWJsZSYjODIxNztz IDxhIGhyZWY9Imh0dHA6Ly93d3cud2lsc2hpcmVvbmUuY29tL3RleHRwYXR0ZXJuLXBsdWdp bnMvcnNzLWFkbWluLXNob3ctYWR2LW9wdHMiPnJzc19hZG1pbl9zaG93X2Fkdl9vcHRzPC9h Piwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGFuZCB0aGUgJiM4MjIwO0FkdmFuY2Vk IE9wdGlvbnMmIzgyMjE7IHNlY3Rpb24gb2YgdGhlICYjODIyMDt3cml0ZSYjODIyMTsgcGFn ZSwgd2hlbiB5b3UgYXJlIHdyaXRpbmcgYXJ0aWNsZXMuICBUaGF0IGdpdmVzIHlvdSBlYXN5 IGFjY2VzcyB0byB0aGUgS2V5d29yZHMgZmllbGQuPC9wPgoJPHAgY2xhc3M9ImZvb3Rub3Rl IiBpZD0iZm4xOTkyMjM1MTc2NDQyNWRiMzE4OTIzMSI+PHN1cD4xPC9zdXA+IFRhZ3Mgd2l0 aCBzcGFjZXMgd2lsbCBnZW5lcmF0ZSB1cmxzIHdpdGggZGFzaGVzLCB3aGljaCB3aWxsIHdv cmsgY29ycmVjdGx5LiAgVGFncyB3aXRoIGRhc2hlcyB3aWxsIGFsc28gd29yayBjb3JyZWN0 bHkuPC9wPgoJPGg0PlN0ZXAgNjogRmFuY3kgZGlzcGxheSBjdXN0b21pemF0aW9uPC9oND4K CTxwPllvdSBjYW4gdXNlIDxjb2RlPnRydV90YWdzX2lmX3RhZ19zZWFyY2g8L2NvZGU+LCA8 Y29kZT50cnVfdGFnc190YWdfcGFyYW1ldGVyPC9jb2RlPiwgYW5kIDxjb2RlPnRydV90YWdz X3NlYXJjaF9wYXJhbWV0ZXI8L2NvZGU+IHRvIGN1c3RvbWl6ZSB5b3VyIHBhZ2UgdGl0bGVz IG9yIHRhZyBzZWFyY2ggcmVzdWx0cy4gIFNlZSBiZWxvdyBmb3IgZGV0YWlscy4gIFNlZSB0 aGUgdGl0bGViYXIgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tLyI+dHJ1aXN0 LmNvbTwvYT4gZm9yIGFuIGV4YW1wbGUuPC9wPgoJPGg0PlN0ZXAgNzogVHVybiBvbiBjbGVh biB1cmxzPC9oND4KCTxwPkNsZWFuIHVybHMgYXJlIG5vdyBwb3NzaWJsZSB3aXRoIHRydV90 YWdzLCBwcm92aWRlZCB0aGF0IHlvdSBhcmUgd2lsbGluZyB0byBtb2RpZnkgVGV4dHBhdHRl cm4mIzgyMTc7cyByZXdyaXRlIHJ1bGVzIChpbiB0aGUgLmh0YWNjZXNzIGZpbGUpLiAgQnV0 IGJlIHdhcm5lZCAmIzgyMTE7IHJld3JpdGUgcnVsZXMgYXJlIGNvbXBsZXguICBJIG1ha2Ug bm8gZ3VhcmFudGVlcyB0aGF0IHRoaXMgd29uJiM4MjE3O3QgZWF0IHlvdXIgY2hpbGRyZW4u ICA8c3Ryb25nPllvdSBkb24mIzgyMTc7dCBoYXZlIHRvIGRvIHRoaXM8L3N0cm9uZz4gYnV0 IGEgbG90IG9mIHBlb3BsZSB3YW50IGl0LiAgVGhpcyBzaXRlIHVzZXMgaXQsIGlmIHRoYXQg aGVscHMuPC9wPgoJPHA+SGVyZSYjODIxNztzIHdoYXQgdG8gZG86PC9wPgoJPG9sPgoJCTxs aT5BZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBUZXh0cGF0dGVybiYjODIxNztzIC5odGFj Y2VzcyBmaWxlIChmb3VuZCBpbiB0aGUgcm9vdCBvZiB5b3VyIFRleHRwYXR0ZXJuIGRpcmVj dG9yeSksIGFkanVzdGluZyB0aGVtIGlmIG5lY2Vzc2FyeS4gIFRoZXNlIGxpbmVzIHNob3Vs ZCBiZSA8c3Ryb25nPmFmdGVyPC9zdHJvbmc+IHRoZTwvbGk+Cgk8L29sPgoJPHA+PGRpdiBj bGFzcz0icHJlIj48L3A+Cgk8cD5SZXdyaXRlUnVsZSAmIzk0OyguJiM0MzspICYjNDU7IFtQ VCxMXTwvcD4KCTxwPjwvZGl2PjwvcD4KCTxwPmFuZCA8c3Ryb25nPmJlZm9yZTwvc3Ryb25n PiB0aGU8L3A+Cgk8cD48ZGl2IGNsYXNzPSJwcmUiPjwvcD4KCTxwPlJld3JpdGVSdWxlICYj OTQ7KC4mIzQyOykgaW5kZXgucGhwPC9wPgoJPHA+PC9kaXY+PC9wPgoJPHA+SGVyZSYjODIx NztzIHRoZSBiaXQgdG8gaW5zZXJ0OjwvcD4KCTxwPjxkaXYgY2xhc3M9InByZSI+PC9wPgoJ PHA+I1RoaXMgcGF0aCBzaG91bGQgbWF0Y2ggdGhlIHJlbGF0aXZlIHVybCBvZiB5b3VyIFRl eHRwYXR0ZXJuIGluc3RhbGw8YnIgLz4KUmV3cml0ZUJhc2UgLzxiciAvPgojSWYgeW91J3Jl IHVzaW5nIGEgc2VjdGlvbiBvdGhlciB0aGFuICYjMzQ7dGFnJiMzNDssIGNoYW5nZSB0aGUg Zm9sbG93aW5nIHR3byBydWxlcyBhY2NvcmRpbmdseTxiciAvPgpSZXdyaXRlUnVsZSAmIzk0 O3RhZy8oWyYjOTQ7L10mIzQzOykkIHRhZy8kMS8gW1IsTF08YnIgLz4KUmV3cml0ZVJ1bGUg JiM5NDt0YWcvKC4mIzQzOykvJCAmIzYzO3MmIzYxO3RhZyZhbXA7dCYjNjE7JDE8L3A+Cgk8 cD48L2Rpdj48L3A+Cgk8b2w+CgkJPGxpPjxzdHJvbmc+Q2hlY2sgdG8gbWFrZSBzdXJlIHlv dXIgc2l0ZSBpcyBzdGlsbCB3b3JraW5nLjwvc3Ryb25nPjwvbGk+CgkJPGxpPkVkaXQgdGhl IHRydV90YWdzIHBsdWdpbiAoYWRtaW4gLT4gcGx1Z2lucywgY2xpY2sgJiM4MjE2O0VkaXQm IzgyMTc7KSBhbmQgY2hhbmdlIHRoZSA8Y29kZT50cnVfdGFnc191c2VfY2xlYW5fdXJscygp PC9jb2RlPiBmdW5jdGlvbiB0byByZXR1cm4gPGNvZGU+MTwvY29kZT4uICAoSXQmIzgyMTc7 cyB0aGUgZmlyc3QgZnVuY3Rpb24uKTwvbGk+CgkJPGxpPkNsZWFuIHVybHMgc2hvdWxkIGJl IHdvcmtpbmcgbm93LiAgVHJ5IGNsaWNraW5nIGEgdGFnIGxpbmsgdG8gc2VlIHdoYXQgdXJs IGl0IHJlZmVyZW5jZXMuPC9saT4KCQk8bGk+QnkgZGVmYXVsdCwgYXJ0aWNsZSB0YWdzIHdp bGwgc2V0IHRoZSA8Y29kZT5yZWw9InRhZyI8L2NvZGU+IGF0dHJpYnV0ZSwgYW5kIHRoZSB0 YWcgY2xvdWQgKG9yIGxpc3QpIHdvbiYjODIxNzt0LiAgVGhpcyBjYW4gYmUgY29udHJvbGxl ZCB3aXRoIHRoZSA8Y29kZT51c2VyZWx0YWc8L2NvZGU+IGF0dHJpYnV0ZTsgc2VlIGJlbG93 IGZvciBkZXRhaWxzLjwvbGk+Cgk8L29sPgoJPGgzPlRhZyByZWZlcmVuY2U8L2gzPgoJPGg0 Pjxjb2RlPnRydV90YWdzX2hhbmRsZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgaXMgdGhlIG1h aW4gZnVuY3Rpb24gdGhhdCBkcml2ZXMgdGFnIHNlYXJjaCBhbmQgc2hvd3MgdGhlIGdlbmVy aWMgdGFnIGNsb3VkLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBwYWdlIHRoYXQg aXMgdXNlZCBpbiB0aGUgJiM4MjE2O3RhZyYjODIxNzsgc2VjdGlvbi4gIEl0IGdlbmVyYWxs eSBjYWxscyA8Y29kZT5kb0FydGljbGVzKCk8L2NvZGU+IChpbiB0aGUgVGV4dHBhdHRlcm4g Y29kZSkgdG8gZGlzcGxheSB0YWcgc2VhcmNoIHJlc3VsdHMsIGJ1dCBpZiBubyB0YWcgd2Fz IHBhc3NlZCBpbiB0aGUgdXJsIGl0IHdpbGwgY2FsbCA8Y29kZT50cnVfdGFnc19jbG91ZDwv Y29kZT4gaW5zdGVhZC48L3A+Cgk8cD5UaGlzIHRhZyBhY2NlcHRzIG1vc3Qgb2YgdGhlIHN0 YW5kYXJkIDxjb2RlPnR4cDphcnRpY2xlPC9jb2RlPiBhdHRyaWJ1dGVzLCB3aGljaCB3aWxs IGJlIGFwcGxpZWQgZHVyaW5nIHRoZSB0YWcgc2VhcmNoLiAgTm90ZSB0aGF0IDxjb2RlPnRy dV90YWdzX2hhbmRsZXI8L2NvZGU+IDxzdHJvbmc+ZG9lcyBub3Q8L3N0cm9uZz4gc3VwcG9y dCB1c2luZyBtdWx0aXBsZSBzZWN0aW9ucyB3aXRoIHRoZSA8Y29kZT5zZWN0aW9uPC9jb2Rl PiBhdHRyaWJ1dGUsIHdoZW4gZG9pbmcgYSB0YWcgc2VhcmNoLiAgSWYgbXVsdGlwbGUgc2Vj dGlvbnMgYXJlIHBhc3NlZCwgbm9uZSBhcmUgdXNlZC48L3A+Cgk8cD48c3Ryb25nPk5vdGU6 PC9zdHJvbmc+IEluIFRleHRwYXR0ZXJuLCB0aGUgPGNvZGU+bGltaXQ8L2NvZGU+IGF0dHJp YnV0ZSBpcyBkZWZhdWx0ZWQgdG8gPGNvZGU+MTA8L2NvZGU+LCB0byBsaW1pdCB0aGUgb3V0 cHV0IHRvIDEwIGFydGljbGVzIHBlciBwYWdlLCBhbmQgdGhlIDxjb2RlPnR4cDpvbGRlcjwv Y29kZT4gYW5kIDxjb2RlPnR4cDpuZXdlcjwvY29kZT4gdGFncyBhcmUgdXNlZCB0byBwYWdp bmF0ZSB0aGUgZnVsbCBsaXN0LiAgVGhlIDxjb2RlPnR4cDpvbGRlcjwvY29kZT4gYW5kIDxj b2RlPnR4cDpuZXdlcjwvY29kZT4gdGFncyBkbyBub3Qgd29yayB3aXRoIHRydV90YWdzLCBi dXQgdGhlIDxjb2RlPmxpbWl0PC9jb2RlPiBpcyBzdGlsbCB1c2VkIGJ5IFRleHRwYXR0ZXJu IHdoZW4gaXQgb3V0cHV0cyB0aGUgYXJ0aWNsZXMuICBUaGVyZWZvcmUsIHRydV90YWdzIHVz ZXMgYSBkZWZhdWx0IGxpbWl0IG9mIDxjb2RlPjEwMDA8L2NvZGU+IHdoZW4gZG9pbmcgYW4g YXJ0aWNsZSBzZWFyY2guICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbGltaXQgYnkgc2V0dGlu ZyB0aGUgPGNvZGU+bGltaXQ8L2NvZGU+IGF0dHJpYnV0ZSBvbiA8Y29kZT50cnVfdGFnc19o YW5kbGVyPC9jb2RlPi48L3A+Cgk8cD5UaGlzIHRhZyB3aWxsIGFsc28gYWNjZXB0IGFsbCBv ZiB0aGUgYXR0cmlidXRlcyB1c2VkIGJ5IDxjb2RlPnRydV90YWdfY2xvdWQ8L2NvZGU+LiAg U2VlIGJlbG93IGZvciBkZXRhaWxzLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19pZl9oYXNf dGFnczwvY29kZT48L2g0PgoJPHA+VGhpcyBjb25kaXRpb25hbCB0YWcgY2FuIGJlIHVzZWQg aW4gYW4gYXJ0aWNsZSBmb3JtLCBhbmQgd2lsbCBldmFsdWF0ZSBpdHMgY29udGVudHMgKGUu Zy4gJiM4MjIwO3JldHVybiB0cnVlJiM4MjIxOykgaWYgdGhlIGN1cnJlbnQgYXJ0aWNsZSBo YXMgdGFncy48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlPC9jb2RlPjwv aDQ+Cgk8cD5UaGlzIHRhZyBjYW4gYmUgdXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0gdG8gcmV0 dXJuIGEgbGlzdCBvZiB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBhcnRpY2xl LiAgVHlwaWNhbGx5IChzZWUgYmVsb3cpLCBlYWNoIHRhZyBpbiB0aGUgbGlzdCB3aWxsIGJl IGEgbGluayAoPGNvZGU+Jmx0O2EgaHJlZj0uLi4mZ3Q7PC9jb2RlPikgdG8gdGhlIHRhZyBz ZWFyY2ggdXJsIGZvciB0aGF0IHBhcnRpY3VsYXIgdGFnLjwvcD4KCTxwPlRoaXMgdGFnIGFj Y2VwdHMgdGhlIHN0YW5kYXJkIDxjb2RlPndyYXB0YWc8L2NvZGU+LCA8Y29kZT5icmVhazwv Y29kZT4sIDxjb2RlPmNsYXNzPC9jb2RlPiwgYW5kIDxjb2RlPmJyZWFrY2xhc3M8L2NvZGU+ IGF0dHJpYnV0ZXMuPC9wPgoJPHA+SWYgeW91IGRvbiYjODIxNzt0IHdhbnQgdG8gaGF2ZSB0 aGUgdGFncyBiZSBsaW5rcywgeW91IGNhbiBzZXQgPGNvZGU+Z2VuZXJhdGVsaW5rcz0iMCI8 L2NvZGU+IHRvIHR1cm4gdGhlIGxpbmtzIG9mZi48L3A+Cgk8cD5JdCBhbHNvIGFjY2VwdHMg YSA8Y29kZT50YWdzZWN0aW9uPC9jb2RlPiBhdHRyaWJ1dGUsIHdoaWNoIHRlbGxzIHRydV90 YWdzIHdoYXQgcmVsYXRpdmUgdXJsIHRvIHVzZSB0byBmaW5kIHRoZSAmIzgyMTY7dGFnJiM4 MjE3OyBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIG5hbWVkIHRo ZSBzZWN0aW9uIHNvbWV0aGluZyBvdGhlciB0aGFuICYjODIxNjt0YWcmIzgyMTc7LiAgQnkg ZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gPGNvZGU+dGFnPC9jb2RlPi48L3A+Cgk8cD5JZiB5 b3UgaGF2ZSBjbGVhbiB1cmxzIHR1cm5lZCBvbiAoc2VlIGFib3ZlKSwgeW91IGNhbiB1c2Ug dGhlIDxjb2RlPnVzZXJlbHRhZ3M8L2NvZGU+IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHdoZXRo ZXIgbGlua3MgaW4gdGhlIGxpc3Qgc2hvdWxkIGhhdmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9t aWNyb2Zvcm1hdHMub3JnL3dpa2kvcmVsdGFnIj48Y29kZT5yZWw9InRhZyI8L2NvZGU+PC9h PiAgKHVzZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy50ZWNobm9yYXRpLmNvbS8iPlRlY2hu b3JhdGk8L2E+KSBhdHRyaWJ1dGUgc2V0LiAgTm90ZSB0aGF0IHRoaXMgd29uJiM4MjE3O3Qg d29yayBpZiB5b3UgdHVybiBvZmYgbGlua3MuICBBbHNvIG5vdGUgdGhhdCB0YWdzIGRvbiYj ODIxNzt0IHNob3cgdXAgaW4gdGhlIFJTUy9BdG9tIGZlZWRzLCB1bmxlc3MgeW91IDxhIGhy ZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9NDA5 MDcjcDQwOTA3Ij5oYWNrIHRoZSB0ZXh0cGF0dGVybiBzb3VyY2U8L2E+LiAgVGhpcyBpcyBv biBieSBkZWZhdWx0LjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT48L2g0 PgoJPGg0Pjxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+PC9oND4KCTxwPlRoZXNlIHR3byB0 YWdzIGRvIHRoZSBleGFjdCBzYW1lIHRoaW5nICYjODIxMTsgPGNvZGU+dHJ1X3RhZ3NfY2xv dWQ8L2NvZGU+IGp1c3QgcHJvdmlkZXMgZGlmZmVyZW50IGRlZmF1bHRzIHRvIDxjb2RlPnRy dV90YWdzX2xpc3Q8L2NvZGU+LjwvcD4KPHA+PGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+ IGNhbiBiZSB1c2VkIG9uIGFueSBwYWdlLCBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gZ2Vu ZXJhdGUgYSBzaW1wbGUgdGFnIGNsb3VkIG9mIGFsbCB0aGUgdGFncyB1c2VkIG9uIHlvdXIg c2l0ZS4gIFRoZSBjbG91ZCBpcyByZWFsbHkganVzdCBhIGxpc3Qgb2YgbGlua3MsIG11Y2gg bGlrZSB0aGF0IGdlbmVyYXRlZCBieSA8Y29kZT50cnVfdGFnc19mcm9tX2FydGljbGU8L2Nv ZGU+LCBidXQgd2l0aCBhIDxjb2RlPnN0eWxlPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IG9uIGVh Y2ggbGluayB0byBnaXZlIGl0IGEgZm9udCBzaXplIHJhbmdpbmcgZnJvbSAxMDAlIHRvIDIw MCUuPC9wPgo8cD48Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPiBjYW4gYmUgdXNlZCBvbiBh bnkgcGFnZSwgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvIG91dHB1dCBhIGJ1bGxldGVkIGxp c3Qgb2YgYWxsIHRoZSB0YWdzIHVzZWQgb24geW91ciBzaXRlLiAgQnkgZGVmYXVsdCwgdGhl IHRhZ3Mgd2lsbCBhbGwgaGF2ZSBhIGZvbnQtc2l6ZSBvZiAxMDAlLjwvcD4KPHA+PGNvZGU+ dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+IGFuZCA8Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPiBi b3RoIHNldCB0aGUgPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiBlYWNoIHRhZywg c3BlY2lmeWluZyB0d28gY2xhc3Nlcy4gIFRoZSBmaXJzdCBjbGFzcyBncm91cHMgdGhlIHRh Z3MgaW50byBjYXRlZ29yaWVzLCB3aXRoIGNsYXNzZXMgb2YgPGNvZGU+dGFnU2l6ZVNtYWxs ZXN0PC9jb2RlPiwgPGNvZGU+dGFnU2l6ZU1lZGl1bTwvY29kZT4sIGFuZCA8Y29kZT50YWdT aXplTGFyZ2VzdDwvY29kZT4uICBVc2luZyB0aGVzZSwgeW91IGNvdWxkIG1ha2UgdGhlIHNt YWxsZXN0IGFuZCBsYXJnZXN0IHRhZ3MgaGF2ZSBkaWZmZXJlbnQgc3R5bGVzIHRoYW4gYWxs IHRoZSBvdGhlcnMuPC9wPgoJPHA+VGhlIHNlY29uZCBjbGFzcyBpbmRpY2F0ZXMgdGhlICYj ODIyMDtzdGVwJiM4MjIxOyBvZiB0aGUgY3VycmVudCB0YWcsIHdpdGggY2xhc3NlcyBvZiA8 Y29kZT50YWdTaXplMTwvY29kZT4sIDxjb2RlPnRhZ1NpemUyPC9jb2RlPiwgYW5kIHNvIG9u LiAgVGhlc2UgZ2l2ZSB5b3UgcHJlY2lzZSBjb250cm9sIG92ZXIgZWFjaCB0YWcgc2l6ZSwg aWYgeW91IHdhbnQgaXQuPC9wPgoJPHA+SWYgeW91IHVzZSB0aGVzZSBjbGFzc2VzIHRvIGNy ZWF0ZSBzcGVjaWFsIENTUyBydWxlcywgeW91IG1heSBhbHNvIHdhbnQgdG8gc2V0IHRoZSA8 Y29kZT5zZXRzaXplczwvY29kZT4gYXR0cmlidXRlLCBkZXNjcmliZWQgYmVsb3cuPC9wPgoJ PGg1PkJvdGggdGFncyBhY2NlcHQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvaDU+Cgk8 dWw+CgkJPGxpPlRoZSBzdGFuZGFyZCA8Y29kZT53cmFwdGFnPC9jb2RlPiwgPGNvZGU+YnJl YWs8L2NvZGU+LCA8Y29kZT5jbGFzczwvY29kZT4sIGFuZCA8Y29kZT5icmVha2NsYXNzPC9j b2RlPiBhdHRyaWJ1dGVzLiAgPGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+IGhhcyBhIGRl ZmF1bHQgPGNvZGU+YnJlYWs8L2NvZGU+IG9mIGEgY29tbWEuICA8Y29kZT50cnVfdGFnc19s aXN0PC9jb2RlPiBoYXMgYSBkZWZhdWx0IDxjb2RlPndyYXB0YWc8L2NvZGU+IG9mIDxjb2Rl PnVsPC9jb2RlPiBhbmQgYSBkZWZhdWx0IDxjb2RlPmJyZWFrPC9jb2RlPiBvZiA8Y29kZT5s aTwvY29kZT4uPC9saT4KCQk8bGk+PGNvZGU+dGFnc2VjdGlvbjwvY29kZT4sIHdoaWNoIHRl bGxzIHRydV90YWdzIHdoYXQgcmVsYXRpdmUgdXJsIHRvIHVzZSB0byBmaW5kIHRoZSAmIzgy MTY7dGFnJiM4MjE3OyBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZl IG5hbWVkIHRoZSBzZWN0aW9uIHNvbWV0aGluZyBvdGhlciB0aGFuICYjODIxNjt0YWcmIzgy MTc7LiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gPGNvZGU+dGFnPC9jb2RlPi48L2xp PgoJCTxsaT48Y29kZT5zZWN0aW9uPC9jb2RlPiwgd2hpY2ggdGVsbHMgaXQgdG8gbGltaXQg dGhlIGxpc3QgdG8gdGFncyBmcm9tIHRoZSBnaXZlbiBzZWN0aW9uIG9yIHNlY3Rpb25zLiAg Rm9yIGV4YW1wbGUsIDxjb2RlPiZsdDt0eHA6dHJ1X3RhZ3NfY2xvdWQgc2VjdGlvbj0iYmxv ZyxyZWZlcmVuY2UiIC8mZ3Q7PC9jb2RlPiB3b3VsZCBvbmx5IHNob3cgdGFncyBmcm9tIHRo ZSAmIzgyMjA7YmxvZyYjODIyMTsgYW5kICYjODIyMDtyZWZlcmVuY2UmIzgyMjE7IHNlY3Rp b25zLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBzZXQgdG8gYmxhbmsgKHRvIHNob3cgdGFncyBm cm9tIGFsbCBzZWN0aW9ucykuCgk8dWw+CgkJPGxpPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4g aWYgeW91IHVzZSA8Y29kZT5zZWN0aW9uPC9jb2RlPiB0byBsaW1pdCB0aGUgY2xvdWQgdG8g YSBwYXJ0aWN1bGFyIHNlY3Rpb24sIGl0IHdvbiYjODIxNzt0IGxpbWl0IHRoZSB0YWcgc2Vh cmNoIGZlYXR1cmUgdG8gdGhhdCBzZWN0aW9uLiAgVGhlIHRhZyBzZWFyY2ggZmluZHMgKHRh Z2dlZCkgYXJ0aWNsZXMgZnJvbSBhbGwgc2VjdGlvbnMsIG5vIG1hdHRlciB3aGF0LiAgVGhh dCYjODIxNztzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIHVzZSBvZiA8Y29kZT5kb0FydGljbGVz KCk8L2NvZGU+LCBhbmQgSSBkb24mIzgyMTc7dCB0aGluayB0aGVyZSYjODIxNztzIGFueXRo aW5nIEkgY2FuIGRvIGFib3V0IGl0LjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPjxjb2RlPm1p bnBlcmNlbnQ8L2NvZGU+IGFuZCA8Y29kZT5tYXhwZXJjZW50PC9jb2RlPiwgd2hpY2ggY2Fu IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgd2VpZ2h0ZWQgZm9udCBzaXplcyBpbiB0aGUgdGFn IGNsb3VkL2xpc3QuICA8Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT4gZGVmYXVsdHMgdG8g PGNvZGU+MTAwPC9jb2RlPiBhbmQgPGNvZGU+MjAwPC9jb2RlPiwgcmVzcGVjdGl2ZWx5LCBh bmQgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4gZGVmYXVsdHMgdG8gPGNvZGU+MTAwPC9j b2RlPiBhbmQgPGNvZGU+MTAwPC9jb2RlPi48L2xpPgoJCTxsaT48Y29kZT5zaG93Y291bnRz PC9jb2RlPiwgd2hpY2ggd2lsbCBhcHBlbmQgYSBudW1iZXIgaW5kaWNhdGluZyB0aGUgbnVt YmVyIG9mIHRpbWVzIGEgdGFnIGhhcyBiZWVuIHVzZWQsIHRvIGVhY2ggdGFnIGluIHRoZSBs aXN0LiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBzZWU6IDxzcGFuIGNsYXNzPSJwcmUiPjxh IGhyZWY9Ii8/cz10YWcmIzM4O3Q9bGlmZSI+bGlmZTwvYT4gWzNdLCA8YSBocmVmPSIvP3M9 dGFnJiMzODt0PXRlY2giPnRlY2g8L2E+IFs1XTwvc3Bhbj4gaW4gbXkgdGFnIGNsb3VkLCBp ZiB0aGlzIHdhcyB0dXJuZWQgb24uICBUaGlzIGlzIG9mZiBieSBkZWZhdWx0LiAgVXNlIDxj b2RlPjE8L2NvZGU+IG9yIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gaXQgb24uCgk8dWw+ CgkJPGxpPlRoaXMgY2FuIGFsc28gYmUgdXNlZCB0byBwdXQgdGhlIGNvdW50cyBpbiB0aGUg PGNvZGU+dGl0bGU8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgbGlua3MsIHdoaWNoIHdpbGwg bWFrZSBpdCBhcHBlYXIgaW4gYSB0b29sdGlwLiAgVXNlIDxjb2RlPnNob3djb3VudHM9InRp dGxlIjwvY29kZT4gb3IgPGNvZGU+c2hvd2NvdW50cz0iYm90aCI8L2NvZGU+ICh0byBzaG93 IGl0IGluIGJvdGggcGxhY2VzKSB0byB0dXJuIGl0IG9uLjwvbGk+Cgk8L3VsPjwvbGk+CgkJ PGxpPjxjb2RlPmNvdW50d3JhcGNoYXJzPC9jb2RlPiwgd2hpY2ggY29udHJvbHMgdGhlIGNo YXJhY3RlcnMgdXNlZCB0byBzaG93IHRoZSB0YWcgY291bnQsIGlmIDxjb2RlPnNob3djb3Vu dHM8L2NvZGU+IGlzIHR1cm5lZCBvbi4gIEJ5IGRlZmF1bHQgdGhpcyBpcyA8Y29kZT5bXTwv Y29kZT4uICBUaGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgYmUgcHV0IG9uIHRoZSBsZWZ0IHNp ZGUgb2YgdGhlIG51bWJlciwgYW5kIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHdpbGwgYmUgcHV0 IG9uIHRoZSByaWdodC4gIEZvciBleGFtcGxlLCBhIDxjb2RlPmNvdW50d3JhcGNoYXJzPC9j b2RlPiBvZiA8Y29kZT4oKTwvY29kZT4gd291bGQgc2hvdzogPHNwYW4gY2xhc3M9InByZSI+ PGEgaHJlZj0iLz9zPXRhZyYjMzg7dD1saWZlIj5saWZlPC9hPiAoMyksIDxhIGhyZWY9Ii8/ cz10YWcmIzM4O3Q9dGVjaCI+dGVjaDwvYT4gKDUpPC9zcGFuPjwvbGk+CgkJPGxpPklmIHlv dSBoYXZlIGNsZWFuIHVybHMgdHVybmVkIG9uIChzZWUgYWJvdmUpLCB5b3UgY2FuIHVzZSB0 aGUgPGNvZGU+dXNlcmVsdGFnczwvY29kZT4gYXR0cmlidXRlIHRvIHNwZWNpZnkgd2hldGhl ciBsaW5rcyBpbiB0aGUgbGlzdCBzaG91bGQgaGF2ZSB0aGUgPGEgaHJlZj0iaHR0cDovL21p Y3JvZm9ybWF0cy5vcmcvd2lraS9yZWx0YWciPjxjb2RlPnJlbD0idGFnIjwvY29kZT48L2E+ ICAodXNlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRlY2hub3JhdGkuY29tLyI+VGVjaG5v cmF0aTwvYT4pIGF0dHJpYnV0ZSBzZXQuICBUaGlzIGlzIG9mZiBieSBkZWZhdWx0LjwvbGk+ CgkJPGxpPklmIHlvdSBkb24mIzgyMTc7dCB3YW50IHRoZSB0YWdzIHRvIGJlIGxpbmtzLCB5 b3UgY2FuIHNldCA8Y29kZT5nZW5lcmF0ZWxpbmtzPSIwIjwvY29kZT4gdG8gdHVybiB0aGVt IG9mZi48L2xpPgoJCTxsaT48Y29kZT5taW50YWdjb3VudDwvY29kZT4gYW5kIDxjb2RlPm1h eHRhZ2NvdW50PC9jb2RlPiBjYW4gYmUgdXNlZCB0byBoaWRlIHRhZ3MgdGhhdCBvbmx5IGhh dmUgYSBmZXcgYXJ0aWNsZXMsIG9yIHRoYXQgaGF2ZSB0b28gbWFueS4gIFRoZXkgYXJlIGRl ZmF1bHRlZCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+MTAwMDwvY29kZT4sIHJlc3Bl Y3RpdmVseS4gIEZvciBleGFtcGxlLCA8Y29kZT5taW50YWdjb3VudD0iMiI8L2NvZGU+IHdv dWxkIGhpZGUgYW55IHRhZ3MgdGhhdCB3ZXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIGEgc2lu Z2xlIGFydGljbGUuICBJZiB5b3UgZG8gdGhpcywgeW91IG1heSB3YW50IHRvIGFkZCBhIGxp bmsgdG8gdGhlIGRlZmF1bHQgdGFnIGNsb3VkLCB1c3VhbGx5IGZvdW5kIGF0IDxjb2RlPi90 YWcvPC9jb2RlPi48L2xpPgoJCTxsaT5JZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBzaXpl KHMpIG9mIHRoZSB0YWdzIHlvdXJzZWxmICh0aHJvdWdoIENTUyksIHNldCA8Y29kZT5zZXRz aXplcz0iMCI8L2NvZGU+IHRvIHR1cm4gb2ZmIHRoZSA8Y29kZT5zdHlsZT0iZm9udC1zaXpl OiBYWFglIjwvY29kZT4gYXR0cmlidXRlIGdlbmVyYXRpb24uICBUaGF0IHdpbGwgbGVhdmUg YmVoaW5kIHRoZSBkZWZhdWx0IENTUyBjbGFzc2VzLCB3aGljaCB5b3UgY2FuIHVzZSB0byBj b250cm9sIHRoZSBkaXNwbGF5IG9mIHlvdXIgY2xvdWQuPC9saT4KCTwvdWw+Cgk8cD5Ob3Rl IHRoYXQgeW91IGNhbiB1c2UgdGhlIGF0dHJpYnV0ZXMgdG8gbWFrZSBlYWNoIHRhZyBkbyB0 aGUgc2FtZSB0aGluZy4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBpcyBqdXN0IGEg Y29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgYSB0YWcgY2xvdWQgdXNpbmcg PGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4uICBUaGVyZWZvcmUsIGl0JiM4MjE3O3MgcG9z c2libGUgdG8gaGF2ZSBhIHRhZyBjbG91ZCB3aXRoIHRhZyBjb3VudHMgc2hvd2luZywgb3Ig aGF2ZSBhIGJ1bGxldGVkIGxpc3Qgd2l0aCB2YXJpYWJsZSBmb250IHNpemVzLCBldGMuPC9w PgoJPGg0Pjxjb2RlPnRydV90YWdzX2lmX3RhZ19zZWFyY2g8L2NvZGU+PC9oND4KCTxwPlRo aXMgY29uZGl0aW9uYWwgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3aWxsIGV2YWx1 YXRlIGl0cyBjb250ZW50cyAoZS5nLiAmIzgyMjA7cmV0dXJuIHRydWUmIzgyMjE7KSBpZiB0 aGUgY3VycmVudCB1cmwgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSB0YWcgc2VhcmNoIGdv aW5nIG9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGlu ZyBsaWtlIGN1c3RvbWl6ZSB0aGUgdGl0bGViYXIgd2hlbiB1c2luZyB0aGUgdGFnIHNlYXJj aC48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcjwvY29kZT48L2g0PgoJ PHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW5kIHdpbGwgcmV0dXJuIHRoZSBu YW1lIG9mIHRoZSBjdXJyZW50IHRhZyB1bmRlciBzZWFyY2gsIGR1cmluZyBhIHRhZyBzZWFy Y2guICBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHdpdGggPGNvZGU+dHJ1X3RhZ3NfaWZfdGFn X3NlYXJjaDwvY29kZT4uPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX3NlYXJjaF9wYXJhbWV0 ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3 aWxsIHJldHVybiB0aGUgdGV4dCB0aGUgdXNlciB0eXBlZCBpbnRvIHRoZSBzdGFuZGFyZCBz ZWFyY2ggYm94LCBkdXJpbmcgYSByZWd1bGFyIHNlYXJjaC4gIFRoaXMgdGFnIGlzIG5vdCBz cGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0YWdnaW5nLCBidXQgY2FuIGJlIGhhbmR5IGZvciBj dXN0b21pemluZyB0aGUgdGl0bGViYXIgb24gc2VhcmNoIHJlc3VsdCBwYWdlcy48L3A+CgoK ICI7czo0OiJjb2RlIjtzOjY0MDk6IgoKCiNDb3B5cmlnaHQgMjAwNiBOYXRoYW4gQXJ0aHVy CiNSZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3 dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMK I1RoaXMgd29yayBpcyBiYXNlZCBvbiByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2lu YWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRl eHRwYXR0ZXJuCgoKI1NlZSBodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5Ny90 cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyBmb3IgaW5zdHJ1Y3Rpb25zCmZ1bmN0aW9uIHRy dV90YWdzX3VzZV9jbGVhbl91cmxzKCkKewoJcmV0dXJuIDA7ICNETyBOT1QgRU5BQkxFIFRI SVMgdW5sZXNzIHlvdSd2ZSByZWFkIHRoZSBpbnN0cnVjdGlvbnMKfQoKCmZ1bmN0aW9uIHRy dV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCWV4dHJhY3QoJF9HRVQpOwoJaWYgKGlzc2V0KCR0 KSkgewoJCSRrZXl3b3JkcyA9IGV4cGxvZGUoJywnLCBzdHJpcF90YWdzKCR0KSk7CgkJZm9y ZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJCWlmIChzdHJwb3MoJGtleXdvcmQs ICctJykgIT09IGZhbHNlKQoJCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcg JywgJGtleXdvcmQpOwoJCX0KCQlwcmludCAkYXR0c1sna2V5d29yZHMnXTsKCQkkYXR0c1sn a2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMpOwoJCWlmICgkYXR0c1snc2Vj dGlvbiddICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkKCQkJ JGF0dHNbJ3NlY3Rpb24nXSA9ICcnOwoJCWlmICghJGF0dHNbJ2xpbWl0J10pCgkJCSRhdHRz WydsaW1pdCddID0gJzEwMDAnOwoKCQlyZXR1cm4gZG9BcnRpY2xlcygkYXR0cywgdHJ1ZSk7 Cgl9IGVsc2UgewoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7Cgl9Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7CglnbG9iYWwgJHRo aXNhcnRpY2xlOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzX2ZpZWxkID0gdHJ1 X3RhZ3NfZmllbGQoKTsKCgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0 ZXJuIiwgIklEPSckdGhpc2lkJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsKCXJldHVybiBw YXJzZShFdmFsRWxzZSgkdGhpbmcsICRycykpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZnJv bV9hcnRpY2xlKCRhdHRzKSB7CgoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHNpdGV1cmwsICRw YXRoX2Zyb21fcm9vdDsKCglleHRyYWN0KCRfU0VSVkVSKTsKCWV4dHJhY3QoJHRoaXNhcnRp Y2xlKTsKCglleHRyYWN0KGxBdHRzKGFycmF5KCd3cmFwdGFnJyAgICAgICA9PiAnJywKCQkJ CQkJJ2JyZWFrJyAgICAgICAgID0+ICcsICcsCgkJCQkJCSdjbGFzcycgICAgICAgICA9PiAn JywKCQkJCQkJJ2JyZWFrY2xhc3MnCT0+ICcnLAoJCQkJCQkndGFnc2VjdGlvbicJPT4gJ3Rh ZycsCgkJCQkJCSd1c2VyZWx0YWcnCT0+ICcxJywKCQkJCQkJJ2dlbmVyYXRlbGlua3MnCT0+ ICcxJwoJCQkJCQkpLCRhdHRzKSk7CgoJJHRhZ3NfZmllbGQgPSB0cnVfdGFnc19maWVsZCgp OwoKCSRycyA9IHNhZmVfcm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0 aGlzaWQnIEFORCAkdGFnc19maWVsZCA8PiAnJyIpOwoJJGFsbF90YWdzID0gZXhwbG9kZSgi LCIsIHRyaW0oc3RydG9sb3dlcigkcnNbJHRhZ3NfZmllbGRdKSkpOwoJc29ydCgkYWxsX3Rh Z3MpOwoJJGFsbF90YWdzID0gYXJyYXlfdW5pcXVlKCRhbGxfdGFncyk7CgoJaWYgKCRnZW5l cmF0ZWxpbmtzKSB7CgkJaWYgKHRydV90YWdzX3VzZV9jbGVhbl91cmxzKCkpIHsKCQkJJHVy bHByZWZpeCA9ICdodHRwOi8vJyAuICRzaXRldXJsIC4gJHBhdGhfZnJvbV9yb290IC4gJHRh Z3NlY3Rpb24gLiAnLyc7CgkJCSR1cmxzdWZmaXggPSAkdXNlcmVsdGFnID8gJy8iIHJlbD0i dGFnJzogJy8nOwoJCX0gZWxzZSB7CgkJCSR1cmxwcmVmaXggPSAnaHR0cDovLycgLiAkc2l0 ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICc/cz0nIC4gJHRhZ3NlY3Rpb24gLiAnJmFtcDt0 PSc7CgkJCSR1cmxzdWZmaXggPSAnJzsKCQl9CgoJCWZvcigkaT0wOyAkaTxjb3VudCgkYWxs X3RhZ3MpOyAkaSsrKSB7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPSInIC4gJHVybHBy ZWZpeCAuIHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkYWxsX3RhZ3NbJGldKSAuICR1cmxzdWZm aXggLiAnIj4nIC4gJGFsbF90YWdzWyRpXSAuJzwvYT4nOwoJCX0KCX0gZWxzZSB7CgkJJHRh Z3NfaHRtbCA9ICRhbGxfdGFnczsKCX0KCglyZXR1cm4gZG9XcmFwKCR0YWdzX2h0bWwsICR3 cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCSRhdHRzID0gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ ICcnLAoJCQkJJ2JyZWFrJwk9PiAnLCAnLAoJCQkJJ2NsYXNzJwk9PiAnJywKCQkJCSdicmVh a2NsYXNzJwk9PiAnJywKCQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCSdzZWN0aW9u Jwk9PiAnJywKCQkJCSdtaW5wZXJjZW50Jwk9PiAnMTAwJywKCQkJCSdtYXhwZXJjZW50Jwk9 PiAnMjAwJywKCQkJCSdzaG93Y291bnRzJwk9PiAnJywKCQkJCSdjb3VudHdyYXBjaGFycycJ PT4gJ1tdJywKCQkJCSd1c2VyZWx0YWcnCT0+ICcnLAoJCQkJJ2dlbmVyYXRlbGlua3MnCT0+ ICcxJywKCQkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQkJJ21heHRhZ2NvdW50Jwk9PiAn MTAwMCcsCgkJCQknc2V0c2l6ZXMnCT0+ICcxJwoJCQkpLCRhdHRzKTsKCglyZXR1cm4gdHJ1 X3RhZ3NfbGlzdCgkYXR0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19saXN0KCRhdHRzKSB7 CglnbG9iYWwgJHNpdGV1cmwsICRwYXRoX2Zyb21fcm9vdDsKCWV4dHJhY3QoJF9TRVJWRVIp OwoKCSRhdHRzID0gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICd1bCcsCgkJCQknYnJlYWsn CT0+ICdsaScsCgkJCQknY2xhc3MnCT0+ICcnLAoJCQkJJ2JyZWFrY2xhc3MnCT0+ICcnLAoJ CQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQkJJ21p bnBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ21heHBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ3No b3djb3VudHMnCT0+ICcnLAoJCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkJJ3Vz ZXJlbHRhZycJPT4gJycsCgkJCQknZ2VuZXJhdGVsaW5rcycJPT4gJzEnLAoJCQkJJ21pbnRh Z2NvdW50Jwk9PiAnMCcsCgkJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywKCQkJCSdzZXRz aXplcycJPT4gJzEnCgkJCSksJGF0dHMpOwoJZXh0cmFjdCgkYXR0cyk7CgoJJHRhZ3NfZmll bGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRzZWN0aW9uX2NsYXVzZSA9ICcnOwoJaWYgKCRz ZWN0aW9uIDw+ICcnKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsICRzZWN0aW9uKTsKCQlmb3Jl YWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIg LiB0cmltKCRrZXkpIC4gIiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAu IGpvaW4oJyBvciAnLCAka2V5cGFydHMpIC4gIikiOwoJfQoKCWluY2x1ZGVfb25jZSB0eHBh dGguJy9wdWJsaXNoL3NlYXJjaC5waHAnOwoJJGZpbHRlciA9IGZpbHRlclNlYXJjaCgpOwoJ JGFsbF90YWdzID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAi dGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4g JGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglm b3JlYWNoICgkcnMgYXMgJHJvdykgewoJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxf dGFncywgZXhwbG9kZSgiLCIsIHRyaW0oc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkp KSk7Cgl9Cglzb3J0KCRhbGxfdGFncyk7CgoJJHRhZ3Nfd2VpZ2h0ID0gYXJyYXlfY291bnRf dmFsdWVzKCRhbGxfdGFncyk7CgkkdGFnc191bmlxdWUgPSBhcnJheV91bmlxdWUoJGFsbF90 YWdzKTsKCglmb3JlYWNoICgkdGFnc191bmlxdWUgYXMgJGtleSA9PiAkdGFnKSB7CgkJaWYg KCR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudCB8fCAkdGFnc193ZWlnaHRbJHRh Z10gPiAkbWF4dGFnY291bnQpIHsKCQkJdW5zZXQoJHRhZ3NfdW5pcXVlWyRrZXldKTsKCQkJ dW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQl9Cgl9CgoJJG1heCA9IG1heCgkdGFnc193 ZWlnaHQpOwoJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOwoJJHN0ZXB2YWx1ZSA9ICgkbWF4 ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0g JG1pbik7CgoJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7CgkJaWYgKHRydV90YWdzX3VzZV9jbGVh bl91cmxzKCkpIHsKCQkJJHVybHByZWZpeCA9ICdodHRwOi8vJyAuICRzaXRldXJsIC4gJHBh dGhfZnJvbV9yb290IC4gJHRhZ3NlY3Rpb24gLiAnLyc7CgkJCSR1cmxzdWZmaXggPSAkdXNl cmVsdGFnID8gJy8iIHJlbD0idGFnJzogJy8nOwoJCX0gZWxzZSB7CgkJCSR1cmxwcmVmaXgg PSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICc/cz0nIC4gJHRh Z3NlY3Rpb24gLiAnJmFtcDt0PSc7CgkJCSR1cmxzdWZmaXggPSAnJzsKCQl9Cgl9CgoJZm9y ZWFjaCAoJHRhZ3NfdW5pcXVlIGFzICR0YWcpIHsKCQkkdGFnX3dlaWdodCA9IGZsb29yKCRt aW5wZXJjZW50ICsgKCR0YWdzX3dlaWdodFskdGFnXSAtICRtaW4pICogJHN0ZXB2YWx1ZSk7 CgoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTogJyAu ICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCSR0YWdfY2xhc3MgPSAnIGNsYXNzPSInOwoJCWlm ICgkdGFnc193ZWlnaHRbJHRhZ10gPT0gJG1pbikKCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6 ZVNtYWxsZXN0IjsKCQllbHNlIGlmICgkdGFnc193ZWlnaHRbJHRhZ10gPT0gJG1heCkKCQkJ JHRhZ19jbGFzcyAuPSAidGFnU2l6ZUxhcmdlc3QiOwoJCWVsc2UKCQkJJHRhZ19jbGFzcyAu PSAidGFnU2l6ZU1lZGl1bSI7CgkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR0YWdz X3dlaWdodFskdGFnXSArIDEgLSAkbWluKTsKCQkkdGFnX2NsYXNzIC49ICciJzsKCgkJLy9h ZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBh dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1CgkJJGNvdW50ID0g JGNvdW50d3JhcGNoYXJzezB9IC4gJHRhZ3Nfd2VpZ2h0WyR0YWddIC4gJGNvdW50d3JhcGNo YXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRzID09 ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJGNvdW50IC4gJyInOwoJ CWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQoJCQkkZGlzcGxh eWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQkJJHdo b2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFn KSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiAk dGFnIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1s W10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4n IC4gJHRhZyAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7CgkJfQoJfQoKCXJldHVybiBk b1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFz cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcp CnsKCSR0YWdfc2VhcmNoaW5nID0gZ3BzKCd0Jyk7CgkkY29uZGl0aW9uID0gKCFlbXB0eSgk dGFnX3NlYXJjaGluZykpPyB0cnVlIDogZmFsc2U7CglyZXR1cm4gcGFyc2UoRXZhbEVsc2Uo JHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1l dGVyKCkKewoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCd0JykpOwp9CgoKZnVuY3Rpb24gdHJ1 X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdwcygncScp KTsKfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmllbGQoKSB7CglyZXR1cm4gJ0tleXdvcmRzJzsK fQoKCgoiO3M6MzoibWQ1IjtzOjMyOiIyZTA5MmUzNGY4YjJlZWQ0ZmQ1MTQ5NDkwYTUyN2Ex NSI7fQ==