# Name: smd_fuzzy_find v0.12 # Type: Client side plugin # Offers alternative spellings and/or close-matching articles from search terms. # Author: Stef Dawson # URL: http://stefdawson.com # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InNtZF9mdXp6eV9maW5kIjtzOjY6ImF1dGhvciI7czox MToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjE6Imh0dHA6Ly9zdGVmZGF3 c29uLmNvbSI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMTIiO3M6MTE6ImRlc2NyaXB0aW9uIjtz Ojc4OiJPZmZlcnMgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzIGFuZC9vciBjbG9zZS1tYXRjaGlu ZyBhcnRpY2xlcyBmcm9tIHNlYXJjaCB0ZXJtcy4iO3M6NDoiY29kZSI7czoyMzM5MzoiZnVu Y3Rpb24gc21kX2Z1enp5X2ZpbmQoJGF0dHMsICR0aGluZz0nJykgew0KCXJlcXVpcmVfcGx1 Z2luKCdzbWRfbGliJyk7DQoNCgkvLyBNTFAgc3VwcG9ydA0KCWdsb2JhbCAkcHJldGV4dCwg JHNtZF9mdXp6TGFuZzsNCgkkc21kX2Z1enpfc3RyID0gYXJyYXkoDQoJCSd0b29fc2hvcnQn ID0+ICdUaGUgdGV4dCB5b3UgYXJlIHNlYXJjaGluZyBmb3IgaXMgcHJvYmFibHkgdG9vIHNo b3J0LiBUcnkgYSBsb25nZXIgd29yZC4gJywNCgkJJ25vX21hdGNoJyA9PiAnU29ycnksIG5v IHJlc3VsdHMgbWF0Y2hlZCAie3NlYXJjaF90ZXJtfSIgZXhhY3RseS4gJywNCgkJJ3N1Z2dl c3QnID0+ICdIZXJlIGFyZSB0aGUgY2xvc2VzdCBtYXRjaGluZyB7dGhpbmdpZXN9IHRoYXQg bWF5IGhlbHAgeW91IGZpbmQgd2hhdCB5b3UgYXJlIGxvb2tpbmcgZm9yOiAnLA0KCQknc3Vn Z2VzdF9qb2luJyA9PiAnYW5kJywNCgkJJ2FydGljbGVzJyA9PiAnYXJ0aWNsZXMnLA0KCQkn d29yZHMnID0+ICd3b3JkcycsDQoJKTsNCgkkc21kX2Z1enpMYW5nID0gbmV3IHNtZF9NTFAo J3NtZF9mdXp6eV9maW5kJywgJ3NtZF9mdXp6JywgJHNtZF9mdXp6X3N0cik7DQoNCglleHRy YWN0KGxBdHRzKGFycmF5KA0KCQknZm9ybScgPT4gJ3NlYXJjaF9yZXN1bHRzJywNCgkJJ3Nl Y3Rpb24nID0+ICcnLA0KCQknY2F0ZWdvcnknID0+ICcnLA0KCQknc3ViY2F0cycgPT4gJzAn LA0KCQknc2VhcmNoX3Rlcm0nID0+ICc/cScsDQoJCSdtYXRjaF93aXRoJyA9PiAnYXJ0aWNs ZTprZXl3b3Jkcztib2R5O2V4Y2VycHQnLA0KCQkndG9sZXJhbmNlJyA9PiAnMicsDQoJCSdt aW5fd29yZF9sZW5ndGgnID0+ICc0JywNCgkJJ2xpbWl0JyA9PiAnd29yZHM6NSwgYXJ0aWNs ZXM6MTAnLA0KCQknY2FzZV9zZW5zaXRpdmUnID0+ICcwJywNCgkJJ3JlZmluZScgPT4gJ21l dGFwaG9uZSwgc291bmRleCcsDQoJCSdzaG93JyA9PiAnd29yZHMsIGFydGljbGVzJywNCgkJ J3N0YXR1cycgPT4gJ2xpdmUsIHN0aWNreScsDQoJCSdkZWJ1ZycgPT4gJzAnLA0KCQknbm9f bWF0Y2hfbGFiZWwnID0+ICcjJywNCgkJJ3N1Z2dlc3RfbGFiZWwnID0+ICcjJywNCgkJJ3Rv b19zaG9ydF9sYWJlbCcgPT4gJyMnLA0KCQknbGFiZWx0YWcnID0+ICdwJywNCgkpLCAkYXR0 cykpOw0KDQoJJHNlYXJjaEFsbG93ID0gYXJyYXkoIj9jIiwgIiFjIiwgIj9zIiwgIiFzIiwg Ij90IiwgIiF0IiwgIj9pZCIsICIhaWQiLCAiP3EiLCAiIXEiLCAiP2ZpZWxkIiwgIiFmaWVs ZCIpOw0KCSRyZWZpbmVBbGxvdyA9IGFycmF5KCJtZXRhcGhvbmUiLCAic291bmRleCIpOw0K CSRzaG93QWxsb3cgPSBhcnJheSgiYXJ0aWNsZXMiLCAid29yZHMiKTsNCgkkY29sTmFtZXMg PSBhcnJheSgnS2V5d29yZHMnID0+ICJhcnRpY2xlOmtleXdvcmRzIiwNCgkJCQkJCQknQm9k eScgPT4gImFydGljbGU6Ym9keSIsDQoJCQkJCQkJJ0V4Y2VycHQnID0+ICJhcnRpY2xlOmV4 Y2VycHQiLA0KCQkJCQkJCSdDYXRlZ29yeTEnID0+ICJhcnRpY2xlOmNhdGVnb3J5MSIsDQoJ CQkJCQkJJ0NhdGVnb3J5MicgPT4gImFydGljbGU6Y2F0ZWdvcnkyIiwNCgkJCQkJCQknU2Vj dGlvbicgPT4gImFydGljbGU6c2VjdGlvbiIsDQoJCQkJCQkJJ0lEJyA9PiAiYXJ0aWNsZTpp ZCIsDQoJCQkJCQkJJ0F1dGhvcklEJyA9PiAiYXJ0aWNsZTphdXRob3JpZCIsDQoJCQkJCQkJ J1RpdGxlJyA9PiAiYXJ0aWNsZTp0aXRsZSIsDQoJCQkJCQkJJ2NhdGVnb3J5JyA9PiAiaW1h Z2U6Y2F0ZWdvcnkiLA0KCQkJCQkJCSdhbHQnID0+ICJpbWFnZTphbHQiLA0KCQkJCQkJCSdj YXB0aW9uJyA9PiAiaW1hZ2U6Y2FwdGlvbiIsDQoJCQkJCQkJJ25hbWUnID0+ICJpbWFnZTpu YW1lIiwNCgkJCQkJCQknbWVzc2FnZScgPT4gImNvbW1lbnRzOm1lc3NhZ2UiLA0KCQkJCQkJ CSdlbWFpbCcgPT4gImNvbW1lbnRzOmVtYWlsIiwNCgkJCQkJCQknbmFtZScgPT4gImNvbW1l bnRzOm5hbWUiLA0KCQkJCQkJCSd3ZWInID0+ICJjb21tZW50czp3ZWIiLA0KCQkJCQkJCSk7 DQoNCgkkcGxhY2VzID0gYXJyYXkoJ3RleHRwYXR0ZXJuJyA9PiAiYXJ0aWNsZSIsICd0eHBf aW1hZ2UnID0+ICJpbWFnZSIsICd0eHBfZGlzY3VzcycgPT4gImNvbW1lbnRzIik7DQoJJHNl Y3NpbiA9IGFycmF5KCk7DQoJJGNhdHNpbiA9IGFycmF5KCk7DQoJJHN0YXRzaW4gPSBhcnJh eSgpOw0KCSRmdWxsU2VjTGlzdCA9IGFycmF5KCk7DQoJJG5vdFNlY0xpc3QgPSBhcnJheSgp Ow0KCSRmdWxsQ2F0TGlzdCA9IGFycmF5KCk7DQoJJG5vdENhdExpc3QgPSBhcnJheSgpOw0K CSRmdWxsU3RhdExpc3QgPSBhcnJheSgpOw0KCSRub3RTdGF0TGlzdCA9IGFycmF5KCk7DQoJ JHJlZmluZUxpc3QgPSBhcnJheSgpOw0KCSRkYlRhYmxlcyA9IGFycmF5KCk7DQoJJGRiRmll bGRzID0gYXJyYXkoKTsNCgkkd2hlcmVQYXJ0cyA9IGFycmF5KCk7DQoNCgkvLyBFeHBhbmQg dGhlIGFyZ3MgaW4gY2FzZSB0aGV5J3JlID8gb3IgISBzaG9ydGN1dHMsIGFuZCBkbyBzb21l IHZhbGlkaXR5IGNoZWNraW5nLg0KCSRzZWFyY2hfdGVybSA9IHNtZF9nZXRPcHRzKCRzZWFy Y2hfdGVybSwgJHNlYXJjaEFsbG93LCAiIiwgZmFsc2UpOw0KCSRzZWFyY2hfdGVybSA9ICRz ZWFyY2hfdGVybVswXVswXTsNCglpZiAoJGRlYnVnID4gMSkgew0KCQlkbXAoJHNlYXJjaF90 ZXJtKTsNCgl9DQoJJHJlZmluZSA9IGRvX2xpc3QoJHJlZmluZSk7DQoJZm9yICgkaWR4ID0g MDsgJGlkeCA8IGNvdW50KCRyZWZpbmUpOyAkaWR4KyspIHsNCgkJaWYgKGluX2FycmF5KCRy ZWZpbmVbJGlkeF0sICRyZWZpbmVBbGxvdykpIHsNCgkJCSRyZWZpbmVMaXN0WyRpZHhdID0g JHJlZmluZVskaWR4XTsNCgkJfQ0KCX0NCgkkbWV0YV9zZWFyY2ggPSAoaW5fYXJyYXkoIm1l dGFwaG9uZSIsICRyZWZpbmVMaXN0KSkgPyBtZXRhcGhvbmUoJHNlYXJjaF90ZXJtKSA6ICIi Ow0KCSRzb3VuZF9zZWFyY2ggPSAoaW5fYXJyYXkoInNvdW5kZXgiLCAkcmVmaW5lTGlzdCkp ID8gc291bmRleCgkc2VhcmNoX3Rlcm0pIDogIiI7DQoJJHRvbGVyYW5jZSA9IGludHZhbCgk dG9sZXJhbmNlKTsNCg0KCS8vIG1hdGNoX3dpdGggbmVlZHMgdG8gYmUgYnVpbHQgaW50byBh IHNlcmllcyBvZiBhcnJheXMgb2YgZGF0YWJhc2UgdGFibGVzIGFuZCBjb2x1bW5zDQoJJGxv b2tpbiA9IHNtZF9zcGxpdCgkbWF0Y2hfd2l0aCwgZmFsc2UsICI6LFxzIik7DQoJLy8gTG9v cCBvdmVyIHBhaXJzIG9mIGVsZW1lbnRzDQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50 KCRsb29raW4pOyAkaWR4Kz0yKSB7DQoJCSRkYlRhYmxlc1tdID0gYXJyYXlfc2VhcmNoKCRs b29raW5bJGlkeF0sICRwbGFjZXMpOw0KCQkkZGJGaWVsZExpc3QgPSBzbWRfc3BsaXQoJGxv b2tpblskaWR4KzFdLCBmYWxzZSwgIjsiKTsNCgkJJGRiRmllbGQgPSBhcnJheSgpOw0KCQlm b3JlYWNoICgkZGJGaWVsZExpc3QgYXMgJGxvb2tGaWVsZCkgew0KCQkJJGtleSA9IGFycmF5 X3NlYXJjaCgkbG9va2luWyRpZHhdLiI6Ii4kbG9va0ZpZWxkLCAkY29sTmFtZXMpOw0KCQkJ aWYgKCRrZXkpIHsNCgkJCQkkZGJGaWVsZFtdID0gJGtleTsNCgkJCX0gZWxzZSBpZiAoc3Ry cG9zKCRsb29rRmllbGQsICJjdXN0b21fIikgPT09IDApIHsNCgkJCQkkZGJGaWVsZFtdID0g JGxvb2tGaWVsZDsNCgkJCX0NCgkJfQ0KCQkkZGJGaWVsZHNbXSA9ICRkYkZpZWxkOw0KCX0N CglpZiAoY291bnQoJGRiVGFibGVzKSA9PSAwIHx8IGNvdW50KCRkYkZpZWxkcykgPT0gMCkg ew0KCQkkZGJUYWJsZXNbXSA9ICJ0ZXh0cGF0dGVybiI7DQoJCSRkYkZpZWxkc1tdID0gIioi Ow0KCX0NCg0KCSRzaG93TGlzdCA9IGRvX2xpc3QoJHNob3cpOw0KCWZvciAoJGlkeCA9IGNv dW50KCRzaG93TGlzdCk7ICRpZHggPj0gMDsgJGlkeC0tKSB7DQoJCWlmICghaW5fYXJyYXko JHNob3dMaXN0WyRpZHhdLCAkc2hvd0FsbG93KSkgew0KCQkJdW5zZXQoJHNob3dMaXN0WyRp ZHhdKTsNCgkJfQ0KCX0NCgkkbGltaXRCeSA9IGFycmF5KCk7DQoJJGxpbWl0ID0gZG9fbGlz dCgkbGltaXQpOw0KCWZvcmVhY2ggKCRsaW1pdCBhcyAkbGltT3B0aW9uKSB7DQoJCWlmIChp c19udW1lcmljKCRsaW1PcHRpb24pKSB7DQoJCQkkbGltaXRCeVsiYXJ0aWNsZXMiXSA9ICRs aW1PcHRpb247DQoJCQkkbGltaXRCeVsid29yZHMiXSA9ICRsaW1PcHRpb247DQoJCX0gZWxz ZSB7DQoJCQkkbGltc3BsaXQgPSBzbWRfc3BsaXQoJGxpbU9wdGlvbiwgZmFsc2UsICI6Iik7 DQoJCQlpZiAoKGNvdW50KCRsaW1zcGxpdCkgPT0gMikgJiYgKGluX2FycmF5KCRsaW1zcGxp dFswXSwgJHNob3dBbGxvdykpICYmIChpc19udW1lcmljKCRsaW1zcGxpdFsxXSkpKSB7DQoJ CQkJJGxpbWl0QnlbJGxpbXNwbGl0WzBdXSA9ICRsaW1zcGxpdFsxXTsNCgkJCX0NCgkJfQ0K CX0NCgkkdGhpbmdpZXNMMTBuID0gYXJyYXkoKTsNCglmb3JlYWNoICgkc2hvd0xpc3QgYXMg JGl0ZW0pIHsNCgkJJHRoaW5naWVzTDEwbltdID0gJHNtZF9mdXp6TGFuZy0+Z1R4dCgkaXRl bSk7DQoJfQ0KCSR0aGluZ2llcyA9IGltcGxvZGUoIiAiLiRzbWRfZnV6ekxhbmctPmdUeHQo J3N1Z2dlc3Rfam9pbicpLiIgIiwgJHRoaW5naWVzTDEwbik7DQoJJG5vX21hdGNoX2xhYmVs ID0gKCRub19tYXRjaF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgnbm9f bWF0Y2gnLCBhcnJheSgie3NlYXJjaF90ZXJtfSIgPT4gJHNlYXJjaF90ZXJtKSkgOiAkbm9f bWF0Y2hfbGFiZWw7DQoJJHN1Z2dlc3RfbGFiZWwgPSAoJHN1Z2dlc3RfbGFiZWwgPT0gIiMi KSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3QnLCBhcnJheSgie3RoaW5naWVzfSIg PT4gJHRoaW5naWVzKSkgOiAkc3VnZ2VzdF9sYWJlbDsNCgkkdG9vX3Nob3J0X2xhYmVsID0g KCR0b29fc2hvcnRfbGFiZWwgPT0gIiMiKSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ3Rvb19z aG9ydCcpIDogJHRvb19zaG9ydF9sYWJlbDsNCg0KCS8vIEdldCB0aGUgZG9jdW1lbnQgc3Rh dHVzZXMgdG8gc2VhcmNoDQoJJHN0YXRpaSA9IHNtZF9nZXRPcHRzKCRzdGF0dXMsIGFycmF5 KCIhZmllbGQiKSwgIiIsIGZhbHNlKTsNCgkkZnVsbFN0YXRMaXN0ID0gJHN0YXRpaVswXTsN Cgkkbm90U3RhdExpc3QgPSAkc3RhdGlpWzFdOw0KDQoJJHRtcGEgPSBhcnJheSgpOw0KCWZv ciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbFN0YXRMaXN0KTsgJGlkeCsrKSB7DQoJ CSR0bXBhW10gPSAiJyIgLmdldFN0YXR1c051bSgkZnVsbFN0YXRMaXN0WyRpZHhdKS4gIici Ow0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkc3RhdHNpbltdID0gInN0YXR1 cyBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCX0NCgkkdG1wYSA9IGFycmF5 KCk7DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRub3RTdGF0TGlzdCk7ICRpZHgr Kykgew0KCQkkdG1wYVtdID0gIiciIC5nZXRTdGF0dXNOdW0oJG5vdFN0YXRMaXN0WyRpZHhd KS4gIiciOw0KCX0NCglpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkkc3RhdHNpbltdID0g InN0YXR1cyBOT1QgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgl9DQoNCglp ZiAoY291bnQoJHN0YXRzaW4pID4gMCkgew0KCQkkd2hlcmVQYXJ0c1tdID0gIigiIC4gaW1w bG9kZSgiIE9SICIsICRzdGF0c2luKSAuICIpIjsNCgl9DQoNCgkkc2VjdGlvbnMgPSBzbWRf Z2V0T3B0cygkc2VjdGlvbiwgYXJyYXkoIj9zIiwgIiFzIiwgIiFmaWVsZCIpLCAiIiwgZmFs c2UpOw0KCSRmdWxsU2VjTGlzdCA9ICRzZWN0aW9uc1swXTsNCgkkbm90U2VjTGlzdCA9ICRz ZWN0aW9uc1sxXTsNCg0KCSRjYXRzID0gc21kX2dldE9wdHMoJGNhdGVnb3J5LCBhcnJheSgi P2MiLCAiIWMiLCAiIWZpZWxkIiksICIiLCBmYWxzZSk7DQoJJGZ1bGxDYXRMaXN0ID0gJGNh dHNbMF07DQoJJG5vdENhdExpc3QgPSAkY2F0c1sxXTsNCg0KCS8vIGluY2x1ZGVkIHNlY3Rp b25zICYgY2F0ZWdvcmllcw0KCWlmIChpbl9hcnJheSgidGV4dHBhdHRlcm4iLCAkZGJUYWJs ZXMpKSB7DQoJCS8vIHNlY3Rpb25zDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4 ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsU2VjTGlzdCk7ICRpZHgrKykgew0KCQkJJHRtcGFb XSA9ICInIiAuJGZ1bGxTZWNMaXN0WyRpZHhdLiAiJyI7DQoJCX0NCgkJaWYgKGNvdW50KCR0 bXBhKSA+IDApIHsNCgkJCSRzZWNzaW5bXSA9ICJzZWN0aW9uIElOICgiIC5pbXBsb2RlKCIs IiwgJHRtcGEpLiAiKSI7DQoJCX0NCg0KCQkvLyBleGNsdWRlZCBzZWN0aW9ucw0KCQkkdG1w YSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90U2VjTGlz dCk7ICRpZHgrKykgew0KCQkJJHRtcGFbXSA9ICInIiAuJG5vdFNlY0xpc3RbJGlkeF0uICIn IjsNCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHNlY3NpbltdID0gInNl Y3Rpb24gTk9UIElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJCX0NCg0KCQlp ZiAoY291bnQoJHNlY3NpbikgPiAwKSB7DQoJCQkkd2hlcmVQYXJ0c1tdID0gIigiIC4gaW1w bG9kZSgiIE9SICIsICRzZWNzaW4pIC4gIikiOw0KCQl9DQoNCgkJLy8gY2F0ZWdvcmllcw0K CQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVs bENhdExpc3QpOyAkaWR4KyspIHsNCgkJCWlmICgkc3ViY2F0cykgew0KCQkJCSRjYXRlZ3Mg PSBnZXRUcmVlKCRmdWxsQ2F0TGlzdFskaWR4XSwgJ2FydGljbGUnKTsNCgkJCQlmb3IgKCRq ZHggPSAwOyAkamR4IDwgY291bnQoJGNhdGVncyk7ICRqZHgrKykgew0KCQkJCQlpZiAoJGNh dGVnc1skamR4XVsnbmFtZSddICE9ICJyb290Iikgew0KCQkJCQkJJHRtcGFbXSA9ICInIiAu JGNhdGVnc1skamR4XVsnbmFtZSddLiAiJyI7DQoJCQkJCX0NCgkJCQl9DQoJCQl9IGVsc2Ug ew0KCQkJCSR0bXBhW10gPSAiJyIgLiRmdWxsQ2F0TGlzdFskaWR4XS4gIiciOw0KCQkJfQ0K CQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkdGhlQ2F0cyA9IGltcGxvZGUo IiwiLCAkdG1wYSk7DQoJCQkkY2F0c2luW10gPSAiKCBDYXRlZ29yeTEgSU4gKCIgLiR0aGVD YXRzLiAiKSBPUiBDYXRlZ29yeTIgSU4gKCIgLiR0aGVDYXRzLiAiKSApIjsNCgkJfQ0KDQoJ CS8vIGV4Y2x1ZGVkIGNhdGVnb3JpZXMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRp ZHggPSAwOyAkaWR4IDwgY291bnQoJG5vdENhdExpc3QpOyAkaWR4KyspIHsNCgkJCWlmICgk c3ViY2F0cykgew0KCQkJCSRjYXRlZ3MgPSBnZXRUcmVlKCRub3RDYXRMaXN0WyRpZHhdLCAn YXJ0aWNsZScpOw0KCQkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsg JGpkeCsrKSB7DQoJCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7 DQoJCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJ CQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHRtcGFbXSA9ICInIiAuJG5vdENhdExp c3RbJGlkeF0uICInIjsNCgkJCX0NCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0K CQkJJHRoZUNhdHMgPSBpbXBsb2RlKCIsIiwgJHRtcGEpOw0KCQkJJGNhdHNpbltdID0gIigg Q2F0ZWdvcnkxIE5PVCBJTiAoIiAuJHRoZUNhdHMuICIpIEFORCBDYXRlZ29yeTIgTk9UIElO ICgiIC4kdGhlQ2F0cy4gIikgKSI7DQoJCX0NCg0KCQlpZiAoY291bnQoJGNhdHNpbikgPiAw KSB7DQoJCQkkd2hlcmVQYXJ0c1tdID0gIigiIC4gaW1wbG9kZSgiIEFORCAiLCAkY2F0c2lu KSAuICIpIjsNCgkJfQ0KDQoJCS8vIGNvbW1lbnRzDQoJCWlmIChpbl9hcnJheSgidHhwX2Rp c2N1c3MiLCRkYlRhYmxlcykpIHsNCgkJCSR3aGVyZVBhcnRzW10gPSAidGV4dHBhdHRlcm4u SUQgPSB0eHBfZGlzY3Vzcy5wYXJlbnRpZCI7DQogICAgICB9DQoJfQ0KDQoJLy8gQ2F0Y2gt YWxsIGZvciB0aGUgd2hlcmUgc3RhdGVtZW50DQoJaWYgKGNvdW50KCR3aGVyZVBhcnRzKSA9 PSAwKSB7DQoJCSR3aGVyZSA9ICIxPTEiOw0KCX0gZWxzZSB7DQoJCSR3aGVyZSA9IGltcGxv ZGUoIiBBTkQgIiwgJHdoZXJlUGFydHMpOw0KCX0NCg0KCWlmICgkZGVidWcgPiAwKSB7DQoJ CWRtcCgkd2hlcmUpOw0KCX0NCg0KCSRvdXQgPSAiIjsNCgkvLyBQZXJmb3JtIHRoZSBzZWFy Y2hlcw0KCSRmaW5kZXIgPSBuZXcgc21kX0Z1enp5RmluZCgkc2VhcmNoX3Rlcm0sICR0b2xl cmFuY2UpOw0KCWlmICgkZmluZGVyLT50b29fc2hvcnRfZXJyKSB7DQoJCSRvdXQgLj0gKCRs YWJlbHRhZyA9PSAiIikgPyAiIiA6ICI8IiAuJGxhYmVsdGFnLiI+IjsNCgkJJG91dCAuPSAk bm9fbWF0Y2hfbGFiZWw7DQoJCSRvdXQgLj0gJHRvb19zaG9ydF9sYWJlbDsNCgkJJG91dCAu PSAoJGxhYmVsdGFnID09ICIiKSA/ICIiIDogIjwvIiAuJGxhYmVsdGFnLiI+IjsNCgl9IGVs c2Ugew0KCQkkY29scyA9ICIqIiAuICgoaW5fYXJyYXkoInRleHRwYXR0ZXJuIiwgJGRiVGFi bGVzKSkgPyAiLCB1bml4X3RpbWVzdGFtcCh0ZXh0cGF0dGVybi5Qb3N0ZWQpIEFTIHVQb3N0 ZWQiIDogIiIpOw0KCQkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoJGNvbHMsIGltcGxvZGUoJGRi VGFibGVzLCAiLCAiKSwgJHdoZXJlKTsNCgkJaWYgKGluX2FycmF5KCJ0ZXh0cGF0dGVybiIs JGRiVGFibGVzKSkgew0KCQkJJG9wZm9ybSA9IGZldGNoX2Zvcm0oJGZvcm0pOw0KCQl9DQoJ CSRwYWdldXJsID0gc21kX3JlbW92ZVFTVmFyKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCdx Jyk7DQoJCSRhbGxGaWVsZHMgPSAiIjsNCgkJJGFydExpc3QgPSBhcnJheSgpOw0KCQkkd29y ZExpc3QgPSBhcnJheSgpOw0KCQkkdGVybUxpc3QgPSBhcnJheSgpOw0KCQl3aGlsZSgkcm93 ID0gbmV4dFJvdygkcnMpKSB7DQoJCQkkYWxsRmllbGRzID0gIiI7DQoJCQkvLyBKb2luIGFs bCB0aGUgcmVxdWlyZWQgcGxhY2VzIHRvIGxvb2sgaW50byBhIGxvbmcgdGV4dCBibG9jaw0K CQkJZm9yZWFjaCAoJGRiRmllbGQgYXMgJHRoZUZpZWxkKSB7DQoJCQkJJGFsbEZpZWxkcyAu PSAkcm93WyR0aGVGaWVsZF0uIiAiOw0KCQkJfQ0KCQkJLy8gUmVtb3ZlIGJldHdlZW4td29y ZCBwdW5jdHVhdGlvbiBhbmQgcmVwbGFjZSB3aXRoIHNwYWNlDQoJCQkkanVzdENoYXJzID0g Ii9bXmEtekEtWjAtOVwtXCcgXSsvIjsNCgkJCSRhbGxGaWVsZHMgPSBwcmVnX3JlcGxhY2Uo JGp1c3RDaGFycywgJyAnLCAkYWxsRmllbGRzKTsNCgkJCS8vIFNwbGl0IHRoZSByZW1haW5k ZXIgYnkgKHNpbmdsZSBvciBtdWx0aXBsZSkgc3BhY2VzDQoJCQkkd2VyZHMgPSBwcmVnX3Nw bGl0KCcvXHMrLycsICRhbGxGaWVsZHMsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsNCgkJ CS8vIC4uLmFuZCByZWNvbnN0aXR1dGUgdGhlIHVuaXF1ZSB3b3JkcyBhcyBhIGh1Z2Ugc3Bh Y2UtZGVsaW1pdGVkIHN0cmluZw0KCQkJJHdlcmRzID0gaW1wbG9kZSgiICIsYXJyYXlfdW5p cXVlKCR3ZXJkcykpOw0KCQkJLy8gVGFrZSBpbnRvIGFjY291bnQgY2FzZSBzZW5zaXRpdml0 eQ0KCQkJJHdlcmRzID0gKCRjYXNlX3NlbnNpdGl2ZSkgPyAkd2VyZHMgOiBzdHJ0b2xvd2Vy KCR3ZXJkcyk7DQoJCQlpZiAoJGRlYnVnID4gMSkgew0KCQkJCWRtcCgkd2VyZHMpOw0KCQkJ fQ0KDQoJCQkvLyBGaW5kIGNsb3NlIHdvcmQgbWF0Y2hlcw0KCQkJJG1hdGNoZXMgPSAkZmlu ZGVyLT5zZWFyY2goJHdlcmRzKTsNCgkJCWlmICgkZGVidWcgPiAxKSB7DQoJCQkJZG1wKCRt YXRjaGVzKTsNCgkJCX0NCg0KCQkJaWYgKGNvdW50KCRtYXRjaGVzKSA+IDApIHsNCgkJCQkk c2hvcnRlc3REaXN0ID0gMTAwOyAvLyBBIHN0dXBpZGx5IGhpZ2ggbnVtYmVyIHRvIHN0YXJ0 IHdpdGgNCgkJCQkkc2hvcnRlc3RNZXRhRGlzdCA9IC0xOw0KCQkJCSRjbG9zZXN0V29yZCA9 ICIiOw0KCQkJCSRjbG9zZXN0TWV0YVdvcmQgPSAiIjsNCgkJCQkkbWF4X3Rlcm1fbGVuID0g MDsNCgkJCQkvLyBCdWlsZCBhIHVuaXF1ZSBhcnJheSBvZiBjbG9zZXN0IG1hdGNoaW5nIHdv cmRzDQoJCQkJd2hpbGUobGlzdCgkaWR4LCRkaXN0KSA9IGVhY2goJG1hdGNoZXMpKSB7DQoJ CQkJCSR0ZXJtID0gc21kX2dldFdvcmQoJHdlcmRzLCRzZWFyY2hfdGVybSwkaWR4KTsNCg0K CQkJCQkvLyBPbmx5IHdvcmRzIG1lZXRpbmcgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgbmVl ZCBhcHBseQ0KCQkJCQkkbWF4X3Rlcm1fbGVuID0gKHN0cmxlbigkdGVybSkgPiAkbWF4X3Rl cm1fbGVuKSA/IHN0cmxlbigkdGVybSkgOiAkbWF4X3Rlcm1fbGVuOw0KCQkJCQlpZiAoc3Ry bGVuKCR0ZXJtKSA8ICRtaW5fd29yZF9sZW5ndGgpIHsNCgkJCQkJCWNvbnRpbnVlOw0KCQkJ CQl9DQoJCQkJCSR0ZXJtID0gKCRjYXNlX3NlbnNpdGl2ZSkgPyAkdGVybSA6IHN0cnRvbG93 ZXIoJHRlcm0pOw0KCQkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJCQkJZWNobyAkdGVybSAu ICIgIjsNCgkJCQkJfQ0KCQkJCQlpZiAoJGRpc3QgPCAkc2hvcnRlc3REaXN0KSB7DQoJCQkJ CQkkc2hvcnRlc3REaXN0ID0gJGRpc3Q7DQoJCQkJCQkkY2xvc2VzdFdvcmQgPSAkdGVybTsN CgkJCQkJfQ0KCQkJCQlpZiAoJG1ldGFfc2VhcmNoICE9ICIiKSB7DQoJCQkJCQkkbWV0YV90 ZXJtID0gbWV0YXBob25lKCR0ZXJtKTsNCgkJCQkJCWlmICgkZGVidWcgPiAyKSB7DQoJCQkJ CQkJZWNobyAkbWV0YV90ZXJtIC4gIiA6ICIgLiAkbWV0YV9zZWFyY2ggLiIgIi5uOw0KCQkJ CQkJfQ0KCQkJCQkJJGxldkRpc3QgPSBsZXZlbnNodGVpbigkbWV0YV9zZWFyY2gsICRtZXRh X3Rlcm0pOw0KCQkJCQkJaWYgKCRsZXZEaXN0IDw9ICRzaG9ydGVzdE1ldGFEaXN0IHx8ICRz aG9ydGVzdE1ldGFEaXN0IDwgMCkgew0KCQkJCQkJCSRzaG9ydGVzdE1ldGFEaXN0ID0gJGxl dkRpc3Q7DQoJCQkJCQkJJGNsb3Nlc3RNZXRhV29yZCAgPSAkdGVybTsNCgkJCQkJCX0NCgkJ CQkJfQ0KCQkJCX0NCgkJCQkvLyBQaWNrIHRoZSBvbmUgdGhhdCBzb3VuZHMgY2xvc2VzdCB0 byB0aGUgb3JpZ2luYWwNCgkJCQlpZiAodHJpbSgkY2xvc2VzdFdvcmQpICE9ICIiKSB7DQoJ CQkJCSRpZHggPSBtZDUoJGNsb3Nlc3RXb3JkKTsNCgkJCQkJJGJlc3RGaXQgPSAkY2xvc2Vz dFdvcmQ7DQoJCQkJCSRiZXN0RGlzdCA9ICRzaG9ydGVzdERpc3Q7DQoJCQkJCWlmICgkc291 bmRfc2VhcmNoICE9ICIiKSB7DQoJCQkJCQkkc291bmQxID0gbGV2ZW5zaHRlaW4oc291bmRl eCgkY2xvc2VzdFdvcmQpLCAkc291bmRfc2VhcmNoKTsNCgkJCQkJCSRzb3VuZDIgPSBsZXZl bnNodGVpbihzb3VuZGV4KCRjbG9zZXN0TWV0YVdvcmQpLCAkc291bmRfc2VhcmNoKTsNCgkJ CQkJCWlmICgkc291bmQxID49ICRzb3VuZDIpIHsNCgkJCQkJCQkkaWR4ID0gbWQ1KCRjbG9z ZXN0TWV0YVdvcmQpOw0KCQkJCQkJCSRiZXN0Rml0ID0gJGNsb3Nlc3RNZXRhV29yZDsNCgkJ CQkJCQkkYmVzdERpc3QgPSAkc2hvcnRlc3RNZXRhRGlzdDsNCgkJCQkJCX0NCgkJCQkJfQ0K CQkJCQkkd29yZExpc3RbJGlkeF0gPSAkYmVzdEZpdDsNCgkJCQkJJHdvcmREaXN0WyRpZHhd ID0gJGJlc3REaXN0Ow0KCQkJCX0NCgkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJCQlkbXAo IkJFU1RGSVQ6IiAuJGJlc3RGaXQpOw0KCQkJCX0NCg0KCQkJCS8vIEJ1aWxkIGFuIGFycmF5 IG9mIHVuaXF1ZSBtYXRjaGluZyBhcnRpY2xlcw0KCQkJCWlmICgkbWF4X3Rlcm1fbGVuID49 ICRtaW5fd29yZF9sZW5ndGgpIHsNCgkJCQkJaWYgKGluX2FycmF5KCJ0ZXh0cGF0dGVybiIs ICRkYlRhYmxlcykpIHsNCgkJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJHJvdyk7DQoJCQkJ CX0NCgkJCQkJLy8gVGVtcG9yYXJpbHkgYXNzaWduIHRoZSBjbG9zZXN0IG1hdGNoIHRvIHRo ZSBxdWVyeSBzdHJpbmcgc28gdGhhdA0KCQkJCQkvLyB0aGUgc2VhcmNoX3Jlc3VsdF9leGNl cnB0IGNhbiBoaWxpZ2h0IHRoZSBmb3VuZCB3b3Jkcw0KCQkJCQkkcHJldGV4dFsncSddID0g JHRlcm07DQoJCQkJCSRhcnRMaXN0W10gPSBwYXJzZSgkb3Bmb3JtKTsNCgkJCQkJJHByZXRl eHRbJ3EnXSA9ICRzZWFyY2hfdGVybTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJLy8gU29ydCB0 aGUgd29yZCBsaXN0IGluIG9yZGVyIG9mIHJlbGV2YW5jZQ0KCQlpZiAoY291bnQoJHdvcmRM aXN0KSA+IDApIHsNCgkJCWFycmF5X211bHRpc29ydCgkd29yZERpc3QsJHdvcmRMaXN0KTsN CgkJfQ0KDQoJCS8vIE91dHB1dCBzdHVmZiB0byB0aGUgcGFnZQ0KCQkkb3V0IC49ICgkbGFi ZWx0YWcgPT0gIiIpID8gIiIgOiAiPCIgLiRsYWJlbHRhZy4iPiI7DQoJCSRvdXQgLj0gJG5v X21hdGNoX2xhYmVsOw0KCQlpZiAoY291bnQoJHdvcmRMaXN0KSA+IDApIHsNCgkJCSRvdXQg Lj0gKGNvdW50KCRzaG93TGlzdCkgPiAwKSA/ICRzdWdnZXN0X2xhYmVsIDogIiI7DQoNCgkJ CWlmIChpbl9hcnJheSgid29yZHMiLCAkc2hvd0xpc3QpKSB7DQoJCQkJJGN0ciA9IDA7DQoJ CQkJZm9yZWFjaCAoJHdvcmRMaXN0IGFzICRpdGVtKSB7DQoJCQkJCWlmIChhcnJheV9rZXlf ZXhpc3RzKCJ3b3JkcyIsICRsaW1pdEJ5KSAmJiAkY3RyID49ICRsaW1pdEJ5WyJ3b3JkcyJd KSB7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQkkb3V0IC49ICc8YSBocmVmPSInLnNt ZF9hZGRRU1ZhcigkcGFnZXVybCwncScsJGl0ZW0pLiciPicuJGl0ZW0uJzwvYT4nLm47DQoJ CQkJCSRjdHIrKzsNCgkJCQl9DQoJCQl9DQoJCQkkb3V0IC49ICgkbGFiZWx0YWcgPT0gIiIp ID8gIiIgOiAiPC8iIC4kbGFiZWx0YWcuIj4iOw0KCQkJaWYgKGluX2FycmF5KCJhcnRpY2xl cyIsICRzaG93TGlzdCkpIHsNCgkJCQkkY3RyID0gMDsNCgkJCQlmb3JlYWNoICgkYXJ0TGlz dCBhcyAkYXJ0KSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJhcnRpY2xlcyIsICRs aW1pdEJ5KSAmJiAkY3RyID49ICRsaW1pdEJ5WyJhcnRpY2xlcyJdKSB7DQoJCQkJCQlicmVh azsNCgkJCQkJfQ0KCQkJCQkkb3V0IC49ICRhcnQ7DQoJCQkJCSRjdHIrKzsNCgkJCQl9DQoJ CQl9DQoJCX0NCgl9DQoJcmV0dXJuICRvdXQ7DQp9DQoNCg0KLyogc21kX0Z1enp5RmluZA0K QSBQSFAgY2xhc3MgZm9yIGFwcHJveGltYXRlIHN0cmluZyBzZWFyY2hpbmcgb2YgbGFyZ2Ug dGV4dCBtYXNzZXMsIGFkYXB0ZWQgKCpjb3VnaCogYm9ycm93ZWQpIGZyb20gaHR0cDovL2Vs b25lbi5pa2kuZmkvY29kZS9taXNjLW5vdGVzL2FwcHItc2VhcmNoLXBocC8uIEluc3RhbnRp YXRlIG9uZSBvZiB0aGVzZSBhbmQgcGFzcyBpdCB0aGUgc3RyaW5nIHBhdHRlcm4vd29yZCB5 b3UgYXJlIGxvb2tpbmcgZm9yIGFuZCBhIG51bWJlciBpbmRpY2F0aW5nIGhvdyBjbG9zZSB0 aGF0IG1hdGNoIGhhcyB0byBiZS9taW5pbXVtIGxlbmd0aCBvZiBzdHJpbmdzIHRvIGNvbnNp ZGVyIChpLmUuIHRoZSBhbW91bnQgb2YgZXJyb3IgdG9sZXJhYmxlKS4gMD1jbG9zZSBtYXRj aC9zaG9ydCB3b3JkczsgMTA9cHJldHR5IG11Y2ggZXZlcnkgbG9uZyAoMTAgY2hhciBtaW5p bXVtKSBzdHJpbmcgaW4gdGhlIHdvcmxkLiBQcmFjdGljYWwgdmFsdWVzIGFyZSB1c3VhbGx5 IDEgb3IgMiwgc29tZXRpbWVzIDMuDQoNClVzYWdlIGV4YW1wbGU6DQogICRmaW5kZXIgPSBu ZXcgc21kX0Z1enp5RmluZCgkcGF0dCwgJG1heF9lcnIpOw0KICBpZiAoJGZpbmRlci0+dG9v X3Nob3J0X2VycikNCiAgICAkZXJyb3IgPSAiVW5hYmxlIHRvIHNlYXJjaDogdXNlIGxvbmdl ciBwYXR0ZXJuIG9yIHJlZHVjZSBlcnJvciB0b2xlcmFuY2UuIjsNCg0KICB3aGlsZSgkdGV4 dCA9IGdldF9uZXh0X3BhZ2Vfb2ZfdGV4dCgpKSB7DQogICAgJG1hdGNoZXMgPSAkZmluZGVy LT5zZWFyY2goJHRleHQpOw0KICAgIHdoaWxlKGxpc3QoJGlkeCwkcm5nKSA9IGVhY2goJG1h dGNoZXMpKQ0KICAgICAgcHJpbnQgIk1hdGNoIGZvdW5kIGVuZGluZyBhdCBwb3NpdGlvbiAk aWR4IHdpdGggYSBjbG9zZW5lc3Mgb2YgJHZhbFxuIjsNCiAgfQ0KDQpUaGUgY29kZSB1c2Vz IGluaXRpYWwgZmlsdGVyaW5nIHRvIHNvcnQgb3V0IHBvc3NpYmxlIG1hdGNoIGNhbmRpZGF0 ZXMgYW5kIHRoZW4gYXBwbGllcyBhIHNsb3dlciBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHNl YXJjaCAoc2VhcmNoX3Nob3J0KCkpIGFnYWluc3QgdGhlbS4NCiovDQoNCmlmKCFjbGFzc19l eGlzdHMoJ3NtZF9GdXp6eUZpbmQnKSkgew0KY2xhc3Mgc21kX0Z1enp5RmluZCB7DQoJLy8g VGhlIGxhc3QgMyBwYXJhbWV0ZXJzIGFyZSBmb3Igb3B0aW1pemF0aW9uIG9ubHksIHRvIGF2 b2lkIHRoZQ0KCS8vIHN1cnByaXNpbmdseSBzbG93IHN0cmxlbigpIGFuZCBzdWJzdHIoKSBj YWxsczoNCgkvLyAgLSAkc3RhcnRfaW5kZXggPSBmcm9tIHdoaWNoIGNoYXJhY3RlciBvZiAk dGV4dCB0byBzdGFydCB0aGUgc2VhcmNoDQoJLy8gIC0gJG1heF9sZW4gPSBtYXhpbXVtIGNo YXJhY3RlciB0byBzZWFyY2ggKHN0YXJ0aW5nIGZyb20gJHN0YXJ0X2luZGV4KQ0KCS8vICAt ICR0ZXh0X3N0cmxlbiA9DQoJLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheSBvZiBt YXRjaGVzOg0KCS8vICAgQXJyYXkoIFs8bWF0Y2gtZW5kLWluZGV4Pl0gPT4gPGVycm9yPiwg Li4uICkNCgkvLyBOb3RlOiA8ZXJyb3I+IGlzIGdlbmVyYWxseSBOT1QgYW4gZXhhY3QgZWRp dCBkaXN0YW5jZSBidXQgcmF0aGVyIGENCgkvLyBsb3dlciBib3VuZC4gVGhpcyBpcyB1bmZv cnR1bmF0ZSBidXQgdGhlIHJvdXRpbmUgd291bGQgYmUgc2xvd2VyIGlmDQoJLy8gdGhlIGV4 YWN0IGVycm9yIHdhcyBjYWxjdWxhdGUgYWxvbmcgd2l0aCB0aGUgbWF0Y2hlcy4NCgkvLyBU aGUgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIG5vbi1kZXRlcm1pbmlzdGljIGF1dG9tYXRv biBzaW11bGF0aW9uDQoJLy8gYWxnb3JpdGhtICh3aXRob3V0IGJpdCBwYXJhbGxlbGlzbSBv cHRpbWl6YXRpb25zKS4NCglmdW5jdGlvbiBzZWFyY2hfc2hvcnQoJHBhdHQsICRrLCAkdGV4 dCwgJHN0YXJ0X2luZGV4PTAsICRtYXhfbGVuPS0xLCAkdGV4dF9zdHJsZW49LTEpIHsNCgkJ aWYgKCAkdGV4dF9zdHJsZW4gPCAwICkNCgkJCSR0ZXh0X3N0cmxlbiA9IHN0cmxlbiggJHRl eHQgKTsNCg0KCQlpZiAoICRtYXhfbGVuIDwgMCApDQoJCQkkbWF4X2xlbiA9ICR0ZXh0X3N0 cmxlbjsNCg0KCQkkc3RhcnRfaW5kZXggPSBtYXgoIDAsICRzdGFydF9pbmRleCApOw0KCQkk biA9IG1pbiggJG1heF9sZW4sICR0ZXh0X3N0cmxlbi0kc3RhcnRfaW5kZXggKTsNCgkJJG0g PSBzdHJsZW4oICRwYXR0ICk7DQoJCSRlbmRfaW5kZXggPSAkc3RhcnRfaW5kZXggKyAkbjsN Cg0KCQkvLyBJZiAkdGV4dCBpcyBzaG9ydGVyIHRoYW4gJHBhdHQsIHVzZSB0aGUgYnVpbHQt aW4NCgkJLy8gbGV2ZW5zaHRlaW4oKSBpbnN0ZWFkOg0KCQlpZiAoJG4gPCAkbSkNCgkJew0K CQkJJGxldiA9IGxldmVuc2h0ZWluKHN1YnN0cigkdGV4dCwgJHN0YXJ0X2luZGV4LCAkbiks ICRwYXR0KTsNCgkJCWlmICggJGxldiA8PSAkayApDQoJCQkJcmV0dXJuIEFycmF5KCAkc3Rh cnRfaW5kZXgrJG4tMSA9PiAkbGV2ICk7DQoJCQllbHNlDQoJCQkJcmV0dXJuIEFycmF5KCk7 DQoJCX0NCg0KCQkkcyA9IEFycmF5KCk7DQoJCWZvciAoJGk9MDsgJGk8JG07ICRpKyspDQoJ CXsNCgkJCSRjID0gJHBhdHR7JGl9Ow0KCQkJaWYgKCBpc3NldCgkc1skY10pKQ0KCQkJCSRz WyRjXSA9IG1pbigkaSwgJHNbJGNdKTsNCgkJCWVsc2UNCgkJCQkkc1skY10gPSAkaTsNCgkJ fQ0KDQoJCWlmICggJGVuZF9pbmRleCA8ICRzdGFydF9pbmRleCApDQoJCQlyZXR1cm4gQXJy YXkoKTsNCg0KCQkkbWF0Y2hlcyA9IEFycmF5KCk7DQoJCSRkYSA9ICRkYiA9IHJhbmdlKDAs ICRtLSRrKzEpOw0KDQoJCSRtayA9ICRtLSRrOw0KDQoJCWZvciAoJHQ9JHN0YXJ0X2luZGV4 OyAkdDwkZW5kX2luZGV4OyAkdCsrKQ0KCQl7DQoJCQkkYyA9ICR0ZXh0eyR0fTsNCgkJCSRp bl9wYXR0ID0gaXNzZXQoJHNbJGNdKTsNCg0KCQkJaWYgKCR0JjEpIHsgJGQ9JiRkYTsgJGU9 JiRkYjsgfQ0KCQkJZWxzZSB7ICRkPSYkZGI7ICRlPSYkZGE7IH0NCg0KCQkJZm9yICgkaT0x OyAkaTw9JG1rOyAkaSsrKQ0KCQkJew0KCQkJCSRnID0gbWluKCAkaysxLCAkZVskaV0rMSwg JGVbJGkrMV0rMSApOw0KDQoJCQkJLy8gVE9ETzogb3B0aW1pemUgdGhpcyB3aXRoIGEgbG9v ay11cC10YWJsZT8NCgkJCQlpZiAoICRpbl9wYXR0ICkNCgkJCQkJZm9yICgkaj0kZVskaS0x XTsgKCRqPCRnICYmICRqPD0kbWspOyAkaisrKQ0KCQkJCQkJaWYgKCAkcGF0dHskaSskai0x fSA9PSAkYyApDQoJCQkJCQkJJGcgPSAkajsNCg0KCQkJCSRkWyRpXSA9ICRnOw0KCQkJfQ0K DQoJCQlpZiAoICRkWyRta10gPD0gJGsgKQ0KCQkJew0KCQkJCSRlcnIgPSAkZFskbWtdOw0K CQkJCSRpID0gbWluKCAkdC0kZXJyKyRrKzEsICRzdGFydF9pbmRleCskbi0xKTsNCgkJCQlp ZiAoICFpc3NldCgkbWF0Y2hlc1skaV0pIHx8ICRlcnIgPCAkbWF0Y2hlc1skaV0pDQoJCQkJ CSRtYXRjaGVzWyRpXSA9ICRlcnI7DQoJCQl9DQoJCX0NCg0KCQl1bnNldCggJGRhLCAkZGIg KTsNCgkJcmV0dXJuICRtYXRjaGVzOw0KCX0NCglmdW5jdGlvbiB0ZXN0X3Nob3J0X3NlYXJj aCgpIHsNCgkJJHRlc3RfdGV4dCA9ICJPbGlwYSBrZXJyYW4ganVzc2kgYmomeGxpbmcgamEg a29sbWVcbiBpbG9pc3RhICIuDQoJCQkianVzc2kgYmZvcmxpbmc6aWEgbXV0dGEgZWkgeWh0 YWFuIGp1c3NpIGJqb3JsaW5nLW5pbWlzdGEgbGF1bGFqYWEuIjsNCgkJJHRlc3RfcGF0dCA9 ICJqdXNzaSBiam9ybGluZyI7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgkdGVz dF9wYXR0LCA0LCAkdGVzdF90ZXh0KSA9PSBBcnJheSgyNz0+MiwgNjA9PjEsIDk0PT4wKSk7 DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgkdGVzdF9wYXR0LCAyLCAkdGVzdF90 ZXh0KSA9PSBBcnJheSgyNz0+MiwgNjA9PjEsIDk0PT4wKSk7DQoJCWFzc2VydCggJHRoaXMt PnNlYXJjaF9zaG9ydCgkdGVzdF9wYXR0LCAxLCAkdGVzdF90ZXh0KSA9PSBBcnJheSg2MD0+ MSwgOTQ9PjApKTsNCgkJYXNzZXJ0KCAkdGhpcy0+c2VhcmNoX3Nob3J0KCR0ZXN0X3BhdHQs IDAsICR0ZXN0X3RleHQpID09IEFycmF5KDk0PT4wKSk7DQoJCWFzc2VydCggJHRoaXMtPnNl YXJjaF9zaG9ydCgiYmpvcmxpbmciLCAyLCAkdGVzdF90ZXh0LCAxOSwgNykgPT0gQXJyYXko KSk7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgiYmpvcmxpbmciLCAyLCAkdGVz dF90ZXh0LCAxOSwgOCkgPT0gQXJyYXkoMjY9PjIpKTsNCgkJYXNzZXJ0KCAkdGhpcy0+c2Vh cmNoX3Nob3J0KCJiam9ybGluZyIsIDIsICR0ZXN0X3RleHQsIDIwLCA4KSA9PSBBcnJheSgp KTsNCgl9DQoNCgl2YXIgJHBhdHQsICRwYXR0X2xlbiwgJG1heF9lcnI7DQoJdmFyICRwYXJ0 cywgJG5fcGFydHMsICR1bmlxdWVfcGFydHMsICRtYXhfcGFydF9sZW47DQoJdmFyICR0cmFu c2ZfcGF0dDsNCgl2YXIgJHRvb19zaG9ydF9lcnI7DQoJZnVuY3Rpb24gc21kX0Z1enp5Rmlu ZCggJHBhdHRlcm4sICRtYXhfZXJyb3IgKSB7DQoJCSR0aGlzLT5wYXR0ID0gJHBhdHRlcm47 DQoJCSR0aGlzLT5wYXR0X2xlbiA9IHN0cmxlbigkdGhpcy0+cGF0dCk7DQoJCSR0aGlzLT5t YXhfZXJyID0gJG1heF9lcnJvcjsNCg0KCQkvLyBDYWxjdWxhdGUgcGF0dGVybiBwYXJ0aXRp b24gc2l6ZQ0KCQkkaW50cGFydGxlbiA9IGZsb29yKCR0aGlzLT5wYXR0X2xlbi8oJHRoaXMt Pm1heF9lcnIrMikpOw0KCQlpZiAoJGludHBhcnRsZW4gPCAxKQ0KCQl7DQoJCQkkdGhpcy0+ dG9vX3Nob3J0X2VyciA9IFRydWU7DQoJCQlyZXR1cm47DQoJCX0NCgkJZWxzZSAkdGhpcy0+ dG9vX3Nob3J0X2VyciA9IEZhbHNlOw0KDQoJCS8vIFBhcnRpdGlvbiB0aGUgcGF0dGVybiBm b3IgcHJ1bmluZw0KCQkkdGhpcy0+cGFydHMgPSBBcnJheSgpOw0KCQlmb3IgKCRpPTA7ICRp PCR0aGlzLT5wYXR0X2xlbjsgJGkrPSRpbnRwYXJ0bGVuKQ0KCQl7DQoJCQlpZiAoICRpICsg JGludHBhcnRsZW4qMiA+ICR0aGlzLT5wYXR0X2xlbiApDQoJCQl7DQoJCQkJJHRoaXMtPnBh cnRzW10gPSBzdWJzdHIoICR0aGlzLT5wYXR0LCAkaSApOw0KCQkJCWJyZWFrOw0KCQkJfQ0K CQkJZWxzZQ0KCQkJCSR0aGlzLT5wYXJ0c1tdID0gc3Vic3RyKCAkdGhpcy0+cGF0dCwgJGks ICRpbnRwYXJ0bGVuICk7DQoJCX0NCgkJJHRoaXMtPm5fcGFydHMgPSBjb3VudCgkdGhpcy0+ cGFydHMpOw0KDQoJCS8vIFRoZSBpbnRwYXJ0bGVuIHRlc3QgYWJvdmUgc2hvdWxkIGhhdmUg Y292ZXJlZCB0aGlzOg0KCQlhc3NlcnQoICR0aGlzLT5uX3BhcnRzID49ICR0aGlzLT5tYXhf ZXJyKzEgKTsNCg0KCQkvLyBGaW5kIG1heGltdW0gcGFydCBsZW5ndGgNCgkJZm9yZWFjaCgg JHRoaXMtPnBhcnRzIGFzICRwICkNCgkJCSR0aGlzLT5tYXhfcGFydF9sZW4gPSBtYXgoICR0 aGlzLT5tYXhfcGFydF9sZW4sIHN0cmxlbigkcCkpOw0KDQoJCS8vIE1ha2UgYSBuZXcgcGFy dCBhcnJheSB3aXRoIGR1cGxpY2F0ZSBzdHJpbmdzIHJlbW92ZWQNCgkJJHRoaXMtPnVuaXF1 ZV9wYXJ0cyA9IGFycmF5X3VuaXF1ZSgkdGhpcy0+cGFydHMpOw0KDQoJCS8vIFRyYW5zZm9y bSB0aGUgcGF0dGVybiBpbnRvIGEgbG93IHJlc29sdXRpb24gcHJ1bmluZyBzdHJpbmcNCgkJ Ly8gYnkgcmVwbGFjaW5nIHBhcnRzIHdpdGggc2luZ2xlIGNoYXJhY3RlcnMNCgkJJHRoaXMt PnRyYW5zZl9wYXR0ID0gIiI7DQoJCXJlc2V0KCAkdGhpcy0+cGFydHMgKTsNCgkJd2hpbGUg KGxpc3QoLCRwKSA9IGVhY2goJHRoaXMtPnBhcnRzKSkNCgkJICAgJHRoaXMtPnRyYW5zZl9w YXR0IC49IGNocihhcnJheV9zZWFyY2goJHAsICR0aGlzLT51bmlxdWVfcGFydHMpK29yZCgi QSIpKTsNCg0KCQkvLyBTZWxmIGRpYWdub3N0aWNzDQoJCSR0aGlzLT50ZXN0X3Nob3J0X3Nl YXJjaCgpOw0KCX0NCglmdW5jdGlvbiBzZWFyY2goICR0ZXh0ICkgew0KCQkvLyBGaW5kIGFs bCBvY2N1cmVuY2VzIG9mIHVuaXF1ZSBwYXJ0cyBpbiB0aGUNCgkJLy8gZnVsbCB0ZXh0LiBU aGUgcmVzdWx0IGlzIGFuIGFycmF5Og0KCQkvLyAgIEFycmF5KCA8aW5kZXg+ID0+IDxwYXJ0 Iz4sIC4uICkNCgkJJHBhcnRfbWFwID0gQXJyYXkoKTsNCgkJcmVzZXQoICR0aGlzLT51bmlx dWVfcGFydHMgKTsNCgkJd2hpbGUgKGxpc3QoJHBpLCAkcGFydF9zdHIpID0gZWFjaCgkdGhp cy0+dW5pcXVlX3BhcnRzKSkNCgkJew0KCQkJJHBvcyA9IHN0cnBvcygkdGV4dCwgJHBhcnRf c3RyKTsNCgkJCXdoaWxlICggJHBvcyAhPT0gRmFsc2UgKQ0KCQkJew0KCQkJCSRwYXJ0X21h cFskcG9zXSA9ICRwaTsNCgkJCQkkcG9zID0gc3RycG9zKCR0ZXh0LCAkcGFydF9zdHIsICRw b3MrMSk7DQoJCQl9DQoJCX0NCgkJa3NvcnQoICRwYXJ0X21hcCApOyAvLyBTb3J0IGJ5IHN0 cmluZyBpbmRleA0KDQoJCS8vIFRoZSBmb2xsb3dpbmcgY29kZSBkb2VzIHNldmVyYWwgdGhp bmdzIHNpbXVsdGFuZW91c2x5Og0KCQkvLyAgMSkgRGl2aWRlIHRoZSBpbmRpY2VzIGludG8g Z3JvdXBzIHVzaW5nIGdhcHMNCgkJLy8JICBsYXJnZXIgdGhhbiAkdGhpcy0+bWF4X2VyciBh cyBib3VuZGFyaWVzLg0KCQkvLyAgMikgVHJhbnNsYXRlIHRoZSBncm91cHMgaW50byBzdHJp bmdzIHNvIHRoYXQNCgkJLy8JICBwYXJ0IyAwID0gJ0EnLCBwYXJ0IyAxID0gJ0InIGV0Yy4g dG8gbWFrZQ0KCQkvLwkgIGEgbG93IHJlc29sdXRpb24gYXBwcm94aW1hdGUgc2VhcmNoIHBv c3NpYmxlIGxhdGVyDQoJCS8vICAzKSBTYXZlIHRoZSBzdHJpbmcgaW5kaWNlcyBpbiB0aGUg ZnVsbCBzdHJpbmcNCgkJLy8JICB0aGF0IGNvcnJlc3BvbmQgdG8gY2hhcmFjdGVycyBpbiB0 aGUgdHJhbnNsYXRlZCBzdHJpbmcuDQoJCS8vICA0KSBEaXNjYXJkIGdyb3VwcyAoPXBhcnQg c2VxdWVuY2VzKSB0aGF0IGFyZSB0b28NCgkJLy8JICBzaG9ydCB0byBjb250YWluIHRoZSBh cHByb3hpbWF0ZSBwYXR0ZXJuLg0KCQkvLyBUaGUgZm9ybWF0IG9mIHJlc3VsdGluZyBhcnJh eToNCgkJLy8gICBBcnJheSgNCgkJLy8JICBBcnJheSggIjx0cmFuc2xhdGUtc3RyaW5nPiIs DQoJCS8vCQkJIEFycmF5KCA8dHJhbnNsYXRlZC1pZHg+ID0+IDxmdWxsLWluZGV4PiwgLi4u ICkgKSwNCgkJLy8JICAuLi4gKQ0KCQkkdHJhbnNmID0gQXJyYXkoKTsNCgkJJHRyYW5zZl90 ZXh0ID0gIiI7DQoJCSR0cmFuc2ZfcG9zID0gQXJyYXkoKTsNCgkJJGxhc3RfZW5kID0gMDsN CgkJJGdyb3VwX2xlbiA9IDA7DQoJCXJlc2V0KCAkcGFydF9tYXAgKTsNCgkJd2hpbGUgKGxp c3QoJGksJHApID0gZWFjaCgkcGFydF9tYXApKQ0KCQl7DQoJCQlpZiAoICRpLSRsYXN0X2Vu ZCA+ICR0aGlzLT5tYXhfcGFydF9sZW4rJHRoaXMtPm1heF9lcnIgKQ0KCQkJew0KCQkJCWlm ICggJGdyb3VwX2xlbiA+PSAoJHRoaXMtPm5fcGFydHMtJHRoaXMtPm1heF9lcnIpKQ0KCQkJ CQkkdHJhbnNmW10gPSBBcnJheSggJHRyYW5zZl90ZXh0LCAkdHJhbnNmX3BvcyApOw0KDQoJ CQkJJHRyYW5zZl90ZXh0ID0gIiI7DQoJCQkJJHRyYW5zZl9wb3MgPSBBcnJheSgpOw0KCQkJ CSRncm91cF9sZW4gPSAwOw0KCQkJfQ0KDQoJCQkkdHJhbnNmX3RleHQgLj0gY2hyKCRwICsg b3JkKCJBIikpOw0KCQkJJHRyYW5zZl9wb3NbXSA9ICRpOw0KCQkJJGdyb3VwX2xlbisrOw0K CQkJJGxhc3RfZW5kID0gJGkgKyBzdHJsZW4oJHRoaXMtPnBhcnRzWyRwXSk7DQoJCX0NCgkJ aWYgKCBzdHJsZW4oICR0cmFuc2ZfdGV4dCApID49ICgkdGhpcy0+bl9wYXJ0cy0kdGhpcy0+ bWF4X2VycikpDQoJCQkkdHJhbnNmW10gPSBBcnJheSggJHRyYW5zZl90ZXh0LCAkdHJhbnNm X3BvcyApOw0KDQoJCXVuc2V0KCAkdHJhbnNmX3RleHQsICR0cmFuc2ZfcG9zICk7DQoNCgkJ aWYgKCBjdXJyZW50KCR0cmFuc2YpID09PSBGYWxzZSApDQoJCQlyZXR1cm4gQXJyYXkoKTsN Cg0KCQkvLyBGaWx0ZXIgdGhlIHJlbWFpbmluZyBncm91cHMgKCJhcHByb3hpbWF0ZSBhbmFn cmFtcyINCgkJLy8gb2YgdGhlIHBhdHRlcm4pIGFuZCBsZWF2ZSBvbmx5IHRoZSBvbmVzIHRo YXQgaGF2ZSBlbm91Z2gNCgkJLy8gcGFydHMgaW4gY29ycmVjdCBvcmRlci4gWW91IGNhbiB0 aGluayBvZiB0aGlzIGxhc3Qgc3RlcCBvZiB0aGUNCgkJLy8gYWxnb3JpdGhtIGFzIGEgKmxv dyByZXNvbHV0aW9uKiBhcHByb3hpbWF0ZSBzdHJpbmcgc2VhcmNoLg0KCQkvLyBUaGUgcmVz dWx0IGlzIGFuIGFycmF5IG9mIGNhbmRpZGF0ZSB0ZXh0IHNwYW5zIHRvIGJlIHNjYW5uZWQ6 DQoJCS8vICAgQXJyYXkoIEFycmF5KDxmdWxsLXN0YXJ0LWlkeD4sIDxmdWxsLWVuZC1pZHg+ KSwgLi4uICkNCgkJJHBhcnRfcG9zaXRpb25zID0gQXJyYXkoKTsNCgkJd2hpbGUgKGxpc3Qo LGxpc3QoJHN0ciwgJHBvc19tYXApKSA9IGVhY2goJHRyYW5zZikpDQoJCXsNCi8vCQkJcHJp bnQgInwkdHJhbnNmX3BhdHR8IC0gfCRzdHJ8XG4iOw0KCQkJJGxvcmVzX21hdGNoZXMgPSAk dGhpcy0+c2VhcmNoX3Nob3J0KCAkdGhpcy0+dHJhbnNmX3BhdHQsICR0aGlzLT5tYXhfZXJy LCAkc3RyICk7DQoJCQl3aGlsZSAobGlzdCgkdHJfZW5kLCApID0gZWFjaCgkbG9yZXNfbWF0 Y2hlcykpDQoJCQl7DQoJCQkJJHRyX3N0YXJ0ID0gbWF4KDAsICR0cl9lbmQgLSAkdGhpcy0+ bl9wYXJ0cyk7DQoJCQkJaWYgKCAkdHJfZW5kID49ICR0cl9zdGFydCApDQoJCQkJew0KCQkJ CQkkbWVkaWFuX3BvcyA9ICRwb3NfbWFwWyAoaW50KSgoJHRyX3N0YXJ0KyR0cl9lbmQpLzIp IF07DQoJCQkJCSRzdGFydCA9ICRtZWRpYW5fcG9zIC0gKCR0aGlzLT5wYXR0X2xlbi8yKzEp IC0gJHRoaXMtPm1heF9lcnIgLSAkdGhpcy0+bWF4X3BhcnRfbGVuOw0KCQkJCQkkZW5kID0g JG1lZGlhbl9wb3MgKyAoJHRoaXMtPnBhdHRfbGVuLzIrMSkgKyAkdGhpcy0+bWF4X2VyciAr ICR0aGlzLT5tYXhfcGFydF9sZW47DQoNCi8vCQkJCQlwcmludCAiIyIgLiBzdHJ0cihzdWJz dHIoICR0ZXh0LCAkc3RhcnQsICRlbmQtJHN0YXJ0ICksICJcblxyIiwgIiQkIikgLiAiI1xu IjsNCi8vCQkJCQlwcmludF9yKCAkdGhpcy0+c2VhcmNoX3Nob3J0KCAmJHRoaXMtPnBhdHQs ICR0aGlzLT5tYXhfZXJyLCAmJHRleHQsICRzdGFydCwgJGVuZC0kc3RhcnQgKSk7DQoNCgkJ CQkJJHBhcnRfcG9zaXRpb25zW10gPSBBcnJheSgkc3RhcnQsICRlbmQpOw0KCQkJCX0NCgkJ CX0NCgkJCXVuc2V0KCAkbG9yZXNfbWF0Y2hlcyApOw0KCQl9DQoJCXVuc2V0KCAkdHJhbnNm ICk7DQoNCgkJaWYgKCBjdXJyZW50KCRwYXJ0X3Bvc2l0aW9ucykgPT09IEZhbHNlICkNCgkJ CXJldHVybiBBcnJheSgpOw0KDQoJCS8vIFNjYW4gdGhlIGZpbmFsIGNhbmRpZGF0ZXMgYW5k IHB1dCB0aGUgbWF0Y2hlcyBpbiBhIG5ldyBhcnJheToNCgkJJG1hdGNoZXMgPSBBcnJheSgp Ow0KCQkkdGV4dF9sZW4gPSBzdHJsZW4oJHRleHQpOw0KCQl3aGlsZSAobGlzdCgsIGxpc3Qo JHN0YXJ0LCAkZW5kKSkgPSBlYWNoKCRwYXJ0X3Bvc2l0aW9ucykpDQoJCXsNCgkJCSRtID0g JHRoaXMtPnNlYXJjaF9zaG9ydCggJHRoaXMtPnBhdHQsICR0aGlzLT5tYXhfZXJyLCAkdGV4 dCwgJHN0YXJ0LCAkZW5kLSRzdGFydCwgJHRleHRfbGVuICk7DQoJCQl3aGlsZSAobGlzdCgk aSwgJGNvc3QpID0gZWFjaCgkbSkpDQoJCQkJJG1hdGNoZXNbJGldID0gJGNvc3Q7DQoJCX0N CgkJdW5zZXQoJHBhcnRfcG9zaXRpb25zKTsNCg0KCQlyZXR1cm4gJG1hdGNoZXM7DQoJfQ0K fQ0KfQ0KDQovKiBzbWRfZ2V0V29yZA0KDQpUYWtlcyBhIHN0cmluZyBhbmQgYW4gb2Zmc2V0 IGludG8gdGhhdCBzdHJpbmcgYW5kIHJldHVybnMgdGhlIG5lYXJlc3QgIndvcmQiIGJlZm9y ZSB0aGF0IG9mZnNldCBwb3NpdGlvbi4gSWYgdGhlIG9mZnNldCBpcyBub3Qgc3VwcGxpZWQg aXQgc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCB0aHVzIHJldHVy bmluZyB0aGUgZmlyc3Qgd29yZC4NCg0KVGFrZXMgMyBhcmdzOg0KIyBbKl0gVGhlICh1c3Vh bGx5IGxvb29uZykgc3RyaW5nIHRvIGxvb2sgaW4NCiMgWypdIFRoZSB3b3JkIHRvIGxvb2sg Zm9yDQojIFRoZSBvZmZzZXQgaW50byB0aGUgc3RyaW5nIGF0IHdoaWNoIHRvIHN0YXJ0IGxv b2tpbmcNCiovDQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfZ2V0V29yZCIpKSB7DQpm dW5jdGlvbiBzbWRfZ2V0V29yZCgkaGF5c3RhY2ssJHNlYXJjaHRlcm0sJG9mZnNldD0wKSB7 DQoJJG51bXdvcmRzID0gc3RyX3dvcmRfY291bnQoJHNlYXJjaHRlcm0pOw0KCSRoYXlzdGFj ayA9IHN0cnJldihzdWJzdHIoJGhheXN0YWNrLDAsJG9mZnNldCsxKSk7DQoJJHNwYWNlUG9z ID0gMTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgJG51bXdvcmRzOyAkaWR4KyspIHsNCgkJ JHNwYWNlUG9zID0gKHN0cnBvcygkaGF5c3RhY2ssICIgIiwgJHNwYWNlUG9zKSkrMTsNCgl9 DQoJcmV0dXJuIHRyaW0oc3RycmV2KHN1YnN0cigkaGF5c3RhY2ssIDAsICRzcGFjZVBvcykp KTsNCn0NCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjQ6ImhlbHAiO3M6MTA4NjY6IjxoMT5z bWRfZnV6enlfZmluZDwvaDE+CjxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzYWdlLCBi dWdzLCBmZWF0dXJlcyBldGMsIHBsZWFzZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBh dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MjUzNjciPnZpc2l0IHRoZSBmb3J1bSB0aHJl YWQ8L2E+LiBGb3Igb3RoZXIgc29mdHdhcmUgYnkgbWUsIG9yIHRvIG1ha2UgYSBkb25hdGlv biwgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc3ciPnNvZnR3YXJl IHBhZ2U8L2E+LjwvcD4KPHAgY2xhc3M9InJlcXVpcmVkIj5SZXF1aXJlcyA8YSBocmVmPSJo dHRwOi8vc3RlZmRhd3Nvbi5jb20vZG93bmxvYWRzL3NtZF9saWJfdjAuMzIudHh0Ij5zbWRf bGliIHYwLjMyPC9hPiB0byBiZSBpbnN0YWxsZWQgYW5kIGFjdGl2YXRlZC48L3A+PHA+Cjxo MiBpZD0iY29udGVudHMiPkNvbnRlbnRzPC9oMj4KPHVsPgo8bGk+PGEgaHJlZj0iI292ZXJ2 aWV3Ij5PdmVydmlldzwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI2F0dHMiPkF0dHJpYnV0ZXM8 L2E+Cjx1bD4KPGxpPjxhIGhyZWY9IiNzZWFyY2h0ZXJtIj5zZWFyY2hfdGVybTwvYT48L2xp Pgo8bGk+PGEgaHJlZj0iI21hdGNod2l0aCI+bWF0Y2hfd2l0aDwvYT48L2xpPgo8bGk+PGEg aHJlZj0iI3Nob3ciPnNob3c8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNzZWN0aW9uIj5zZWN0 aW9uPC9hPjwvbGk+CjxsaT48YSBocmVmPSIjY2F0ZWdvcnkiPmNhdGVnb3J5PC9hPjwvbGk+ CjxsaT48YSBocmVmPSIjc3ViY2F0cyI+c3ViY2F0czwvYT48L2xpPgo8bGk+PGEgaHJlZj0i I3N0YXR1cyI+c3RhdHVzPC9hPjwvbGk+CjxsaT48YSBocmVmPSIjdG9sZXJhbmNlIj50b2xl cmFuY2U8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNyZWZpbmUiPnJlZmluZTwvYT48L2xpPgo8 bGk+PGEgaHJlZj0iI2Nhc2VzZW5zaXRpdmUiPmNhc2Vfc2Vuc2l0aXZlPC9hPjwvbGk+Cjxs aT48YSBocmVmPSIjbWlud29yZGxlbmd0aCI+bWluX3dvcmRfbGVuZ3RoPC9hPjwvbGk+Cjxs aT48YSBocmVmPSIjbGltaXQiPmxpbWl0PC9hPjwvbGk+CjxsaT48YSBocmVmPSIjZm9ybSI+ Zm9ybTwvYT48L2xpPgo8bGk+PGEgaHJlZj0iI25vbWF0Y2hsYWJlbCI+bm9fbWF0Y2hfbGFi ZWw8L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNzdWdnZXN0bGFiZWwiPnN1Z2dlc3RfbGFiZWw8 L2E+PC9saT4KPGxpPjxhIGhyZWY9IiN0b29zaG9ydGxhYmVsIj50b29fc2hvcnRfbGFiZWw8 L2E+PC9saT4KPGxpPjxhIGhyZWY9IiNsYWJlbHRhZyI+bGFiZWx0YWc8L2E+PC9saT4KPC91 bD48L2xpPgo8bGk+PGEgaHJlZj0iI2V4YW1wbGUiPkV4YW1wbGUgdXNhZ2U8L2E+PC9saT4K PGxpPjxhIGhyZWY9IiNpc3N1ZXMiPktub3duIGlzc3VlczwvYT48L2xpPgo8bGk+PGEgaHJl Zj0iI2NoYW5nZWxvZyI+Q2hhbmdlbG9nPC9hPjwvbGk+CjxsaT48YSBocmVmPSIjY3JlZGl0 cyI+Q3JlZGl0czwvYT48L2xpPgo8L3VsPgo8aDIgaWQ9Im92ZXJ2aWV3Ij5PdmVydmlldzwv aDI+CjxwPkV2ZXIgd2FudGVkIFRYUCdzIHNlYXJjaCBmYWNpbGl0eSB0byBiZSBhIGxpdHRs ZSBtb3JlLCB3ZWxsLCBpbmFjY3VyYXRlPyBXYW50IG5vIG1vcmUuIERlZmluZSBob3cgZnV6 enkgeW91ciBzZWFyY2ggaXMsIHdoZXJlIHRvIGxvb2sgYW5kIGhvdyBtdWNoIG9mIGEgbnVk Z2UgdG8gb2ZmZXIgeW91ciBzaXRlIHZpc2l0b3JzIHdpdGggcGhhdCBwaGluZ2Vycy48L3A+ CjxwPlJlc3VsdHMgYXJlIG9yZGVyZWQgYnkgYXBwcm94aW1hdGUgcmVsZXZhbmN5IGFuZCBp dCdzIGF1dG9tYXRpY2FsbHkgY29udGV4dC1zZW5zaXRpdmUgYmVjYXVzZSB0aGUgcG9vbCBv ZiB3b3JkcyBpdCBjb21wYXJlcyBhZ2FpbnN0IGFyZSBmcm9tIHlvdXIgc2l0ZS4gT24gYSB6 b28gd2Vic2l0ZSwgc29tZW9uZSB0eXBpbmcgaW4gImxpbm8iIHdvbid0IGdldCBhcnRpY2xl cyBhYm91dCBmbG9vcmluZyBidXQgbW9yZSBsaWtlbHkgYXJ0aWNsZXMgYWJvdXQgbGlvbnMs IHdoaWNoIGlzIHdoYXQgdGhleSByZWFsbHkgd2FudGVkLiBXZSBob3BlLjwvcD4KCjxoMiBp ZD0iYXR0cyI+QXR0cmlidXRlczwvaDI+CjxoMyBpZD0ic2VhcmNodGVybSI+PGNvZGU+c2Vh cmNoX3Rlcm08L2NvZGU+PC9oMz4KPHA+V2hhdCB5b3Ugd291bGQgbGlrZSB0byBzZWFyY2gg Zm9yOiBlaXRoZXIgYSBmaXhlZCBzdHJpbmcgKHJhdGhlciBwb2ludGxlc3MhKSBvciAiP3Ei ICh0aGUgZGVmYXVsdCkuIE1heWJlIGluIGZ1dHVyZSBvdGhlciB0aGluZ3MgbGlrZSA/Y3Vz dG9tX2ZpZWxkIHNvIHlvdSBjYW4gZW1iZWQgdGhpcyBpbiBhbiBhcnRpY2xlIGFuZCBkbyBw c3VlZG8tcmVsYXRlZC1hcnRpY2xlIHNlYXJjaGVzPC9wPgoKPGgzIGlkPSJtYXRjaHdpdGgi Pjxjb2RlPm1hdGNoX3dpdGg8L2NvZGU+PC9oMz4KPHA+V2hlcmUgeW91IHdvdWxkIGxpa2Ug dG8gbG9vayBmb3IgYSBtYXRjaCAoaS5lLiB3aGljaCBhcnRpY2xlIGZpZWxkcykuIERlZmlu ZSB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGxvb2sgaW4gKGN1cnJlbnRseSBvbmx5IGFydGlj bGUgaXMgc3VwcG9ydGVkKSBmb2xsb3dlZCBieSBhIGNvbG9uLCB0aGVuIGEgc2VtaS1jb2xv biBzZXBhcmF0ZWQgbGlzdCBvZiBwbGFjZXMgdG8gbG9vazogPGNvZGU+bWF0Y2hfd2l0aD0i YXJ0aWNsZTprZXl3b3Jkcztib2R5O2V4Y2VycHQiPC9jb2RlPi4gT3B0aW9ucyBhcmUga2V5 d29yZHMsIGJvZHksIGV4Y2VycHQsIGNhdGVnb3J5MSwgY2F0ZWdvcnkyLCBzZWN0aW9uLCBp ZCwgYXV0aG9yaWQsIHRpdGxlLCBjdXN0b21fMSwgY3VzdG9tXzIsIGV0Yy4gRGVmYXVsdCBp cyBhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdDwvcD4KCjxoMyBpZD0ic2hvdyI+PGNv ZGU+c2hvdzwvY29kZT48L2gzPgo8cD5XaGF0IHRvIGRpc3BsYXk6IHdoZXRoZXIgdG8gbGlz dCB0aGUgY2xvc2VzdCBtYXRjaGluZyBhcnRpY2xlcywgY2xvc2VzdCBtYXRjaGluZyBzZWFy Y2ggdGVybXMsIG9yIGJvdGguIENob2ljZXMgYXJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qg b2YgZWl0aGVyIDxjb2RlPmFydGljbGVzPC9jb2RlPiBvciA8Y29kZT53b3JkczwvY29kZT4u IERlZmF1bHQ6ICJ3b3JkcywgYXJ0aWNsZXMiPC9wPgoKPGgzIGlkPSJzZWN0aW9uIj48Y29k ZT5zZWN0aW9uPC9jb2RlPjwvaDM+CjxwPkxpbWl0IHlvdXIgc2VhcmNoIHJlc3VsdHMgdG8g YSBwYXJ0aWN1bGFyIHNlY3Rpb24gb3IgdGhyZWU7IGdpdmUgYSBjb21tYS1zZXBhcmF0ZWQg bGlzdC4gWW91IGNhbiB1c2UgP3MgZm9yIHRoZSBjdXJyZW50IHNlY3Rpb24gb3IgIXMgZm9y IGFueXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBzZWN0aW9uLCBvciB1c2UgISBhbmQgdGhl IG5hbWUgb2YgYSBzcGVjaWZpYyBzZWN0aW9uIHRvIGV4Y2x1ZGUgaXQuIERlZmF1bHQ6IGVt cHR5ICh0aGUgd2hvbGUgc2l0ZSkuPC9wPgoKPGgzIGlkPSJjYXRlZ29yeSI+PGNvZGU+Y2F0 ZWdvcnk8L2NvZGU+PC9oMz4KPHA+TGltaXQgeW91ciBzZWFyY2ggcmVzdWx0cyB0byBhIHBh cnRpY3VsYXIgY2F0ZWdvcnk7IGdpdmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gWW91IGNh biB1c2UgP2MgZm9yIHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeSBvciAhYyBmb3IgYW55 IGV4Y2VwdCB0aGUgY3VycmVudCBnbG9iYWwgY2F0ZWdvcnksIG9yIHVzZSAhIGFuZCB0aGUg bmFtZSBvZiBhIHNwZWNpZmljIGNhdGVnb3J5IHRvIGV4Y2x1ZGUgaXQuIERlZmF1bHQ6IGVt cHR5IChhbGwgY2F0ZWdvcmllcykuPC9wPgoKPGgzIGlkPSJzdWJjYXRzIj48Y29kZT5zdWJj YXRzPC9jb2RlPjwvaDM+CjxwPlNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIHNlYXJjaGluZyBv ZiBzdWItY2F0ZWdvcmllcyB1bmRlciB0aGUgZ2l2ZW4gY2F0ZWdvcmllcy4gRGVmYXVsdDog dW51c2VkLjwvcD4KCjxoMyBpZD0ic3RhdHVzIj48Y29kZT5zdGF0dXM8L2NvZGU+PC9oMz4K PHA+UmVzdHJpY3RzIHRoZSBzZWFyY2ggdG8gcGFydGljdWxhciB0eXBlcyBvZiBkb2N1bWVu dCBzdGF0dXMuIENob29zZSBmcm9tIGRyYWZ0LCBoaWRkZW4sIHBlbmRpbmcsIGxpdmUsIHN0 aWNreS4gRGVmYXVsdDogImxpdmUsIHN0aWNreSIuPC9wPgoKPGgzIGlkPSJ0b2xlcmFuY2Ui Pjxjb2RlPnRvbGVyYW5jZTwvY29kZT48L2gzPgo8cD5Ib3cgZnV6enkgdGhlIHNlYXJjaCBp cyBhbmQgaG93IGxvbmcgdGhlIG1pbmltdW0gc2VhcmNoIHRlcm0gaXMgYWxsb3dlZCB0byBi ZS4gQW4gaW50ZWdlciBmcm9tIDAgKHZlcnkgY2xvc2UgbWF0Y2gsIGFsbG93cyBzaG9ydCBz ZWFyY2ggd29yZHMpIHRvIDUgKHByZXR0eSBtdWNoIG5vdGhpbmcgbGlrZSB3aGF0IHlvdSBz ZWFyY2hlZCBmb3IgYW5kIHNlYXJjaCB3b3JkcyBtdXN0IHRoZW4gYmUgbG9uZ2VyLCByb3Vn aGx5ID43IGNoYXJhY3RlcikuIFByYWN0aWNhbCB2YWx1ZXMgYXJlIHVzdWFsbHkgMCwgMSwg MiAodGhlIGRlZmF1bHQpLCBvciBwb3NzaWJseSAzLjwvcD4KCjxoMyBpZD0icmVmaW5lIj48 Y29kZT5yZWZpbmU8L2NvZGU+PC9oMz4KPHA+U3dpdGNoIG9uIHNvdW5kZXggYW5kL29yIG1l dGFwaG9uZSBzdXBwb3J0IGZvciBjbG9zZXIgbWF0Y2hpbmcgKHVzdWFsbHkgb25seSBvZiB1 c2UgaW4gRW5nbGlzaCkuIFVzZSA8Y29kZT5zb3VuZGV4PC9jb2RlPiBvciA8Y29kZT5tZXRh cGhvbmU8L2NvZGU+IG9yIGJvdGggc2VwYXJhdGVkIGJ5IGEgY29tbWEgdG8gc3dpdGNoIHRo ZW0gb24uIEJvdGggb24gYnkgZGVmYXVsdC48L3A+Cgo8aDMgaWQ9ImNhc2VzZW5zaXRpdmUi Pjxjb2RlPmNhc2Vfc2Vuc2l0aXZlPC9jb2RlPjwvaDM+CjxwPkRvZXMgd2hhdCBpdCBzYXlz IG9uIHRoZSB0aW4uIDE9Y2FzZSBzZW5zaXRpdmUgc2VhcmNoLCAwPW5vdC4gRGVmYXVsdDog MDwvcD4KCjxoMyBpZD0ibWlud29yZGxlbmd0aCI+PGNvZGU+bWluX3dvcmRfbGVuZ3RoPC9j b2RlPjwvaDM+CjxwPlRoZSBtaW5pbXVtIHdvcmQgbGVuZ3RoIHlvdSB3YW50IHJldHVybmlu Zy4gRGVmYXVsdDogNDwvcD4KCjxoMyBpZD0ibGltaXQiPjxjb2RlPmxpbWl0PC9jb2RlPjwv aDM+CjxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JkcyBhbmQvb3IgYXJ0aWNsZXMgdG8g ZGlzcGxheS4gR2l2ZSBpdCBhIHNpbmdsZSBpbnRlZ2VyIGFuZCBpdCBsaW1pdHMgYm90aCB0 byB0aGUgc2FtZSB2YWx1ZS4gU3BlY2lmeWluZyA8Y29kZT5hcnRpY2xlczo1PC9jb2RlPiB3 b3VsZCByZW1vdmUgYW55IGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc2Vh cmNoIHdvcmRzIG9mZmVyZWQgYnV0IHdvdWxkIGxpbWl0IHRoZSBhcnRpY2xlcyB0byBhIG1h eGltdW0gb2YgNS4gU2ltaWxhcmx5LCA8Y29kZT53b3Jkczo0PC9jb2RlPiB3b3VsZCByZW1v dmUgdGhlIGFydGljbGUgbGltaXQgYW5kIG9ubHkgc2hvdyBhIG1heGltdW0gb2YgNCBhbHRl cm5hdGl2ZSB3b3Jkcy4gQm90aCBvZiB0aGVzZSBhcmUgc3ViamVjdCB0byB0aGVpciByZXNw ZWN0aXZlIDxhIGhyZWY9IiNzaG93Ij5zaG93PC9hPiBvcHRpb25zIGJlaW5nIHNldCBvZiBj b3Vyc2UuIERlZmF1bHQ6IDxjb2RlPndvcmRzOjUsIGFydGljbGVzOjEwPC9jb2RlPjwvcD4K CjxoMyBpZD0iZm9ybSI+PGNvZGU+Zm9ybTwvY29kZT48L2gzPgo8cD5UaGUgVFhQIGZvcm0g dG8gb3V0cHV0IHRoZSBsaXN0IG9mIGFydGljbGVzIGluLiBEZWZhdWx0OiBzZWFyY2hfcmVz dWx0cy4gTm90ZSB0aGF0ICZsdDt0eHA6c2VhcmNoX3Jlc3VsdF9leGNlcnB0IC8mZ3Q7IGlz IG5vdyBob25vdXJlZCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLCBpLmUuIGlmIHRoZSBjbG9z ZXN0IHdvcmRzIGFyZSBmb3VuZCBpbiB0aGUga2V5d29yZCwgYm9keSBvciBleGNlcnB0IGZp ZWxkcy4gSWYgdGhleSBhcmUgZm91bmQgaW4gYW55IG90aGVyIGxvY2F0aW9uIChlLmcuIGN1 c3RvbV8xKSB0aGUgYXJ0aWNsZSB0aXRsZSB3aWxsIGJlIHJldHVybmVkIGJ1dCB0aGUgc2Vh cmNoX3Jlc3VsdF9leGNlcnB0IHdpbGwgYmUgZW1wdHkuIFRoaXMgaXMgYSBsaW1pdGF0aW9u IG9mIHNlYXJjaF9yZXN1bHRfZXhjZXJwdCwgbm90IHRoZSBwbHVnaW4gZGlyZWN0bHkuPC9w PgoKPGgzIGlkPSJub21hdGNobGFiZWwiPjxjb2RlPm5vX21hdGNoX2xhYmVsPC9jb2RlPjwv aDM+CjxwPlRoZSBwaHJhc2UgdG8gZGlzcGxheSB3aGVuIG5vIG1hdGNoZXMgKG1heWJlIG5v dCBldmVuIGZ1enp5IG9uZXMhKSBhcmUgZm91bmQuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3Ry aW5nICdub19tYXRjaCcuIFVzZSA8Y29kZT5ub19tYXRjaF9sYWJlbD0iIjwvY29kZT4gdG8g dHVybiBpdCBvZmYuPC9wPgoKPGgzIGlkPSJzdWdnZXN0bGFiZWwiPjxjb2RlPnN1Z2dlc3Rf bGFiZWw8L2NvZGU+PC9oMz4KPHA+VGhlIHBocmFzZSB0byBkaXNwbGF5IGltbWVkaWF0ZWx5 IHByaW9yIHRvIHNob3dpbmcgY2xvc2UtbWF0Y2hpbmcgYXJ0aWNsZXMvd29yZHMuIERlZmF1 bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdzdWdnZXN0Jy4gVXNlIDxjb2RlPnN1Z2dlc3RfbGFi ZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9wPgoKPGgzIGlkPSJ0b29zaG9ydGxh YmVsIj48Y29kZT50b29fc2hvcnRfbGFiZWw8L2NvZGU+PC9oMz4KPHA+U2VhcmNoZXMgb2Yg dW5kZXIgYWJvdXQgMyBjaGFyYWN0ZXJzIChzb21ldGltZXMgbW9yZSBkZXBlbmRpbmcgb24g eW91ciBjb250ZW50KSBhcmUgdG9vIHNob3J0IGZvciBhbnkgcmVhc29uYWJsZSBmdXp6aW5l c3MgdG8gYmUgYXBwbGllZC4gVGhpcyBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiB0aGF0IGNp cmN1bXN0YW5jZS4gRGVmYXVsdHMgdG8gdGhlIE1MUCBzdHJpbmcgdG9vX3Nob3J0LiBVc2Ug PGNvZGU+dG9vX3Nob3J0X2xhYmVsPSIiPC9jb2RlPiB0byBzd2l0Y2ggaXQgb2ZmLjwvcD4K CjxoMyBpZD0ibGFiZWx0YWciPjxjb2RlPmxhYmVsdGFnPC9jb2RlPjwvaDM+CjxwPlRoZSBI VE1MIHRhZyB0byB3cmFwIGFueSBsYWJlbCBpbi4gRGVmYXVsdHMgdG8gInAiLjwvcD4KCjxo MiBpZD0iZXhhbXBsZSI+RXhhbXBsZSB1c2FnZTwvaDI+CjxwPlNpbmNlIGl0J3Mgbm90IGEg ZGlyZWN0IHJlcGxhY2VtZW50IGZvciB0aGUgYnVpbHQtaW4gc2VhcmNoIChUWFAgd2lsbCBj b21wbGFpbiBpZiB5b3UgZG8gbm90IGluY2x1ZGUgYW4gYXJ0aWNsZSB3aXRoaW4gYW4gaWZf c2VhcmNoIHRhZykgdGhlIGJlc3Qgd2F5IHRvIHVzZSBpdCBpcyBpbiBjb25qdW5jdGlvbiB3 aXRoIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBo cD9pZD0xNDE2MyI+Y2hoX2lmX2RhdGE8L2E+IGluIGEgcGFnZSBsaWtlIHRoaXM6PC9wPgo8 cHJlPgombHQ7dHhwOmlmX3NlYXJjaCZndDsKICAmbHQ7dHhwOmNoaF9pZl9kYXRhJmd0Owog ICAgJmx0O2RsIGNsYXNzPSJleGNlcnB0cyImZ3Q7CiAgICAgICZsdDt0eHA6YXJ0aWNsZSBs aW1pdD0iOCIgbGlzdGZvcm09ImV4Y2VycHRzIiAvJmd0OwogICAgJmx0Oy9kbCZndDsKICAm bHQ7dHhwOmVsc2UgLyZndDsKICAgICZsdDtkbCBjbGFzcz0iZXhjZXJwdHMiJmd0OwogICAg ICAmbHQ7dHhwOnNtZF9mdXp6eV9maW5kIGZvcm09ImV4Y2VycHRzIiAvJmd0OwogICAgJmx0 Oy9kbCZndDsKICAmbHQ7L3R4cDpjaGhfaWZfZGF0YSZndDsKJmx0Oy90eHA6aWZfc2VhcmNo Jmd0Owo8L3ByZT4KPHA+U28gaW4gdGhlIGNhc2UgYW4gZXhhY3QgdGVybSBpcyBmb3VuZCwg dGhlIG5vcm1hbCBUWFAgc2VhcmNoIGlzIGNhbGxlZC4gSWYgYW4gZXhhY3Qgc2VhcmNoIHRl cm0gaXMgbm90IGZvdW5kLCBzbWRfZnV6enlfZmluZCB3aWxsIGhhdmUgYSBnby48L3A+Cgo8 aDIgaWQ9Imlzc3VlcyI+S25vd24gaXNzdWVzPC9oMj4KPHA+SGVyZSdzIGEgbGlzdCBvZiBj dXJyZW50bHkga25vd24gZm9pYmxlcyB3aXRoIHRoZSBwbHVnaW4uIElmIGFueW9uZSBjYW4g c2hlZCBhbnkgbGlnaHQgb24gZml4ZXMgZm9yIHRoZXNlLCBwbGVhc2UgPGEgaHJlZj0iaHR0 cDovL3N0ZWZkYXdzb24uY29tL2NvbW1lbnRGb3JtIj5zZW5kIHRoZW0gb3ZlcjwvYT4sIHRo YW5rcy48L3A+Cjx1bD4KPGxpPlNlYXJjaGluZyBmb3IgYSA8YSBocmVmPSJodHRwOi8vZm9y dW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTE0NTEzNSNwMTQ1MTM1Ij53 b3JkIHdpdGggYW4gYXBvc3Ryb3BoZTwvYT4gaW4gaXQgY2F1c2VzIG9kZCBjaGFyYWN0ZXIg ZW5jb2RpbmcuPC9saT4KPGxpPlNlYXJjaGluZyBmb3IgPGEgaHJlZj0iaHR0cDovL2ZvcnVt LnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0xNTUwMjQjcDE1NTAyNCI+bXVs dGlwbGUgd29yZHM8L2E+IGNhbiBsZWFkIHRvIG9kZCByZXN1bHRzLjwvbGk+CjxsaT5Tb21l dGltZXMgdGhlcmUgYXJlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20v dmlld3RvcGljLnBocD9waWQ9MTYyNjc3I3AxNjI2NzciPm9kZCBhbHRlcm5hdGl2ZSBzdWdn ZXN0aW9uczwvYT4gdGhyb3duIHVwIHdoZXJlIGl0IHdpbGwgcGljayBsb25nZXIsIG9yIHBh cnQtd29yZHMgb3ZlciBvbmVzIHRoYXQgd2Ugd291bGQgYXNzdW1lIHRvIGJlICJiZXR0ZXIi IHNlbGVjdGlvbnMuIFRoaXMgaXMgcHJvYmFibHkgYSBmYXVsdCB3aXRoIHNtZF9nZXRXb3Jk IChpbiBzbWRfbGliKSBidXQgSSBoYXZlbid0IG5haWxlZCBpdCBkb3duIHlldC48L2xpPgo8 L3VsPgoKPGgyIGlkPSJjaGFuZ2Vsb2ciPkNoYW5nZWxvZzwvaDI+Cjx1bD4KPGxpPjI2IE1h ciAwNyB8IDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9kb3dubG9hZHMvc21kX2Z1 enp5X2ZpbmRfdjAuMDEudHh0Ij52MC4wMTwvYT4gfCBJbml0aWFsIHB1YmxpYyBiZXRhPC9s aT4KPGxpPjMxIE1hciAwNyB8IDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9kb3du bG9hZHMvc21kX2Z1enp5X2ZpbmRfdjAuMDIudHh0Ij52MC4wMjwvYT4gfCBGaXhlZCBjYXNl IHNlbnNpdGl2aXR5LiBTcGVkIHVwIGFuZCBpbXByb3ZlZCB3b3JkbGlzdCBnZW5lcmF0aW9u LiBBZGRlZCByZWZpbmUgYXR0cmlidXRlIHRvIHN3aXRjaCBvZmYgc291bmRleC9tZXRhcGhv bmUgaWYgcmVxdWlyZWQ8L2xpPgo8bGk+MDYgQXVnIDA3IHwgPGEgaHJlZj0iaHR0cDovL3N0 ZWZkYXdzb24uY29tL2Rvd25sb2Fkcy9zbWRfZnV6enlfZmluZF92MC4wMy50eHQiPnYwLjAz PC9hPiB8IEZpeGVkOiBtdWx0aS13b3JkIHNlYXJjaGluZyAoc21kX2dldFdvcmQgYnVnKSBh bmQgc2VhcmNoX3Jlc3VsdF9leGNlcnB0LiBBZGRlZCBjYXRlZ29yeSBhbmQgc3RhdHVzIHN1 cHBvcnQuPC9saT4KPGxpPjMwIERlYyAwNyB8IDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29u LmNvbS9kb3dubG9hZHMvc21kX2Z1enp5X2ZpbmRfdjAuMS56aXAiPnYwLjE8L2E+IHwgT2Zm aWNpYWwgZmlyc3QgcmVsZWFzZS4gQWRkZWQgbGFiZWx0YWcgYW5kIGN1c3RvbSBmaWVsZCBz dXBwb3J0LiBGaXhlZCBiYWQgY291bnRpbmcgaW4gbGltaXQgYXR0cmlidXRlICh0aGFua3Mg RWxzKTwvbGk+CjxsaT4yMyBKYW4gMDggfCA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5j b20vZG93bmxvYWRzL3NtZF9mdXp6eV9maW5kX3YwLjExLnR4dCI+djAuMTE8L2E+IHwgRml4 ZWQ6IE1MUGluZyBzb21lIHN0cmluZ3MgYnJva2UgdGhlIHBsdWdpbiAodGhhbmtzIEVscyk8 L2xpPgo8bGk+MDEgQXByIDA4IHwgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2Rv d25sb2Fkcy9zbWRfZnV6enlfZmluZF92MC4xMi50eHQiPnYwLjEyPC9hPiBbIDxhIGhyZWY9 Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9kb3dubG9hZHMvc21kX2Z1enp5X2ZpbmRfdjAuMTJf emlwLnR4dCI+Z3ppcHBlZDwvYT4gXSB8IE1vdmVkIHNvbWUgc21kX2xpYiBmdW5jdGlvbnMg dG8gdGhlIHBsdWdpbi4gUmVxdWlyZXMgc21kX2xpYl92MC4zMjwvbGk+CjwvdWw+Cgo8aDIg aWQ9ImNyZWRpdHMiPkNyZWRpdHM8L2gyPgo8cD5UaGlzIHBsdWdpbiB3b3VsZG4ndCBoYXZl IGV4aXN0ZWQgd2l0aG91dCB0aGUgb3JpZ2luYWwgPGEgaHJlZj0iaHR0cDovL2Vsb25lbi5p a2kuZmkvY29kZS9taXNjLW5vdGVzL2FwcHItc2VhcmNoLXBocC9pbmRleC5odG1sIj5GdXp6 eSBGaW5kIGFsZ29yaXRobSBieSBKYXJubyBFbG9uZW48L2E+LiBBbGwga3Vkb3MgdG8gaGlt LCBJIGp1c3Qgd2lzaCBJIHVuZGVyc3Rvb2QgaG93IHRoZSBjb2RlIHdvcmtlZCA6LSkgQWxz bywgZXh0ZW5kZWQgdGhhbmtzIHRvIHRoZSBiZXRhIHRlc3RlcnMsIGVzcGVjaWFsbHkgRWxz IExlcGVsYWFycyBmb3IgZmVlZGJhY2sgYW5kIHVuZW5kaW5nIHBhdGllbmNlIGR1cmluZyBk ZXZlbG9wbWVudC4gQW5kIG9mIGNvdXJzZSBUZWFtIFRleHRQYXR0ZXJuIGZvciB0aGUgYmVz dCBDTVMgb24gdGhlIHBsYW5ldC48L3A+CjwhLS0gLS0tIEJFR0lOIFBMVUdJTiBDU1MgLS0t IC0tPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpjb2RlIHtjb2xvcjogIzIwNDY2Zn0KcHJl IHtwYWRkaW5nOiAwLjVlbSAxZW07IGJhY2tncm91bmQ6ICNlZWU7IGJvcmRlcjogMXB4IGRh c2hlZCAjY2NjO30KaDEsIGgyLCBoMywgaDMgY29kZSB7Zm9udC1mYW1pbHk6IHNhbnMtc2Vy aWY7IGZvbnQtd2VpZ2h0OiBib2xkO30KaDEsIGgyLCBoMyB7bWFyZ2luLWxlZnQ6IC0xZW07 fQpoMiwgaDMge21hcmdpbi10b3A6IDJlbTt9CmgxIHtmb250LXNpemU6IDNlbTt9CmgyIHtm b250LXNpemU6IDJlbTt9CmgzIHtmb250LXNpemU6IDEuNWVtO30KbGkgYSBjb2RlIHtmb250 LXdlaWdodDogbm9ybWFsO30KLnJlcXVpcmVkLCAud2FybmluZyB7Y29sb3I6cmVkO30KI2Vn dGFiIHRkLCNlZ3RhYiB0aCB7cGFkZGluZzouN2VtOyBib3JkZXI6MXB4IHNvbGlkICM4ODg7 dGV4dC1hbGlnbjpjZW50ZXI7fQo8L3N0eWxlPgo8IS0tIC0tLSBFTkQgUExVR0lOIENTUyAt LS0gLS0+CiI7czozOiJtZDUiO3M6MzI6IjU0NDRlYmI3ZDUyYWQ3Y2Y5NTYzNzE3MGY0ZGFl ZWY4Ijt9