# Name: smd_fuzzy_find v0.21 # Type: Client side plugin # Offers alternative spellings and/or close-matching articles from search terms. # Author: Stef Dawson # URL: http://stefdawson.com # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjE0OiJzbWRfZnV6enlfZmluZCI7czo2OiJhdXRob3IiO3M6 MTE6IlN0ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vc3RlZmRh d3Nvbi5jb20iO3M6NzoidmVyc2lvbiI7czo0OiIwLjIxIjtzOjExOiJkZXNjcmlwdGlvbiI7 czo3ODoiT2ZmZXJzIGFsdGVybmF0aXZlIHNwZWxsaW5ncyBhbmQvb3IgY2xvc2UtbWF0Y2hp bmcgYXJ0aWNsZXMgZnJvbSBzZWFyY2ggdGVybXMuIjtzOjQ6ImNvZGUiO3M6MjI4Njg6InJl cXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQoNCi8vIE1MUCBzdXBwb3J0DQpnbG9iYWwgJHNt ZF9mdXp6TGFuZzsNCiRzbWRfZnV6el9zdHIgPSBhcnJheSgNCgkndG9vX3Nob3J0JyA9PiAn VGhlIHRleHQgeW91IGFyZSBzZWFyY2hpbmcgZm9yIGlzIHByb2JhYmx5IHRvbyBzaG9ydC4g VHJ5IGEgbG9uZ2VyIHdvcmQuICcsDQoJJ25vX21hdGNoJyA9PiAnU29ycnksIG5vIHJlc3Vs dHMgbWF0Y2hlZCAie3NlYXJjaF90ZXJtfSIgZXhhY3RseS4gJywNCgknc3VnZ2VzdCcgPT4g J0hlcmUgYXJlIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHt0aGluZ2llc30gdGhhdCBtYXkgaGVs cCB5b3UgZmluZCB3aGF0IHlvdSBhcmUgbG9va2luZyBmb3I6ICcsDQoJJ3N1Z2dlc3Rfam9p bicgPT4gJ2FuZCcsDQoJJ2FydGljbGVzJyA9PiAnYXJ0aWNsZXMnLA0KCSd3b3JkcycgPT4g J3dvcmRzJywNCik7DQokc21kX2Z1enpMYW5nID0gbmV3IHNtZF9NTFAoJ3NtZF9mdXp6eV9m aW5kJywgJ3NtZF9mdXp6JywgJHNtZF9mdXp6X3N0cik7DQoNCmZ1bmN0aW9uIHNtZF9mdXp6 eV9maW5kKCRhdHRzLCAkdGhpbmc9JycpIHsNCglnbG9iYWwgJHByZXRleHQsICRzbWRfZnV6 ekxhbmcsICRwcmVmczsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdmb3JtJyA9PiAn c2VhcmNoX3Jlc3VsdHMnLA0KCQknc2VjdGlvbicgPT4gJycsDQoJCSdjYXRlZ29yeScgPT4g JycsDQoJCSdzdWJsZXZlbCcgPT4gJzAnLA0KCQknc2VhcmNoX3Rlcm0nID0+ICc/cScsDQoJ CSdtYXRjaF93aXRoJyA9PiAnJywNCgkJJ3RvbGVyYW5jZScgPT4gJzInLA0KCQknbWluX3dv cmRfbGVuZ3RoJyA9PiAnNCcsDQoJCSdkZWxpbScgPT4gJywnLA0KCQknbGltaXQnID0+ICcn LA0KCQknY2FzZV9zZW5zaXRpdmUnID0+ICcwJywNCgkJJ3JlZmluZScgPT4gJycsDQoJCSdz aG93JyA9PiAnJywNCgkJJ3N0YXR1cycgPT4gJycsDQoJCSdkZWJ1ZycgPT4gJzAnLA0KCQkn bm9fbWF0Y2hfbGFiZWwnID0+ICcjJywNCgkJJ3N1Z2dlc3RfbGFiZWwnID0+ICcjJywNCgkJ J3Rvb19zaG9ydF9sYWJlbCcgPT4gJyMnLA0KCQknbGFiZWx0YWcnID0+ICdwJywNCgkpLCAk YXR0cykpOw0KDQoJLy8gUHJvY2VzcyBkZWZhdWx0czsgbW9zdCBjYW4ndCBiZSBzZXQgaW4g bEF0dHMoKSBiZWNhdXNlIG9mIHRoZSBjdXN0b20gZGVsaW1pdGVyDQoJJG1hdGNoX3dpdGgg PSBlbXB0eSgkbWF0Y2hfd2l0aCkgPyAiYXJ0aWNsZToiIC4gaW1wbG9kZSgiOyIsIGRvX2xp c3QoJHByZWZzWydzZWFyY2hhYmxlX2FydGljbGVfZmllbGRzJ10pKSA6ICRtYXRjaF93aXRo Ow0KCSRsaW1pdCA9ICgkbGltaXQpID8gJGxpbWl0IDogIndvcmRzOjUiIC4kZGVsaW0uICJh cnRpY2xlczoxMCI7DQoJJHJlZmluZSA9ICgkcmVmaW5lKSA/ICRyZWZpbmUgOiAibWV0YXBo b25lIiAuJGRlbGltLiAic291bmRleCI7DQoJJHNob3cgPSAoJHNob3cpID8gJHNob3cgOiAi d29yZHMiIC4kZGVsaW0uICJhcnRpY2xlcyI7DQoJJHN0YXR1cyA9ICgkc3RhdHVzKSA/ICRz dGF0dXMgOiAibGl2ZSIgLiRkZWxpbS4gInN0aWNreSI7DQoNCgkkcmVmaW5lQWxsb3cgPSBh cnJheSgibWV0YXBob25lIiwgInNvdW5kZXgiKTsNCgkkc2hvd0FsbG93ID0gYXJyYXkoImFy dGljbGVzIiwgIndvcmRzIik7DQoJJGNvbE5hbWVzID0gYXJyYXkoJ0tleXdvcmRzJyA9PiAi YXJ0aWNsZTprZXl3b3JkcyIsDQoJCQkJCQkJJ0JvZHknID0+ICJhcnRpY2xlOmJvZHkiLA0K CQkJCQkJCSdFeGNlcnB0JyA9PiAiYXJ0aWNsZTpleGNlcnB0IiwNCgkJCQkJCQknQ2F0ZWdv cnkxJyA9PiAiYXJ0aWNsZTpjYXRlZ29yeTEiLA0KCQkJCQkJCSdDYXRlZ29yeTInID0+ICJh cnRpY2xlOmNhdGVnb3J5MiIsDQoJCQkJCQkJJ1NlY3Rpb24nID0+ICJhcnRpY2xlOnNlY3Rp b24iLA0KCQkJCQkJCSdJRCcgPT4gImFydGljbGU6aWQiLA0KCQkJCQkJCSdBdXRob3JJRCcg PT4gImFydGljbGU6YXV0aG9yaWQiLA0KCQkJCQkJCSdUaXRsZScgPT4gImFydGljbGU6dGl0 bGUiLA0KCQkJCQkJCSdtZXNzYWdlJyA9PiAiY29tbWVudHM6bWVzc2FnZSIsDQoJCQkJCQkJ J2VtYWlsJyA9PiAiY29tbWVudHM6ZW1haWwiLA0KCQkJCQkJCSduYW1lJyA9PiAiY29tbWVu dHM6bmFtZSIsDQoJCQkJCQkJJ3dlYicgPT4gImNvbW1lbnRzOndlYiIsDQoJCQkJCQkJKTsN Cg0KCSRwbGFjZXMgPSBhcnJheSgndGV4dHBhdHRlcm4nID0+ICJhcnRpY2xlIiwgJ3R4cF9k aXNjdXNzJyA9PiAiY29tbWVudHMiKTsNCgkkY2xhdXNlID0gYXJyYXkoKTsNCgkkcmVmaW5l TGlzdCA9IGFycmF5KCk7DQoJJGRiVGFibGVzID0gYXJyYXkoKTsNCgkkZGJGaWVsZHMgPSBh cnJheSgpOw0KDQoJLy8gRXhwYW5kIHRoZSBhcmdzIGluIGNhc2UgdGhleSdyZSA/IG9yICEg c2hvcnRjdXRzLCBhbmQgZG8gc29tZSB2YWxpZGl0eSBjaGVja2luZy4NCgkkc2VhcmNoX3Rl cm0gPSBzbWRfZG9MaXN0KCRzZWFyY2hfdGVybSwgZmFsc2UsICIiLCBmYWxzZSwgJGRlbGlt KTsNCgkkc2VhcmNoX3Rlcm0gPSAkc2VhcmNoX3Rlcm1bMF1bMF07DQoJaWYgKCRkZWJ1ZyA+ IDEpIHsNCgkJZWNobyAiKysgU0VBUkNIIFRFUk0gKysiOw0KCQlkbXAoJHNlYXJjaF90ZXJt KTsNCgl9DQoJJHJlZmluZSA9IGRvX2xpc3QoJHJlZmluZSwgJGRlbGltKTsNCglmb3IgKCRp ZHggPSAwOyAkaWR4IDwgY291bnQoJHJlZmluZSk7ICRpZHgrKykgew0KCQlpZiAoaW5fYXJy YXkoJHJlZmluZVskaWR4XSwgJHJlZmluZUFsbG93KSkgew0KCQkJJHJlZmluZUxpc3RbJGlk eF0gPSAkcmVmaW5lWyRpZHhdOw0KCQl9DQoJfQ0KCSRtZXRhX3NlYXJjaCA9IChpbl9hcnJh eSgibWV0YXBob25lIiwgJHJlZmluZUxpc3QpKSA/IG1ldGFwaG9uZSgkc2VhcmNoX3Rlcm0p IDogIiI7DQoJJHNvdW5kX3NlYXJjaCA9IChpbl9hcnJheSgic291bmRleCIsICRyZWZpbmVM aXN0KSkgPyBzb3VuZGV4KCRzZWFyY2hfdGVybSkgOiAiIjsNCgkkdG9sZXJhbmNlID0gaW50 dmFsKCR0b2xlcmFuY2UpOw0KDQoJLy8gbWF0Y2hfd2l0aCBuZWVkcyB0byBiZSBidWlsdCBp bnRvIGEgc2VyaWVzIG9mIGFycmF5cyBvZiBkYXRhYmFzZSB0YWJsZXMgYW5kIGNvbHVtbnMN CgkkbG9va2luID0gc21kX3NwbGl0KCRtYXRjaF93aXRoLCBmYWxzZSwgIjosXHMiKTsNCgkv LyBMb29wIG92ZXIgcGFpcnMgb2YgZWxlbWVudHMNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwg Y291bnQoJGxvb2tpbik7ICRpZHgrPTIpIHsNCgkJaWYgKCgkdG1wID0gYXJyYXlfc2VhcmNo KCRsb29raW5bJGlkeF0sICRwbGFjZXMpKSAhPT0gZmFsc2UpIHsNCgkJCSRkYlRhYmxlc1td ID0gJHRtcDsNCgkJCSRkYkZpZWxkTGlzdCA9IHNtZF9zcGxpdCgkbG9va2luWyRpZHgrMV0s IGZhbHNlLCAiOyIpOw0KCQkJJGRiRmllbGQgPSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGRi RmllbGRMaXN0IGFzICRsb29rRmllbGQpIHsNCgkJCQkka2V5ID0gYXJyYXlfc2VhcmNoKCRs b29raW5bJGlkeF0uIjoiLnN0cnRvbG93ZXIoJGxvb2tGaWVsZCksICRjb2xOYW1lcyk7DQoJ CQkJaWYgKCRrZXkpIHsNCgkJCQkJJGRiRmllbGRbXSA9ICRrZXk7DQoJCQkJfSBlbHNlIGlm IChzdHJwb3MoJGxvb2tGaWVsZCwgImN1c3RvbV8iKSA9PT0gMCkgew0KCQkJCQkkZGJGaWVs ZFtdID0gJGxvb2tGaWVsZDsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoY291bnQoJGRiRmllbGQp ID4gMCkgew0KCQkJCSRkYkZpZWxkc1tdID0gJGRiRmllbGQ7DQoJCQl9DQoJCX0NCgl9DQoN CglpZiAoY291bnQoJGRiVGFibGVzKSA9PSAwIHx8IGNvdW50KCRkYkZpZWxkcykgPT0gMCkg ew0KCQkkZGJUYWJsZXNbXSA9ICJ0ZXh0cGF0dGVybiI7DQoJCSRkYkZpZWxkc1tdID0gIioi Ow0KCX0NCglpZiAoJGRlYnVnKSB7DQoJCWVjaG8gIisrIEZJRUxEUyArKyI7DQoJCWRtcCgk ZGJGaWVsZHMpOw0KCX0NCg0KCSRzaG93TGlzdCA9IGRvX2xpc3QoJHNob3csICRkZWxpbSk7 DQoJZm9yICgkaWR4ID0gY291bnQoJHNob3dMaXN0KTsgJGlkeCA+IDA7ICRpZHgtLSkgew0K CQlpZiAoIWluX2FycmF5KCRzaG93TGlzdFskaWR4LTFdLCAkc2hvd0FsbG93KSkgew0KCQkJ dW5zZXQoJHNob3dMaXN0WyRpZHhdKTsNCgkJfQ0KCX0NCgkkbGltaXRCeSA9IGFycmF5KCk7 DQoJJGxpbWl0ID0gZG9fbGlzdCgkbGltaXQsICRkZWxpbSk7DQoJZm9yZWFjaCAoJGxpbWl0 IGFzICRsaW1PcHRpb24pIHsNCgkJaWYgKGlzX251bWVyaWMoJGxpbU9wdGlvbikpIHsNCg0K CQkJJGxpbWl0QnlbImFydGljbGVzIl0gPSAkbGltT3B0aW9uOw0KCQkJJGxpbWl0QnlbIndv cmRzIl0gPSAkbGltT3B0aW9uOw0KCQl9IGVsc2Ugew0KCQkJJGxpbXNwbGl0ID0gc21kX3Nw bGl0KCRsaW1PcHRpb24sIGZhbHNlLCAiOiIpOw0KCQkJaWYgKChjb3VudCgkbGltc3BsaXQp ID09IDIpICYmIChpbl9hcnJheSgkbGltc3BsaXRbMF0sICRzaG93QWxsb3cpKSAmJiAoaXNf bnVtZXJpYygkbGltc3BsaXRbMV0pKSkgew0KCQkJCSRsaW1pdEJ5WyRsaW1zcGxpdFswXV0g PSAkbGltc3BsaXRbMV07DQoJCQl9DQoJCX0NCgl9DQoJJHRoaW5naWVzTDEwbiA9IGFycmF5 KCk7DQoJZm9yZWFjaCAoJHNob3dMaXN0IGFzICRpdGVtKSB7DQoJCSR0aGluZ2llc0wxMG5b XSA9ICRzbWRfZnV6ekxhbmctPmdUeHQoJGl0ZW0pOw0KCX0NCgkkdGhpbmdpZXMgPSBpbXBs b2RlKCIgIi4kc21kX2Z1enpMYW5nLT5nVHh0KCdzdWdnZXN0X2pvaW4nKS4iICIsICR0aGlu Z2llc0wxMG4pOw0KCSRub19tYXRjaF9sYWJlbCA9ICgkbm9fbWF0Y2hfbGFiZWwgPT0gIiMi KSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ25vX21hdGNoJywgYXJyYXkoIntzZWFyY2hfdGVy bX0iID0+ICRzZWFyY2hfdGVybSkpIDogJG5vX21hdGNoX2xhYmVsOw0KCSRzdWdnZXN0X2xh YmVsID0gKCRzdWdnZXN0X2xhYmVsID09ICIjIikgPyAkc21kX2Z1enpMYW5nLT5nVHh0KCdz dWdnZXN0JywgYXJyYXkoInt0aGluZ2llc30iID0+ICR0aGluZ2llcykpIDogJHN1Z2dlc3Rf bGFiZWw7DQoJJHRvb19zaG9ydF9sYWJlbCA9ICgkdG9vX3Nob3J0X2xhYmVsID09ICIjIikg PyAkc21kX2Z1enpMYW5nLT5nVHh0KCd0b29fc2hvcnQnKSA6ICR0b29fc2hvcnRfbGFiZWw7 DQoNCgkvLyBSb2xsIGFueSBzdGF0dXMsIHNlY3Rpb24gYW5kIGNhdGVnb3J5IGZpbHRlcnMg aW50byB0aGUgaW5pdGlhbCBxdWVyeQ0KCSRjbGF1c2VbXSA9ICcxPTEnOw0KDQoJaWYgKGlu X2FycmF5KCJ0ZXh0cGF0dGVybiIsICRkYlRhYmxlcykpIHsNCgkJLy8gU3RhdHVzDQoJCWxp c3QoJHN0YXRpbmMsICRzdGF0ZXhjKSA9IHNtZF9kb0xpc3QoJHN0YXR1cywgZmFsc2UsICcn LCBmYWxzZSwgJGRlbGltKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRzdGF0 aW5jKTsgJGlkeCsrKSB7DQoJCQkkdG1wYVtdID0gZG9RdW90ZShnZXRTdGF0dXNOdW0oJHN0 YXRpbmNbJGlkeF0pKTsNCgkJfQ0KCQlpZiAoJHRtcGEpIHsNCgkJCSRjbGF1c2VbXSA9ICdT dGF0dXMgSU4gKCcgLmltcGxvZGUoIiwiLCAkdG1wYSkuICcpJzsNCgkJfQ0KDQoJCS8vIFNl Y3Rpb24NCgkJbGlzdCgkc2VjaW5jLCAkc2VjZXhjKSA9IHNtZF9kb0xpc3QoJHNlY3Rpb24s IGZhbHNlLCAnJywgdHJ1ZSwgJGRlbGltKTsNCgkJaWYgKCRzZWNpbmMpIHsNCgkJCSRjbGF1 c2VbXSA9ICcoIFNlY3Rpb24gSU4gKCcgLmltcGxvZGUoIiwiLCAkc2VjaW5jKS4gJykgKSc7 DQoJCX0NCg0KCQkvLyBDYXRlZ29yeQ0KCQlsaXN0KCRjYXRpbmMsICRjYXRleGMpID0gc21k X2RvTGlzdCgkY2F0ZWdvcnksIGZhbHNlLCAiYXJ0aWNsZToiLiRzdWJsZXZlbCwgdHJ1ZSwg JGRlbGltKTsNCgkJaWYgKCRjYXRpbmMpIHsNCgkJCSRpbXAgPSBpbXBsb2RlKCIsIiwgJGNh dGluYyk7DQoJCQkkY2xhdXNlW10gPSAnKCBDYXRlZ29yeTEgSU4gKCcgLiRpbXAuICcpIE9S IENhdGVnb3J5MiBJTiAoJyAuJGltcC4gJykgKSc7DQoJCX0NCg0KCQkvLyBDb21iaW5lIHRo ZSBxdWVyeSBwb3J0aW9ucw0KCQkkY2xhdXNlID0gaW1wbG9kZSgiIEFORCAiLCAkY2xhdXNl KTsNCg0KCQkvLyBBZGQgb24gYW55IGV4Y2x1c2lvbnMNCgkJJHRtcGEgPSBhcnJheSgpOw0K CQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHN0YXRleGMpOyAkaWR4KyspIHsNCgkJ CSR0bXBhW10gPSBkb1F1b3RlKGdldFN0YXR1c051bSgkc3RhdGV4Y1skaWR4XSkpOw0KCQl9 DQoJCSRjbGF1c2UgLj0gKCR0bXBhKSA/ICcgQU5EIFN0YXR1cyBOT1QgSU4gKCcuaW1wbG9k ZSgiLCIsICR0bXBhKS4nKScgOiAnJzsNCg0KCQkkaW1wID0gaW1wbG9kZSgiLCIsICRzZWNl eGMpOw0KCQkkY2xhdXNlIC49ICgkc2VjZXhjKSA/ICcgQU5EIFNlY3Rpb24gTk9UIElOICgn LiRpbXAuJyknIDogJyc7DQoJDQoJCSRpbXAgPSBpbXBsb2RlKCIsIiwgJGNhdGV4Yyk7DQoJ CSRjbGF1c2UgLj0gKCRjYXRleGMpID8gJyBBTkQgQ2F0ZWdvcnkxIE5PVCBJTiAoJy4kaW1w LicpIEFORCBDYXRlZ29yeTIgTk9UIElOICgnLiRpbXAuJyknIDogJyc7DQoJfQ0KDQoJJGNs YXVzZSA9IGlzX2FycmF5KCRjbGF1c2UpID8gam9pbigiICIsICRjbGF1c2UpIDogJGNsYXVz ZTsNCgkvL1RPRE86IGNvbW1lbnRzDQovKg0KCWlmIChpbl9hcnJheSgidHhwX2Rpc2N1c3Mi LCRkYlRhYmxlcykpIHsNCgkJJGNsYXVzZSAuPSAiIEFORCB0ZXh0cGF0dGVybi5JRCA9IHR4 cF9kaXNjdXNzLnBhcmVudGlkIjsNCgl9DQoqLw0KDQoJaWYgKCRkZWJ1ZyA+IDApIHsNCgkJ ZWNobyAiKysgV0hFUkUgQ0xBVVNFICsrIjsNCgkJZG1wKCRjbGF1c2UpOw0KCX0NCg0KCSRv dXQgPSAiIjsNCgkvLyBQZXJmb3JtIHRoZSBzZWFyY2hlcw0KCSRmaW5kZXIgPSBuZXcgc21k X0Z1enp5RmluZCgkc2VhcmNoX3Rlcm0sICR0b2xlcmFuY2UpOw0KCWlmICgkZmluZGVyLT50 b29fc2hvcnRfZXJyKSB7DQoJCSRvdXQgLj0gKCRsYWJlbHRhZyA9PSAiIikgPyAiIiA6ICI8 IiAuJGxhYmVsdGFnLiI+IjsNCgkJJG91dCAuPSAkbm9fbWF0Y2hfbGFiZWw7DQoJCSRvdXQg Lj0gJHRvb19zaG9ydF9sYWJlbDsNCgkJJG91dCAuPSAoJGxhYmVsdGFnID09ICIiKSA/ICIi IDogIjwvIiAuJGxhYmVsdGFnLiI+IjsNCgl9IGVsc2Ugew0KCQkkY29scyA9ICIqIiAuICgo aW5fYXJyYXkoInRleHRwYXR0ZXJuIiwgJGRiVGFibGVzKSkgPyAiLCB1bml4X3RpbWVzdGFt cCh0ZXh0cGF0dGVybi5Qb3N0ZWQpIEFTIHVQb3N0ZWQsIHVuaXhfdGltZXN0YW1wKHRleHRw YXR0ZXJuLkxhc3RNb2QpIEFTIHVMYXN0TW9kLCB1bml4X3RpbWVzdGFtcCh0ZXh0cGF0dGVy bi5FeHBpcmVzKSBBUyB1RXhwaXJlcyIgOiAiIik7DQoJCSRycyA9IHNhZmVfcm93c19zdGFy dCgkY29scywgaW1wbG9kZSgkZGJUYWJsZXMsICIsICIpLCAkY2xhdXNlLCAkZGVidWcpOw0K CQlpZiAoaW5fYXJyYXkoInRleHRwYXR0ZXJuIiwkZGJUYWJsZXMpKSB7DQoJCQkkb3Bmb3Jt ID0gKCR0aGluZykgPyAkdGhpbmcgOiBmZXRjaF9mb3JtKCRmb3JtKTsNCgkJfQ0KCQkkcGFn ZXVybCA9IHNtZF9yZW1vdmVRU1ZhcigkcHJldGV4dFsncmVxdWVzdF91cmknXSwncScpOw0K CQkkYWxsRmllbGRzID0gIiI7DQoJCSRhcnRMaXN0ID0gYXJyYXkoKTsNCgkJJHdvcmRMaXN0 ID0gYXJyYXkoKTsNCgkJJHRlcm1MaXN0ID0gYXJyYXkoKTsNCgkJd2hpbGUoJHJvdyA9IG5l eHRSb3coJHJzKSkgew0KCQkJJGFsbEZpZWxkcyA9ICIiOw0KCQkJLy8gSm9pbiBhbGwgdGhl IHJlcXVpcmVkIHBsYWNlcyB0byBsb29rIGludG8gYSBsb29vbmcgdGV4dCBibG9jaw0KCQkJ aWYgKCRkYkZpZWxkc1swXSA9PSAiKiIpIHsNCgkJCQlmb3JlYWNoICgkcm93IGFzICRjb2xu YW1lKSB7DQoJCQkJCSRhbGxGaWVsZHMgLj0gJGNvbG5hbWUuIiAiOw0KCQkJCX0NCgkJCX0g ZWxzZSB7DQoJCQkJZm9yZWFjaCAoJGRiRmllbGRzIGFzICRmaWVsZFJvdykgew0KCQkJCQlm b3JlYWNoICgkZmllbGRSb3cgYXMgJHRoZUZpZWxkKSB7DQoJCQkJCQkkYWxsRmllbGRzIC49 ICRyb3dbJHRoZUZpZWxkXS4iICI7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCS8vIFJl bW92ZSBiZXR3ZWVuLXdvcmQgdW5pY29kZSBwdW5jdHVhdGlvbiBhbmQgcmVwbGFjZSB3aXRo IHNwYWNlDQoJCQkkYWxsRmllbGRzID0gc3RyaXBfdGFncygkYWxsRmllbGRzKTsNCgkJCSRh bGxGaWVsZHMgPSB0cmltKHByZWdfcmVwbGFjZSgnI1tccHtQfV0rI3UnLCAnICcsICRhbGxG aWVsZHMpKTsNCg0KCQkJLy8gU3BsaXQgdGhlIHJlbWFpbmRlciBieSAoc2luZ2xlIG9yIG11 bHRpcGxlKSBzcGFjZXMNCgkJCSR3ZXJkcyA9IHByZWdfc3BsaXQoJy9ccysvJywgJGFsbEZp ZWxkcywgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQkJLy8gLi4uYW5kIHJlY29uc3Rp dHV0ZSB0aGUgdW5pcXVlIHdvcmRzIGFzIGEgaHVnZSBzcGFjZS1kZWxpbWl0ZWQgc3RyaW5n DQoJCQkkd2VyZHMgPSBpbXBsb2RlKCIgIixhcnJheV91bmlxdWUoJHdlcmRzKSk7DQoJCQkv LyBUYWtlIGludG8gYWNjb3VudCBjYXNlIHNlbnNpdGl2aXR5DQoJCQkkd2VyZHMgPSAoJGNh c2Vfc2Vuc2l0aXZlKSA/ICR3ZXJkcyA6IHN0cnRvbG93ZXIoJHdlcmRzKTsNCg0KCQkJLy8g RmluZCBjbG9zZSB3b3JkIG1hdGNoZXMNCgkJCSRtYXRjaGVzID0gJGZpbmRlci0+c2VhcmNo KCR3ZXJkcyk7DQoJCQlpZiAoJGRlYnVnID4gMSkgew0KCQkJCWlmICgkZGVidWcgPiAzIHx8 ICRtYXRjaGVzKSB7DQoJCQkJCWVjaG8gIisrIFVOSVFVRSBXT1JEUyArKyI7DQoJCQkJCWRt cCgkd2VyZHMpOw0KCQkJCX0NCgkJCQlpZiAoJG1hdGNoZXMpIHsNCgkJCQkJZWNobyAiKysg Q0xPU0VTVCBNQVRDSEVTICsrIjsNCgkJCQkJZG1wKCRtYXRjaGVzKTsNCgkJCQl9DQoJCQl9 DQoNCgkJCWlmIChjb3VudCgkbWF0Y2hlcykgPiAwKSB7DQoJCQkJJHNob3J0ZXN0RGlzdCA9 IDEwMDsgLy8gQSBzdHVwaWRseSBoaWdoIG51bWJlciB0byBzdGFydCB3aXRoDQoJCQkJJHNo b3J0ZXN0TWV0YURpc3QgPSAtMTsNCgkJCQkkY2xvc2VzdFdvcmQgPSAiIjsNCgkJCQkkY2xv c2VzdE1ldGFXb3JkID0gIiI7DQoJCQkJJG1heF90ZXJtX2xlbiA9IDA7DQoJCQkJLy8gQnVp bGQgYSB1bmlxdWUgYXJyYXkgb2YgY2xvc2VzdCBtYXRjaGluZyB3b3Jkcw0KCQkJCXdoaWxl KGxpc3QoJGlkeCwkZGlzdCkgPSBlYWNoKCRtYXRjaGVzKSkgew0KCQkJCQkkdGVybSA9IHNt ZF9nZXRXb3JkKCR3ZXJkcywkc2VhcmNoX3Rlcm0sJGlkeCk7DQoNCgkJCQkJLy8gT25seSB3 b3JkcyBtZWV0aW5nIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IG5lZWQgYXBwbHkNCgkJCQkJ JG1heF90ZXJtX2xlbiA9IChzdHJsZW4oJHRlcm0pID4gJG1heF90ZXJtX2xlbikgPyBzdHJs ZW4oJHRlcm0pIDogJG1heF90ZXJtX2xlbjsNCgkJCQkJaWYgKHN0cmxlbigkdGVybSkgPCAk bWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCQljb250aW51ZTsNCgkJCQkJfQ0KCQkJCQkkdGVy bSA9ICgkY2FzZV9zZW5zaXRpdmUpID8gJHRlcm0gOiBzdHJ0b2xvd2VyKCR0ZXJtKTsNCgkJ CQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJCWVjaG8gJHRlcm0uYnI7DQoJCQkJCX0NCgkJ CQkJaWYgKCRkaXN0IDwgJHNob3J0ZXN0RGlzdCkgew0KCQkJCQkJJHNob3J0ZXN0RGlzdCA9 ICRkaXN0Ow0KCQkJCQkJJGNsb3Nlc3RXb3JkID0gJHRlcm07DQoJCQkJCX0NCgkJCQkJaWYg KCRtZXRhX3NlYXJjaCAhPSAiIikgew0KCQkJCQkJJG1ldGFfdGVybSA9IG1ldGFwaG9uZSgk dGVybSk7DQoJCQkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJCQkJCWVjaG8gJG1ldGFfdGVy bSAuICIgOiAiIC4gJG1ldGFfc2VhcmNoIC4iICIuYnI7DQoJCQkJCQl9DQoJCQkJCQkkbGV2 RGlzdCA9IGxldmVuc2h0ZWluKCRtZXRhX3NlYXJjaCwgJG1ldGFfdGVybSk7DQoJCQkJCQlp ZiAoJGxldkRpc3QgPD0gJHNob3J0ZXN0TWV0YURpc3QgfHwgJHNob3J0ZXN0TWV0YURpc3Qg PCAwKSB7DQoJCQkJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAkbGV2RGlzdDsNCgkJCQkJCQkk Y2xvc2VzdE1ldGFXb3JkICA9ICR0ZXJtOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJ CS8vIFBpY2sgdGhlIG9uZSB0aGF0IHNvdW5kcyBjbG9zZXN0IHRvIHRoZSBvcmlnaW5hbA0K CQkJCWlmICh0cmltKCRjbG9zZXN0V29yZCkgIT0gIiIpIHsNCgkJCQkJJGlkeCA9IG1kNSgk Y2xvc2VzdFdvcmQpOw0KCQkJCQkkYmVzdEZpdCA9ICRjbG9zZXN0V29yZDsNCgkJCQkJJGJl c3REaXN0ID0gJHNob3J0ZXN0RGlzdDsNCgkJCQkJaWYgKCRzb3VuZF9zZWFyY2ggIT0gIiIp IHsNCgkJCQkJCSRzb3VuZDEgPSBsZXZlbnNodGVpbihzb3VuZGV4KCRjbG9zZXN0V29yZCks ICRzb3VuZF9zZWFyY2gpOw0KCQkJCQkJJHNvdW5kMiA9IGxldmVuc2h0ZWluKHNvdW5kZXgo JGNsb3Nlc3RNZXRhV29yZCksICRzb3VuZF9zZWFyY2gpOw0KCQkJCQkJaWYgKCRzb3VuZDEg Pj0gJHNvdW5kMikgew0KCQkJCQkJCSRpZHggPSBtZDUoJGNsb3Nlc3RNZXRhV29yZCk7DQoJ CQkJCQkJJGJlc3RGaXQgPSAkY2xvc2VzdE1ldGFXb3JkOw0KCQkJCQkJCSRiZXN0RGlzdCA9 ICRzaG9ydGVzdE1ldGFEaXN0Ow0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCSR3b3JkTGlzdFsk aWR4XSA9ICRiZXN0Rml0Ow0KCQkJCQkkd29yZERpc3RbJGlkeF0gPSAkYmVzdERpc3Q7DQoN CgkJCQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJCWVjaG8gIisrIEJFU1QgRklUICsrIjsN CgkJCQkJCWRtcCgkYmVzdEZpdCk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBCdWlsZCBh biBhcnJheSBvZiB1bmlxdWUgbWF0Y2hpbmcgYXJ0aWNsZXMNCgkJCQlpZiAoJG1heF90ZXJt X2xlbiA+PSAkbWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCWlmIChpbl9hcnJheSgidGV4dHBh dHRlcm4iLCAkZGJUYWJsZXMpKSB7DQoJCQkJCQlwb3B1bGF0ZUFydGljbGVEYXRhKCRyb3cp Ow0KCQkJCQl9DQoJCQkJCS8vIFRlbXBvcmFyaWx5IGFzc2lnbiB0aGUgY2xvc2VzdCBtYXRj aCB0byB0aGUgcXVlcnkgc3RyaW5nIHNvIHRoYXQNCgkJCQkJLy8gdGhlIHNlYXJjaF9yZXN1 bHRfZXhjZXJwdCBjYW4gaGlsaWdodCB0aGUgZm91bmQgd29yZHMNCgkJCQkJJHByZXRleHRb J3EnXSA9ICR0ZXJtOw0KCQkJCQkkYXJ0TGlzdFtdID0gcGFyc2UoJG9wZm9ybSk7DQoJCQkJ CSRwcmV0ZXh0WydxJ10gPSAkc2VhcmNoX3Rlcm07DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCS8v IFNvcnQgdGhlIHdvcmQgbGlzdCBpbiBvcmRlciBvZiByZWxldmFuY2UNCgkJaWYgKGNvdW50 KCR3b3JkTGlzdCkgPiAwKSB7DQoJCQlhcnJheV9tdWx0aXNvcnQoJHdvcmREaXN0LCR3b3Jk TGlzdCk7DQoJCX0NCg0KCQkvLyBPdXRwdXQgc3R1ZmYgdG8gdGhlIHBhZ2UNCgkJJG91dCAu PSAoJGxhYmVsdGFnID09ICIiKSA/ICIiIDogIjwiIC4kbGFiZWx0YWcuIj4iOw0KCQkkb3V0 IC49ICRub19tYXRjaF9sYWJlbDsNCgkJaWYgKGNvdW50KCR3b3JkTGlzdCkgPiAwKSB7DQoJ CQkkb3V0IC49IChjb3VudCgkc2hvd0xpc3QpID4gMCkgPyAkc3VnZ2VzdF9sYWJlbCA6ICIi Ow0KDQoJCQlpZiAoaW5fYXJyYXkoIndvcmRzIiwgJHNob3dMaXN0KSkgew0KCQkJCSRjdHIg PSAwOw0KCQkJCWZvcmVhY2ggKCR3b3JkTGlzdCBhcyAkaXRlbSkgew0KCQkJCQlpZiAoYXJy YXlfa2V5X2V4aXN0cygid29yZHMiLCAkbGltaXRCeSkgJiYgJGN0ciA+PSAkbGltaXRCeVsi d29yZHMiXSkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJJG91dCAuPSAnPGEgaHJl Zj0iJy5zbWRfYWRkUVNWYXIoJHBhZ2V1cmwsJ3EnLCRpdGVtKS4nIj4nLiRpdGVtLic8L2E+ Jy5uOw0KCQkJCQkkY3RyKys7DQoJCQkJfQ0KCQkJfQ0KCQkJJG91dCAuPSAoJGxhYmVsdGFn ID09ICIiKSA/ICIiIDogIjwvIiAuJGxhYmVsdGFnLiI+IjsNCgkJCWlmIChpbl9hcnJheSgi YXJ0aWNsZXMiLCAkc2hvd0xpc3QpKSB7DQoJCQkJJGN0ciA9IDA7DQoJCQkJZm9yZWFjaCAo JGFydExpc3QgYXMgJGFydCkgew0KCQkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygiYXJ0aWNs ZXMiLCAkbGltaXRCeSkgJiYgJGN0ciA+PSAkbGltaXRCeVsiYXJ0aWNsZXMiXSkgew0KCQkJ CQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJJG91dCAuPSAkYXJ0Ow0KCQkJCQkkY3RyKys7DQoJ CQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkb3V0Ow0KfQ0KDQoNCi8qIHNtZF9GdXp6 eUZpbmQNCkEgUEhQIGNsYXNzIGZvciBhcHByb3hpbWF0ZSBzdHJpbmcgc2VhcmNoaW5nIG9m IGxhcmdlIHRleHQgbWFzc2VzLCBhZGFwdGVkICgqY291Z2gqIGJvcnJvd2VkKSBmcm9tIGh0 dHA6Ly9lbG9uZW4uaWtpLmZpL2NvZGUvbWlzYy1ub3Rlcy9hcHByLXNlYXJjaC1waHAvLiBJ bnN0YW50aWF0ZSBvbmUgb2YgdGhlc2UgYW5kIHBhc3MgaXQgdGhlIHN0cmluZyBwYXR0ZXJu L3dvcmQgeW91IGFyZSBsb29raW5nIGZvciBhbmQgYSBudW1iZXIgaW5kaWNhdGluZyBob3cg Y2xvc2UgdGhhdCBtYXRjaCBoYXMgdG8gYmUvbWluaW11bSBsZW5ndGggb2Ygc3RyaW5ncyB0 byBjb25zaWRlciAoaS5lLiB0aGUgYW1vdW50IG9mIGVycm9yIHRvbGVyYWJsZSkuIDA9Y2xv c2UgbWF0Y2gvc2hvcnQgd29yZHM7IDEwPXByZXR0eSBtdWNoIGV2ZXJ5IGxvbmcgKDEwIGNo YXIgbWluaW11bSkgc3RyaW5nIGluIHRoZSB3b3JsZC4gUHJhY3RpY2FsIHZhbHVlcyBhcmUg dXN1YWxseSAxIG9yIDIsIHNvbWV0aW1lcyAzLg0KDQpVc2FnZSBleGFtcGxlOg0KICAkZmlu ZGVyID0gbmV3IHNtZF9GdXp6eUZpbmQoJHBhdHQsICRtYXhfZXJyKTsNCiAgaWYgKCRmaW5k ZXItPnRvb19zaG9ydF9lcnIpDQogICAgJGVycm9yID0gIlVuYWJsZSB0byBzZWFyY2g6IHVz ZSBsb25nZXIgcGF0dGVybiBvciByZWR1Y2UgZXJyb3IgdG9sZXJhbmNlLiI7DQoNCiAgd2hp bGUoJHRleHQgPSBnZXRfbmV4dF9wYWdlX29mX3RleHQoKSkgew0KICAgICRtYXRjaGVzID0g JGZpbmRlci0+c2VhcmNoKCR0ZXh0KTsNCiAgICB3aGlsZShsaXN0KCRpZHgsJHJuZykgPSBl YWNoKCRtYXRjaGVzKSkNCiAgICAgIHByaW50ICJNYXRjaCBmb3VuZCBlbmRpbmcgYXQgcG9z aXRpb24gJGlkeCB3aXRoIGEgY2xvc2VuZXNzIG9mICR2YWxcbiI7DQogIH0NCg0KVGhlIGNv ZGUgdXNlcyBpbml0aWFsIGZpbHRlcmluZyB0byBzb3J0IG91dCBwb3NzaWJsZSBtYXRjaCBj YW5kaWRhdGVzIGFuZCB0aGVuIGFwcGxpZXMgYSBzbG93ZXIgY2hhcmFjdGVyLWJ5LWNoYXJh Y3RlciBzZWFyY2ggKHNlYXJjaF9zaG9ydCgpKSBhZ2FpbnN0IHRoZW0uDQoqLw0KDQppZigh Y2xhc3NfZXhpc3RzKCdzbWRfRnV6enlGaW5kJykpIHsNCmNsYXNzIHNtZF9GdXp6eUZpbmQg ew0KCS8vIFRoZSBsYXN0IDMgcGFyYW1ldGVycyBhcmUgZm9yIG9wdGltaXphdGlvbiBvbmx5 LCB0byBhdm9pZCB0aGUNCgkvLyBzdXJwcmlzaW5nbHkgc2xvdyBzdHJsZW4oKSBhbmQgc3Vi c3RyKCkgY2FsbHM6DQoJLy8gIC0gJHN0YXJ0X2luZGV4ID0gZnJvbSB3aGljaCBjaGFyYWN0 ZXIgb2YgJHRleHQgdG8gc3RhcnQgdGhlIHNlYXJjaA0KCS8vICAtICRtYXhfbGVuID0gbWF4 aW11bSBjaGFyYWN0ZXIgdG8gc2VhcmNoIChzdGFydGluZyBmcm9tICRzdGFydF9pbmRleCkN CgkvLyAgLSAkdGV4dF9zdHJsZW4gPQ0KCS8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gYXJy YXkgb2YgbWF0Y2hlczoNCgkvLyAgIEFycmF5KCBbPG1hdGNoLWVuZC1pbmRleD5dID0+IDxl cnJvcj4sIC4uLiApDQoJLy8gTm90ZTogPGVycm9yPiBpcyBnZW5lcmFsbHkgTk9UIGFuIGV4 YWN0IGVkaXQgZGlzdGFuY2UgYnV0IHJhdGhlciBhDQoJLy8gbG93ZXIgYm91bmQuIFRoaXMg aXMgdW5mb3J0dW5hdGUgYnV0IHRoZSByb3V0aW5lIHdvdWxkIGJlIHNsb3dlciBpZg0KCS8v IHRoZSBleGFjdCBlcnJvciB3YXMgY2FsY3VsYXRlIGFsb25nIHdpdGggdGhlIG1hdGNoZXMu DQoJLy8gVGhlIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBub24tZGV0ZXJtaW5pc3RpYyBh dXRvbWF0b24gc2ltdWxhdGlvbg0KCS8vIGFsZ29yaXRobSAod2l0aG91dCBiaXQgcGFyYWxs ZWxpc20gb3B0aW1pemF0aW9ucykuDQoJZnVuY3Rpb24gc2VhcmNoX3Nob3J0KCRwYXR0LCAk aywgJHRleHQsICRzdGFydF9pbmRleD0wLCAkbWF4X2xlbj0tMSwgJHRleHRfc3RybGVuPS0x KSB7DQoJCWlmICggJHRleHRfc3RybGVuIDwgMCApDQoJCQkkdGV4dF9zdHJsZW4gPSBzdHJs ZW4oICR0ZXh0ICk7DQoNCgkJaWYgKCAkbWF4X2xlbiA8IDAgKQ0KCQkJJG1heF9sZW4gPSAk dGV4dF9zdHJsZW47DQoNCgkJJHN0YXJ0X2luZGV4ID0gbWF4KCAwLCAkc3RhcnRfaW5kZXgg KTsNCgkJJG4gPSBtaW4oICRtYXhfbGVuLCAkdGV4dF9zdHJsZW4tJHN0YXJ0X2luZGV4ICk7 DQoJCSRtID0gc3RybGVuKCAkcGF0dCApOw0KCQkkZW5kX2luZGV4ID0gJHN0YXJ0X2luZGV4 ICsgJG47DQoNCgkJLy8gSWYgJHRleHQgaXMgc2hvcnRlciB0aGFuICRwYXR0LCB1c2UgdGhl IGJ1aWx0LWluDQoJCS8vIGxldmVuc2h0ZWluKCkgaW5zdGVhZDoNCgkJaWYgKCRuIDwgJG0p DQoJCXsNCgkJCSRsZXYgPSBsZXZlbnNodGVpbihzdWJzdHIoJHRleHQsICRzdGFydF9pbmRl eCwgJG4pLCAkcGF0dCk7DQoJCQlpZiAoICRsZXYgPD0gJGsgKQ0KCQkJCXJldHVybiBBcnJh eSggJHN0YXJ0X2luZGV4KyRuLTEgPT4gJGxldiApOw0KCQkJZWxzZQ0KCQkJCXJldHVybiBB cnJheSgpOw0KCQl9DQoNCgkJJHMgPSBBcnJheSgpOw0KCQlmb3IgKCRpPTA7ICRpPCRtOyAk aSsrKQ0KCQl7DQoJCQkkYyA9ICRwYXR0eyRpfTsNCgkJCWlmICggaXNzZXQoJHNbJGNdKSkN CgkJCQkkc1skY10gPSBtaW4oJGksICRzWyRjXSk7DQoJCQllbHNlDQoJCQkJJHNbJGNdID0g JGk7DQoJCX0NCg0KCQlpZiAoICRlbmRfaW5kZXggPCAkc3RhcnRfaW5kZXggKQ0KCQkJcmV0 dXJuIEFycmF5KCk7DQoNCgkJJG1hdGNoZXMgPSBBcnJheSgpOw0KCQkkZGEgPSAkZGIgPSBy YW5nZSgwLCAkbS0kaysxKTsNCg0KCQkkbWsgPSAkbS0kazsNCg0KCQlmb3IgKCR0PSRzdGFy dF9pbmRleDsgJHQ8JGVuZF9pbmRleDsgJHQrKykNCgkJew0KCQkJJGMgPSAkdGV4dHskdH07 DQoJCQkkaW5fcGF0dCA9IGlzc2V0KCRzWyRjXSk7DQoNCgkJCWlmICgkdCYxKSB7ICRkPSYk ZGE7ICRlPSYkZGI7IH0NCgkJCWVsc2UgeyAkZD0mJGRiOyAkZT0mJGRhOyB9DQoNCgkJCWZv ciAoJGk9MTsgJGk8PSRtazsgJGkrKykNCgkJCXsNCgkJCQkkZyA9IG1pbiggJGsrMSwgJGVb JGldKzEsICRlWyRpKzFdKzEgKTsNCg0KCQkJCS8vIFRPRE86IG9wdGltaXplIHRoaXMgd2l0 aCBhIGxvb2stdXAtdGFibGU/DQoJCQkJaWYgKCAkaW5fcGF0dCApDQoJCQkJCWZvciAoJGo9 JGVbJGktMV07ICgkajwkZyAmJiAkajw9JG1rKTsgJGorKykNCgkJCQkJCWlmICggJHBhdHR7 JGkrJGotMX0gPT0gJGMgKQ0KCQkJCQkJCSRnID0gJGo7DQoNCgkJCQkkZFskaV0gPSAkZzsN CgkJCX0NCg0KCQkJaWYgKCAkZFskbWtdIDw9ICRrICkNCgkJCXsNCgkJCQkkZXJyID0gJGRb JG1rXTsNCgkJCQkkaSA9IG1pbiggJHQtJGVyciskaysxLCAkc3RhcnRfaW5kZXgrJG4tMSk7 DQoJCQkJaWYgKCAhaXNzZXQoJG1hdGNoZXNbJGldKSB8fCAkZXJyIDwgJG1hdGNoZXNbJGld KQ0KCQkJCQkkbWF0Y2hlc1skaV0gPSAkZXJyOw0KCQkJfQ0KCQl9DQoNCgkJdW5zZXQoICRk YSwgJGRiICk7DQoJCXJldHVybiAkbWF0Y2hlczsNCgl9DQoJZnVuY3Rpb24gdGVzdF9zaG9y dF9zZWFyY2goKSB7DQoJCSR0ZXN0X3RleHQgPSAiT2xpcGEga2VycmFuIGp1c3NpIGJqJnhs aW5nIGphIGtvbG1lXG4gaWxvaXN0YSAiLg0KCQkJImp1c3NpIGJmb3JsaW5nOmlhIG11dHRh IGVpIHlodGFhbiBqdXNzaSBiam9ybGluZy1uaW1pc3RhIGxhdWxhamFhLiI7DQoJCSR0ZXN0 X3BhdHQgPSAianVzc2kgYmpvcmxpbmciOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hv cnQoJHRlc3RfcGF0dCwgNCwgJHRlc3RfdGV4dCkgPT0gQXJyYXkoMjc9PjIsIDYwPT4xLCA5 ND0+MCkpOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgMiwg JHRlc3RfdGV4dCkgPT0gQXJyYXkoMjc9PjIsIDYwPT4xLCA5ND0+MCkpOw0KCQlhc3NlcnQo ICR0aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgMSwgJHRlc3RfdGV4dCkgPT0gQXJy YXkoNjA9PjEsIDk0PT4wKSk7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgkdGVz dF9wYXR0LCAwLCAkdGVzdF90ZXh0KSA9PSBBcnJheSg5ND0+MCkpOw0KCQlhc3NlcnQoICR0 aGlzLT5zZWFyY2hfc2hvcnQoImJqb3JsaW5nIiwgMiwgJHRlc3RfdGV4dCwgMTksIDcpID09 IEFycmF5KCkpOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoImJqb3JsaW5nIiwg MiwgJHRlc3RfdGV4dCwgMTksIDgpID09IEFycmF5KDI2PT4yKSk7DQoJCWFzc2VydCggJHRo aXMtPnNlYXJjaF9zaG9ydCgiYmpvcmxpbmciLCAyLCAkdGVzdF90ZXh0LCAyMCwgOCkgPT0g QXJyYXkoKSk7DQoJfQ0KDQoJdmFyICRwYXR0LCAkcGF0dF9sZW4sICRtYXhfZXJyOw0KCXZh ciAkcGFydHMsICRuX3BhcnRzLCAkdW5pcXVlX3BhcnRzLCAkbWF4X3BhcnRfbGVuOw0KCXZh ciAkdHJhbnNmX3BhdHQ7DQoJdmFyICR0b29fc2hvcnRfZXJyOw0KCWZ1bmN0aW9uIHNtZF9G dXp6eUZpbmQoICRwYXR0ZXJuLCAkbWF4X2Vycm9yICkgew0KCQkkdGhpcy0+cGF0dCA9ICRw YXR0ZXJuOw0KCQkkdGhpcy0+cGF0dF9sZW4gPSBzdHJsZW4oJHRoaXMtPnBhdHQpOw0KCQkk dGhpcy0+bWF4X2VyciA9ICRtYXhfZXJyb3I7DQoNCgkJLy8gQ2FsY3VsYXRlIHBhdHRlcm4g cGFydGl0aW9uIHNpemUNCgkJJGludHBhcnRsZW4gPSBmbG9vcigkdGhpcy0+cGF0dF9sZW4v KCR0aGlzLT5tYXhfZXJyKzIpKTsNCgkJaWYgKCRpbnRwYXJ0bGVuIDwgMSkNCgkJew0KCQkJ JHRoaXMtPnRvb19zaG9ydF9lcnIgPSBUcnVlOw0KCQkJcmV0dXJuOw0KCQl9DQoJCWVsc2Ug JHRoaXMtPnRvb19zaG9ydF9lcnIgPSBGYWxzZTsNCg0KCQkvLyBQYXJ0aXRpb24gdGhlIHBh dHRlcm4gZm9yIHBydW5pbmcNCgkJJHRoaXMtPnBhcnRzID0gQXJyYXkoKTsNCgkJZm9yICgk aT0wOyAkaTwkdGhpcy0+cGF0dF9sZW47ICRpKz0kaW50cGFydGxlbikNCgkJew0KCQkJaWYg KCAkaSArICRpbnRwYXJ0bGVuKjIgPiAkdGhpcy0+cGF0dF9sZW4gKQ0KCQkJew0KCQkJCSR0 aGlzLT5wYXJ0c1tdID0gc3Vic3RyKCAkdGhpcy0+cGF0dCwgJGkgKTsNCgkJCQlicmVhazsN CgkJCX0NCgkJCWVsc2UNCgkJCQkkdGhpcy0+cGFydHNbXSA9IHN1YnN0ciggJHRoaXMtPnBh dHQsICRpLCAkaW50cGFydGxlbiApOw0KCQl9DQoJCSR0aGlzLT5uX3BhcnRzID0gY291bnQo JHRoaXMtPnBhcnRzKTsNCg0KCQkvLyBUaGUgaW50cGFydGxlbiB0ZXN0IGFib3ZlIHNob3Vs ZCBoYXZlIGNvdmVyZWQgdGhpczoNCgkJYXNzZXJ0KCAkdGhpcy0+bl9wYXJ0cyA+PSAkdGhp cy0+bWF4X2VycisxICk7DQoNCgkJLy8gRmluZCBtYXhpbXVtIHBhcnQgbGVuZ3RoDQoJCWZv cmVhY2goICR0aGlzLT5wYXJ0cyBhcyAkcCApDQoJCQkkdGhpcy0+bWF4X3BhcnRfbGVuID0g bWF4KCAkdGhpcy0+bWF4X3BhcnRfbGVuLCBzdHJsZW4oJHApKTsNCg0KCQkvLyBNYWtlIGEg bmV3IHBhcnQgYXJyYXkgd2l0aCBkdXBsaWNhdGUgc3RyaW5ncyByZW1vdmVkDQoJCSR0aGlz LT51bmlxdWVfcGFydHMgPSBhcnJheV91bmlxdWUoJHRoaXMtPnBhcnRzKTsNCg0KCQkvLyBU cmFuc2Zvcm0gdGhlIHBhdHRlcm4gaW50byBhIGxvdyByZXNvbHV0aW9uIHBydW5pbmcgc3Ry aW5nDQoJCS8vIGJ5IHJlcGxhY2luZyBwYXJ0cyB3aXRoIHNpbmdsZSBjaGFyYWN0ZXJzDQoJ CSR0aGlzLT50cmFuc2ZfcGF0dCA9ICIiOw0KCQlyZXNldCggJHRoaXMtPnBhcnRzICk7DQoJ CXdoaWxlIChsaXN0KCwkcCkgPSBlYWNoKCR0aGlzLT5wYXJ0cykpDQoJCSAgICR0aGlzLT50 cmFuc2ZfcGF0dCAuPSBjaHIoYXJyYXlfc2VhcmNoKCRwLCAkdGhpcy0+dW5pcXVlX3BhcnRz KStvcmQoIkEiKSk7DQoNCgkJLy8gU2VsZiBkaWFnbm9zdGljcw0KCQkkdGhpcy0+dGVzdF9z aG9ydF9zZWFyY2goKTsNCgl9DQoJZnVuY3Rpb24gc2VhcmNoKCAkdGV4dCApIHsNCgkJLy8g RmluZCBhbGwgb2NjdXJlbmNlcyBvZiB1bmlxdWUgcGFydHMgaW4gdGhlDQoJCS8vIGZ1bGwg dGV4dC4gVGhlIHJlc3VsdCBpcyBhbiBhcnJheToNCgkJLy8gICBBcnJheSggPGluZGV4PiA9 PiA8cGFydCM+LCAuLiApDQoJCSRwYXJ0X21hcCA9IEFycmF5KCk7DQoJCXJlc2V0KCAkdGhp cy0+dW5pcXVlX3BhcnRzICk7DQoJCXdoaWxlIChsaXN0KCRwaSwgJHBhcnRfc3RyKSA9IGVh Y2goJHRoaXMtPnVuaXF1ZV9wYXJ0cykpDQoJCXsNCgkJCSRwb3MgPSBzdHJwb3MoJHRleHQs ICRwYXJ0X3N0cik7DQoJCQl3aGlsZSAoICRwb3MgIT09IEZhbHNlICkNCgkJCXsNCgkJCQkk cGFydF9tYXBbJHBvc10gPSAkcGk7DQoJCQkJJHBvcyA9IHN0cnBvcygkdGV4dCwgJHBhcnRf c3RyLCAkcG9zKzEpOw0KCQkJfQ0KCQl9DQoJCWtzb3J0KCAkcGFydF9tYXAgKTsgLy8gU29y dCBieSBzdHJpbmcgaW5kZXgNCg0KCQkvLyBUaGUgZm9sbG93aW5nIGNvZGUgZG9lcyBzZXZl cmFsIHRoaW5ncyBzaW11bHRhbmVvdXNseToNCgkJLy8gIDEpIERpdmlkZSB0aGUgaW5kaWNl cyBpbnRvIGdyb3VwcyB1c2luZyBnYXBzDQoJCS8vCSAgbGFyZ2VyIHRoYW4gJHRoaXMtPm1h eF9lcnIgYXMgYm91bmRhcmllcy4NCgkJLy8gIDIpIFRyYW5zbGF0ZSB0aGUgZ3JvdXBzIGlu dG8gc3RyaW5ncyBzbyB0aGF0DQoJCS8vCSAgcGFydCMgMCA9ICdBJywgcGFydCMgMSA9ICdC JyBldGMuIHRvIG1ha2UNCgkJLy8JICBhIGxvdyByZXNvbHV0aW9uIGFwcHJveGltYXRlIHNl YXJjaCBwb3NzaWJsZSBsYXRlcg0KCQkvLyAgMykgU2F2ZSB0aGUgc3RyaW5nIGluZGljZXMg aW4gdGhlIGZ1bGwgc3RyaW5nDQoJCS8vCSAgdGhhdCBjb3JyZXNwb25kIHRvIGNoYXJhY3Rl cnMgaW4gdGhlIHRyYW5zbGF0ZWQgc3RyaW5nLg0KCQkvLyAgNCkgRGlzY2FyZCBncm91cHMg KD1wYXJ0IHNlcXVlbmNlcykgdGhhdCBhcmUgdG9vDQoJCS8vCSAgc2hvcnQgdG8gY29udGFp biB0aGUgYXBwcm94aW1hdGUgcGF0dGVybi4NCgkJLy8gVGhlIGZvcm1hdCBvZiByZXN1bHRp bmcgYXJyYXk6DQoJCS8vICAgQXJyYXkoDQoJCS8vCSAgQXJyYXkoICI8dHJhbnNsYXRlLXN0 cmluZz4iLA0KCQkvLwkJCSBBcnJheSggPHRyYW5zbGF0ZWQtaWR4PiA9PiA8ZnVsbC1pbmRl eD4sIC4uLiApICksDQoJCS8vCSAgLi4uICkNCgkJJHRyYW5zZiA9IEFycmF5KCk7DQoJCSR0 cmFuc2ZfdGV4dCA9ICIiOw0KCQkkdHJhbnNmX3BvcyA9IEFycmF5KCk7DQoJCSRsYXN0X2Vu ZCA9IDA7DQoJCSRncm91cF9sZW4gPSAwOw0KCQlyZXNldCggJHBhcnRfbWFwICk7DQoJCXdo aWxlIChsaXN0KCRpLCRwKSA9IGVhY2goJHBhcnRfbWFwKSkNCgkJew0KCQkJaWYgKCAkaS0k bGFzdF9lbmQgPiAkdGhpcy0+bWF4X3BhcnRfbGVuKyR0aGlzLT5tYXhfZXJyICkNCgkJCXsN CgkJCQlpZiAoICRncm91cF9sZW4gPj0gKCR0aGlzLT5uX3BhcnRzLSR0aGlzLT5tYXhfZXJy KSkNCgkJCQkJJHRyYW5zZltdID0gQXJyYXkoICR0cmFuc2ZfdGV4dCwgJHRyYW5zZl9wb3Mg KTsNCg0KCQkJCSR0cmFuc2ZfdGV4dCA9ICIiOw0KCQkJCSR0cmFuc2ZfcG9zID0gQXJyYXko KTsNCgkJCQkkZ3JvdXBfbGVuID0gMDsNCgkJCX0NCg0KCQkJJHRyYW5zZl90ZXh0IC49IGNo cigkcCArIG9yZCgiQSIpKTsNCgkJCSR0cmFuc2ZfcG9zW10gPSAkaTsNCgkJCSRncm91cF9s ZW4rKzsNCgkJCSRsYXN0X2VuZCA9ICRpICsgc3RybGVuKCR0aGlzLT5wYXJ0c1skcF0pOw0K CQl9DQoJCWlmICggc3RybGVuKCAkdHJhbnNmX3RleHQgKSA+PSAoJHRoaXMtPm5fcGFydHMt JHRoaXMtPm1heF9lcnIpKQ0KCQkJJHRyYW5zZltdID0gQXJyYXkoICR0cmFuc2ZfdGV4dCwg JHRyYW5zZl9wb3MgKTsNCg0KCQl1bnNldCggJHRyYW5zZl90ZXh0LCAkdHJhbnNmX3BvcyAp Ow0KDQoJCWlmICggY3VycmVudCgkdHJhbnNmKSA9PT0gRmFsc2UgKQ0KCQkJcmV0dXJuIEFy cmF5KCk7DQoNCgkJLy8gRmlsdGVyIHRoZSByZW1haW5pbmcgZ3JvdXBzICgiYXBwcm94aW1h dGUgYW5hZ3JhbXMiDQoJCS8vIG9mIHRoZSBwYXR0ZXJuKSBhbmQgbGVhdmUgb25seSB0aGUg b25lcyB0aGF0IGhhdmUgZW5vdWdoDQoJCS8vIHBhcnRzIGluIGNvcnJlY3Qgb3JkZXIuIFlv dSBjYW4gdGhpbmsgb2YgdGhpcyBsYXN0IHN0ZXAgb2YgdGhlDQoJCS8vIGFsZ29yaXRobSBh cyBhICpsb3cgcmVzb2x1dGlvbiogYXBwcm94aW1hdGUgc3RyaW5nIHNlYXJjaC4NCgkJLy8g VGhlIHJlc3VsdCBpcyBhbiBhcnJheSBvZiBjYW5kaWRhdGUgdGV4dCBzcGFucyB0byBiZSBz Y2FubmVkOg0KCQkvLyAgIEFycmF5KCBBcnJheSg8ZnVsbC1zdGFydC1pZHg+LCA8ZnVsbC1l bmQtaWR4PiksIC4uLiApDQoJCSRwYXJ0X3Bvc2l0aW9ucyA9IEFycmF5KCk7DQoJCXdoaWxl IChsaXN0KCxsaXN0KCRzdHIsICRwb3NfbWFwKSkgPSBlYWNoKCR0cmFuc2YpKQ0KCQl7DQov LwkJCXByaW50ICJ8JHRyYW5zZl9wYXR0fCAtIHwkc3RyfFxuIjsNCgkJCSRsb3Jlc19tYXRj aGVzID0gJHRoaXMtPnNlYXJjaF9zaG9ydCggJHRoaXMtPnRyYW5zZl9wYXR0LCAkdGhpcy0+ bWF4X2VyciwgJHN0ciApOw0KCQkJd2hpbGUgKGxpc3QoJHRyX2VuZCwgKSA9IGVhY2goJGxv cmVzX21hdGNoZXMpKQ0KCQkJew0KCQkJCSR0cl9zdGFydCA9IG1heCgwLCAkdHJfZW5kIC0g JHRoaXMtPm5fcGFydHMpOw0KCQkJCWlmICggJHRyX2VuZCA+PSAkdHJfc3RhcnQgKQ0KCQkJ CXsNCgkJCQkJJG1lZGlhbl9wb3MgPSAkcG9zX21hcFsgKGludCkoKCR0cl9zdGFydCskdHJf ZW5kKS8yKSBdOw0KCQkJCQkkc3RhcnQgPSAkbWVkaWFuX3BvcyAtICgkdGhpcy0+cGF0dF9s ZW4vMisxKSAtICR0aGlzLT5tYXhfZXJyIC0gJHRoaXMtPm1heF9wYXJ0X2xlbjsNCgkJCQkJ JGVuZCA9ICRtZWRpYW5fcG9zICsgKCR0aGlzLT5wYXR0X2xlbi8yKzEpICsgJHRoaXMtPm1h eF9lcnIgKyAkdGhpcy0+bWF4X3BhcnRfbGVuOw0KDQovLwkJCQkJcHJpbnQgIiMiIC4gc3Ry dHIoc3Vic3RyKCAkdGV4dCwgJHN0YXJ0LCAkZW5kLSRzdGFydCApLCAiXG5cciIsICIkJCIp IC4gIiNcbiI7DQovLwkJCQkJcHJpbnRfciggJHRoaXMtPnNlYXJjaF9zaG9ydCggJiR0aGlz LT5wYXR0LCAkdGhpcy0+bWF4X2VyciwgJiR0ZXh0LCAkc3RhcnQsICRlbmQtJHN0YXJ0ICkp Ow0KDQoJCQkJCSRwYXJ0X3Bvc2l0aW9uc1tdID0gQXJyYXkoJHN0YXJ0LCAkZW5kKTsNCgkJ CQl9DQoJCQl9DQoJCQl1bnNldCggJGxvcmVzX21hdGNoZXMgKTsNCgkJfQ0KCQl1bnNldCgg JHRyYW5zZiApOw0KDQoJCWlmICggY3VycmVudCgkcGFydF9wb3NpdGlvbnMpID09PSBGYWxz ZSApDQoJCQlyZXR1cm4gQXJyYXkoKTsNCg0KCQkvLyBTY2FuIHRoZSBmaW5hbCBjYW5kaWRh dGVzIGFuZCBwdXQgdGhlIG1hdGNoZXMgaW4gYSBuZXcgYXJyYXk6DQoJCSRtYXRjaGVzID0g QXJyYXkoKTsNCgkJJHRleHRfbGVuID0gc3RybGVuKCR0ZXh0KTsNCgkJd2hpbGUgKGxpc3Qo LCBsaXN0KCRzdGFydCwgJGVuZCkpID0gZWFjaCgkcGFydF9wb3NpdGlvbnMpKQ0KCQl7DQoJ CQkkbSA9ICR0aGlzLT5zZWFyY2hfc2hvcnQoICR0aGlzLT5wYXR0LCAkdGhpcy0+bWF4X2Vy ciwgJHRleHQsICRzdGFydCwgJGVuZC0kc3RhcnQsICR0ZXh0X2xlbiApOw0KCQkJd2hpbGUg KGxpc3QoJGksICRjb3N0KSA9IGVhY2goJG0pKQ0KCQkJCSRtYXRjaGVzWyRpXSA9ICRjb3N0 Ow0KCQl9DQoJCXVuc2V0KCRwYXJ0X3Bvc2l0aW9ucyk7DQoNCgkJcmV0dXJuICRtYXRjaGVz Ow0KCX0NCn0NCn0NCg0KLyogc21kX2dldFdvcmQNCg0KVGFrZXMgYSBzdHJpbmcgYW5kIGFu IG9mZnNldCBpbnRvIHRoYXQgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBuZWFyZXN0ICJ3b3Jk IiBiZWZvcmUgdGhhdCBvZmZzZXQgcG9zaXRpb24uDQpJZiB0aGUgb2Zmc2V0IGlzIG5vdCBz dXBwbGllZCBpdCBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHRo dXMgcmV0dXJuaW5nIHRoZSBmaXJzdCB3b3JkLg0KDQpUYWtlcyAzIGFyZ3M6DQojIFsqXSBU aGUgKHVzdWFsbHkgbG9vb25nKSBzcGFjZS1kZWxpbWl0ZWQgc3RyaW5nIHRvIGxvb2sgaW4N CiMgWypdIFRoZSB3b3JkIHRvIGxvb2sgZm9yDQojIFRoZSBvZmZzZXQgaW50byB0aGUgc3Ry aW5nIGF0IHdoaWNoIHRvIHN0YXJ0IGxvb2tpbmcNCiovDQoNCmlmICghZnVuY3Rpb25fZXhp c3RzKCJzbWRfZ2V0V29yZCIpKSB7DQpmdW5jdGlvbiBzbWRfZ2V0V29yZCgkaGF5c3RhY2ss JHNlYXJjaHRlcm0sJG9mZnNldD0wKSB7DQoJJG51bXdvcmRzID0gc3RyX3dvcmRfY291bnQo JHNlYXJjaHRlcm0pOw0KDQoJJGxlbiA9IHN0cmxlbigkaGF5c3RhY2spOw0KDQoJLy8gSWYg d2UncmUgbWlkLXdvcmQsIGZpbmQgaXRzIGVuZA0KCSRpZHggPSAkb2Zmc2V0LTE7DQoJd2hp bGUgKCRpZHggPCAkbGVuICYmICRoYXlzdGFja1skaWR4XSAhPSAiICIpIHsNCgkJJGlkeCsr Ow0KCX0NCgkkb2Zmc2V0ID0gJGlkeDsNCg0KCS8vIE1vdmUgdGhlIHdvcmQgd2Ugd2FudCB0 byB0aGUgc3RhcnQNCgkkaGF5c3RhY2sgPSB0cmltKHN0cnJldihzdWJzdHIoJGhheXN0YWNr LDAsJG9mZnNldCkpKTsNCg0KCS8vIE1ha2Ugc3VyZSB0byByZXR1cm4gdGhlIGNvcnJlY3Qg bnVtYmVyIG9mIHdvcmRzDQoJJHNwYWNlUG9zID0gZmFsc2U7DQoJZm9yICgkaWR4ID0gMDsg JGlkeCA8ICRudW13b3JkczsgJGlkeCsrKSB7DQoJCSRzcGFjZVBvcyA9IChzdHJwb3MoJGhh eXN0YWNrLCAiICIsICRzcGFjZVBvcykpOw0KCQlpZiAoJHNwYWNlUG9zICE9PSBmYWxzZSkg ew0KCQkJJHNwYWNlUG9zICs9IDE7DQoJCX0NCgl9DQoNCglyZXR1cm4gdHJpbShzdHJyZXYo KCgkc3BhY2VQb3MgPT09IGZhbHNlKSA/ICRoYXlzdGFjayA6IHN1YnN0cigkaGF5c3RhY2ss IDAsICRzcGFjZVBvcykpKSk7DQp9DQp9IjtzOjQ6InR5cGUiO3M6MToiMCI7czo1OiJvcmRl ciI7czoxOiI1IjtzOjQ6ImhlbHAiO3M6MTQ2OTU6Igk8cD48ZGl2IGlkPSJzbWRfaGVscCI+ PC9wPgoKCTxoMT5zbWRfZnV6enlfZmluZDwvaDE+CgoJPHA+RXZlciB3YW50ZWQgPHNwYW4g Y2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4mIzgyMTc7cyBzZWFyY2ggZmFjaWxpdHkgdG8gYmUg YSBsaXR0bGUgbW9yZSwgd2VsbCwgaW5hY2N1cmF0ZT8gSGVscCBwZW9wbGUgd2l0aCBmYXQg ZmluZ2VycyB0byBmaW5kIHdoYXQgdGhleSB3ZXJlIGFjdHVhbGx5IGxvb2tpbmcgZm9yIHdp dGggdGhpcyB0b29sIHRoYXQgY2FuIGZpbmQgbWlzLXNwZWxsZWQgb3IgbGlrZS1zb3VuZGlu ZyB3b3JkcyBmcm9tIHNlYXJjaCByZXN1bHRzLjwvcD4KCgk8cD5SZXN1bHRzIGFyZSBvcmRl cmVkIGJ5IGFwcHJveGltYXRlIHJlbGV2YW5jeSBhbmQgaXQmIzgyMTc7cyBhdXRvbWF0aWNh bGx5IGNvbnRleHQtc2Vuc2l0aXZlIGJlY2F1c2UgdGhlIHBvb2wgb2Ygd29yZHMgaXQgY29t cGFyZXMgYWdhaW5zdCBhcmUgZnJvbSB5b3VyIHNpdGUuIE9uIGEgem9vIHdlYnNpdGUsIHNv bWVvbmUgdHlwaW5nIGluICYjODIyMDtsaW5vJiM4MjIxOyB3b24mIzgyMTc7dCBnZXQgYXJ0 aWNsZXMgYWJvdXQgZmxvb3JpbmcgYnV0IG1vcmUgbGlrZWx5IGFydGljbGVzIGFib3V0IGxp b25zLCB3aGljaCBpcyB3aGF0IHRoZXkgcmVhbGx5IHdhbnRlZC4gV2UgaG9wZS48L3A+CgoJ PGgyPkZlYXR1cmVzPC9oMj4KCgk8dWw+CgkJPGxpPlNlYXJjaCBmb3Igc2ltaWxhcmx5IHNw ZWxsZWQsIG9yIHNpbWlsYXIgc291bmRpbmcgd29yZHMgKG1heSBiZSBzd2l0Y2hlZCBvbi9v ZmYpPC9saT4KCQk8bGk+TGltaXQgdGhlIHNlYXJjaCB0byBhcnRpY2xlIDxjb2RlPnN0YXR1 czwvY29kZT4sIDxjb2RlPnNlY3Rpb248L2NvZGU+IG9yIDxjb2RlPmNhdGVnb3J5PC9jb2Rl PiB0byBzcGVlZCB1cCBwcm9jZWVkaW5nczwvbGk+CgkJPGxpPlR3ZWFrIHNlbnNpdGl2aXR5 IHRvIGdpdmUgYmV0dGVyIHJlc3VsdHMgKG1vcmUgc3BlY2lmaWMsIGxlc3MgbGlrZWx5IHRv IGZpbmQgYSBtYXRjaCkgb3IgZ2VuZXJhbCByZXN1bHRzIChsZXNzIHNwZWNpZmljLCBtYXkg bWF0Y2ggc3R1ZmYgeW91IGRvbiYjODIxNzt0IGV4cGVjdCk8L2xpPgoJCTxsaT5DYW4gb2Zm ZXIgbGlua3MgdG8gZXhhY3Qgc2VhcmNoIHRlcm1zIGlmIHlvdSB3aXNoIChhIGJpdCBsaWtl IEdvb2dsZSYjODIxNztzICYjODIyMDtEaWQgeW91IG1lYW4gJiM4MjMwOyYjODIyMTspPC9s aT4KCQk8bGk+RGlzcGxheSBtYXRjaGluZyBhcnRpY2xlcyB1c2luZyBhIGZvcm0vY29udGFp bmVyLiBEZWZhdWx0IGlzIHRoZSBidWlsdC1pbiA8Y29kZT5zZWFyY2hfcmVzdWx0czwvY29k ZT4gZm9ybTwvbGk+CgkJPGxpPlVubGVzcyBvdmVycmlkZGVuIHVzaW5nIHRoZSA8Y29kZT5t YXRjaF93aXRoPC9jb2RlPiBhdHRyaWJ1dGUsIHRoZSBUaXRsZSBhbmQgQm9keSB3aWxsIGJl IHNlYXJjaGVkLiBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgaGF2ZSBzZXQgdGhlIHNlYXJjaCBs b2NhdGlvbnMgdXNpbmcgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92 aWV3dG9waWMucGhwP2lkPTI5MDM2Ij53ZXRfaGF5c3RhY2s8L2E+IHRoZW4gdGhvc2UgcGxh Y2VzIHdpbGwgYmUgc2VhcmNoZWQgaW5zdGVhZDwvbGk+Cgk8L3VsPgoKCTxoMj5BdXRob3I8 L2gyPgoKCTxwPjxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9jb21tZW50Rm9ybSI+ U3RlZiBEYXdzb248L2E+LCB3aXRoIG5vdGFibGUgbWVudGlvbiB0byA8YSBocmVmPSJodHRw Oi8vZWxvbmVuLmlraS5maS9jb2RlL21pc2Mtbm90ZXMvYXBwci1zZWFyY2gtcGhwL2luZGV4 Lmh0bWwiPkphcm5vIEVsb25lbjwvYT4gZm9yIHRoZSBGdXp6eSBGaW5kIGFsZ29yaXRobSB3 aGljaCAmIzgyMTI7IHRvIHRoaXMgZGF5ICYjODIxMjsgcmVtYWlucyBtZXJlIHZvb2RvbyB0 byBtZS48L3A+CgoJPGgyPkluc3RhbGxhdGlvbiAvIFVuaW5zdGFsbGF0aW9uPC9oMj4KCgk8 cCBjbGFzcz0icmVxdWlyZWQiPlJlcXVpcmVzIFRleHRwYXR0ZXJuIDQuMC43IGFuZCA8YSBo cmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vZG93bmxvYWRzL3NtZF9saWJfdjAuMzMudHh0 Ij5zbWRfbGliIHYwLjMzPC9hPiBtdXN0IGJlIGluc3RhbGxlZCBhbmQgYWN0aXZhdGVkLjwv cD4KCgk8cD5Eb3dubG9hZCB0aGUgcGx1Z2luIGZyb20gZWl0aGVyIDxhIGhyZWY9Imh0dHA6 Ly90ZXh0cGF0dGVybi5vcmcvcGx1Z2lucy85MzIvc21kX2Z1enp5X2ZpbmQiPnRleHRwYXR0 ZXJuLm9yZzwvYT4sIG9yIHRoZSA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vc3ci PnNvZnR3YXJlIHBhZ2U8L2E+LCBwYXN0ZSB0aGUgY29kZSBpbnRvIHRoZSA8c3BhbiBjbGFz cz0iY2FwcyI+VFhQPC9zcGFuPiBBZG1pbiAtJmd0OyBQbHVnaW5zIHBhbmUsIGluc3RhbGwg YW5kIGVuYWJsZSB0aGUgcGx1Z2luLiBWaXNpdCB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVt LnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTI1MzY3Ij5mb3J1bSB0aHJlYWQ8 L2E+IGZvciBtb3JlIGluZm8gb3IgdG8gcmVwb3J0IG9uIHRoZSBzdWNjZXNzIG9yIG90aGVy d2lzZSBvZiB0aGUgcGx1Z2luLjwvcD4KCgk8cD5UbyB1bmluc3RhbGwsIHNpbXBseSBkZWxl dGUgZnJvbSB0aGUgQWRtaW4gLSZndDsgUGx1Z2lucyBwYWdlLjwvcD4KCgk8aDI+VXNhZ2U8 L2gyPgoKCTxwPlRoZSBwbHVnaW4gaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gYSByZXBsYWNl bWVudCBmb3IgdGhlIGJ1aWx0LWluIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IHNl YXJjaDsgaXQgc2hvdWxkIGJlIHVzZWQgdG8gYXVnbWVudCBpdCwgbGlrZSB0aGlzOjwvcD4K CjxwcmUgY2xhc3M9ImJsb2NrIj48Y29kZSBjbGFzcz0iYmxvY2siPiZsdDt0eHA6aWZfc2Vh cmNoJmd0OwogICZsdDtkbCBjbGFzcz0mcXVvdDtyZXN1bHRzJnF1b3Q7Jmd0OwogICAgJmx0 O3R4cDpjaGhfaWZfZGF0YSZndDsKICAgICAgJmx0O3R4cDphcnRpY2xlIGxpbWl0PSZxdW90 OzgmcXVvdDsgc2VhcmNoZm9ybT0mcXVvdDtleGNlcnB0cyZxdW90OyAvJmd0OwogICAgJmx0 O3R4cDplbHNlIC8mZ3Q7CiAgICAgICZsdDt0eHA6c21kX2Z1enp5X2ZpbmQgZm9ybT0mcXVv dDtleGNlcnB0cyZxdW90OyAvJmd0OwogICAgJmx0Oy90eHA6Y2hoX2lmX2RhdGEmZ3Q7CiAg Jmx0Oy9kbCZndDsKJmx0Oy90eHA6aWZfc2VhcmNoJmd0Owo8L2NvZGU+PC9wcmU+CgoJPHA+ RXhhY3QgbWF0Y2hlcyB3aWxsIGJlIHByb2Nlc3NlZCBhcyBub3JtYWwgYnV0IG1pc21hdGNo ZXMgd2lsbCBiZSBoYW5kbGVkIGJ5IHNtZF9mdXp6eV9maW5kLiBJZiB5b3UgdHJ5IHRvIHVz ZSBzbWRfZnV6enlfZmluZCBvbiBpdHMgb3duLCB5b3Ugd2lsbCBsaWtlbHkgcmVjZWl2ZSBh IHdhcm5pbmcgYWJvdXQgYSBtaXNzaW5nIDxjb2RlPiZsdDt0eHA6YXJ0aWNsZSAvJmd0Ozwv Y29kZT4gdGFnLjwvcD4KCgk8aDMgY2xhc3M9InRhZyI+QXR0cmlidXRlczwvaDM+CgoJPHRh YmxlPgoJCTx0cj4KCQkJPHRoPkF0dHJpYnV0ZSBuYW1lIDwvdGg+CgkJCTx0aD5EZWZhdWx0 IDwvdGg+CgkJCTx0aD5WYWx1ZXMgPC90aD4KCQkJPHRoPkRlc2NyaXB0aW9uIDwvdGg+CgkJ PC90cj4KCQk8dHI+CgkJCTx0ZD4gc2VhcmNoX3Rlcm0gPC90ZD4KCQkJPHRkPiA8Y29kZT4/ cTwvY29kZT4gPC90ZD4KCQkJPHRkPiA8Y29kZT4/cTwvY29kZT4gb3IgYW55IHRleHQgPC90 ZD4KCQkJPHRkPiBZb3UgbWF5IHVzZSBhIGZpeGVkIHN0cmluZyBoZXJlIGJ1dCBpdCYjODIx NztzIHJhdGhlciBwb2ludGxlc3MgPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPiBtYXRj aF93aXRoIDwvdGQ+CgkJCTx0ZD4gPGNvZGU+YXJ0aWNsZTpib2R5O3RpdGxlPC9jb2RlPiBv ciB3ZXRfaGF5c3RhY2sgY3JpdGVyaWEgPC90ZD4KCQkJPHRkPiA8Y29kZT5rZXl3b3Jkczwv Y29kZT4gLyA8Y29kZT5ib2R5PC9jb2RlPiAvIDxjb2RlPmV4Y2VycHQ8L2NvZGU+IC8gPGNv ZGU+Y2F0ZWdvcnkxPC9jb2RlPiAvIDxjb2RlPmNhdGVnb3J5MjwvY29kZT4gLyA8Y29kZT5z ZWN0aW9uPC9jb2RlPiAvIDxjb2RlPmlkPC9jb2RlPiAvIDxjb2RlPmF1dGhvcmlkPC9jb2Rl PiAvIDxjb2RlPnRpdGxlPC9jb2RlPiAvIDxjb2RlPmN1c3RvbV8xPC9jb2RlPiAvIGV0YyA8 L3RkPgoJCQk8dGQ+IFdoaWNoIGFydGljbGUgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHRvIG1h dGNoLiBEZWZpbmUgdGhlIG9iamVjdCB5b3Ugd2FudCB0byBsb29rIGluIChjdXJyZW50bHkg b25seSA8Y29kZT5hcnRpY2xlPC9jb2RlPiBpcyBzdXBwb3J0ZWQpIGZvbGxvd2VkIGJ5IGEg Y29sb24sIHRoZW4gYSBsaXN0IG9mIHNlbWktY29sb24gc2VwYXJhdGVkIHBsYWNlcyB0byBs b29rIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gc2hvdyA8L3RkPgoJCQk8dGQ+IDxj b2RlPndvcmRzLCBhcnRpY2xlczwvY29kZT4gPC90ZD4KCQkJPHRkPiAgPGNvZGU+d29yZHMs IGFydGljbGVzPC9jb2RlPiAvIDxjb2RlPndvcmRzPC9jb2RlPiAvIDxjb2RlPmFydGljbGVz PC9jb2RlPiA8L3RkPgoJCQk8dGQ+IFdoZXRoZXIgdG8gbGlzdCB0aGUgY2xvc2VzdCBtYXRj aGluZyBhcnRpY2xlcywgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgc2VhcmNoIHRlcm1zLCBvciBi b3RoIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gc2VjdGlvbiA8L3RkPgoJCQk8dGQ+ IDxlbT51bnNldDwvZW0+IChpLmUuIHNlYXJjaCB0aGUgd2hvbGUgc2l0ZSkgPC90ZD4KCQkJ PHRkPiBhbnkgdmFsaWQgc2VjdGlvbiBjb250YWluaW5nIGFydGljbGVzIDwvdGQ+CgkJCTx0 ZD4gTGltaXQgdGhlIHNlYXJjaCB0byBvbmUgb3IgbW9yZSBzZWN0aW9uczsgZ2l2ZSBhIGNv bW1hLXNlcGFyYXRlZCBsaXN0LiBZb3UgY2FuIHVzZSA8Y29kZT4/czwvY29kZT4gZm9yIHRo ZSBjdXJyZW50IHNlY3Rpb24gb3IgPGNvZGU+IXM8L2NvZGU+IGZvciBhbnl0aGluZyBleGNl cHQgdGhlIGN1cnJlbnQgc2VjdGlvbiwgb3IgeW91IGNhbiByZWFkIHRoZSB2YWx1ZSBmcm9t IGFub3RoZXIgcGFydCBvZiB0aGUgYXJ0aWNsZSwgYSBjdXN0b20gZmllbGQgLyB0eHA6dmFy aWFibGUgLyB1cmwgdmFyaWFibGUgPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPiBjYXRl Z29yeSA8L3RkPgoJCQk8dGQ+IDxlbT51bnNldDwvZW0+IChpLmUuIHNlYXJjaCBhbGwgY2F0 ZWdvcmllcykgPC90ZD4KCQkJPHRkPiBhbnkgdmFsaWQgYXJ0aWNsZSBjYXRlZ29yeSA8L3Rk PgoJCQk8dGQ+IExpbWl0IHRoZSBzZWFyY2ggdG8gb25lIG9yIG1vcmUgY2F0ZWdvcmllczsg Z2l2ZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBZb3UgY2FuIHVzZSA8Y29kZT4/YzwvY29k ZT4gZm9yIHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeSBvciA8Y29kZT4hYzwvY29kZT4g Zm9yIGFsbCBjYXRzIGV4Y2VwdCB0aGUgY3VycmVudCBvbmUuIExpa2UgPGNvZGU+c2VjdGlv bjwvY29kZT4geW91IGNhbiByZWFkIGZyb20gb3RoZXIgcGxhY2VzIHRvbyA8L3RkPgoJCTwv dHI+CgkJPHRyPgoJCQk8dGQ+IHN1YmxldmVsIChmb3JtZXJseSA8ZW0+c3ViY2F0czwvZW0+ KTwvdGQ+CgkJCTx0ZD4gPGNvZGU+MDwvY29kZT4gPC90ZD4KCQkJPHRkPiBpbnRlZ2VyIC8g PGNvZGU+YWxsPC9jb2RlPiA8L3RkPgoJCQk8dGQ+IE51bWJlciBvZiBzdWJjYXRlZ29yeSBs ZXZlbHMgdG8gdHJhdmVyc2UuIDxjb2RlPjA8L2NvZGU+ID0gdG9wLWxldmVsIG9ubHk7IDxj b2RlPjE8L2NvZGU+ID0gdG9wIGxldmVsICsgb25lIHN1Yi1sZXZlbDsgYW5kIHNvIG9uIDwv dGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gc3RhdHVzIDwvdGQ+CgkJCTx0ZD4gPGNvZGU+ bGl2ZSwgc3RpY2t5PC9jb2RlPiA8L3RkPgoJCQk8dGQ+IDxjb2RlPmxpdmU8L2NvZGU+IC8g PGNvZGU+c3RpY2t5PC9jb2RlPiAvIDxjb2RlPmhpZGRlbjwvY29kZT4gLyA8Y29kZT5wZW5k aW5nPC9jb2RlPiAvIDxjb2RlPmRyYWZ0PC9jb2RlPiBvciBhbnkgY29tYmluYXRpb24gPC90 ZD4KCQkJPHRkPiBSZXN0cmljdHMgdGhlIHNlYXJjaCB0byBwYXJ0aWN1bGFyIHR5cGVzIG9m IGRvY3VtZW50IHN0YXR1cyA8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+IHRvbGVyYW5j ZSA8L3RkPgoJCQk8dGQ+IDxjb2RlPjI8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4gMCAmIzgyMTE7 IDUgPC90ZD4KCQkJPHRkPiBIb3cgZnV6enkgdGhlIHNlYXJjaCBpcyBhbmQgaG93IGxvbmcg dGhlIG1pbmltdW0gc2VhcmNoIHRlcm0gaXMgYWxsb3dlZCB0byBiZS4gMCBtZWFucyBhIHZl cnkgY2xvc2UgbWF0Y2gsIHRoYXQgYWxsb3dzIHNob3J0IHNlYXJjaCB3b3Jkcy4gNSBtZWFu cyBpdCYjODIxNztzIHF1aXRlIHJlbGF4ZWQgYW5kIGlzIGxpa2VsdCByZXR1cm4gbm90aGlu ZyBsaWtlIHdoYXQgeW91IHNlYXJjaGVkIGZvcjsgc2VhcmNoIHdvcmRzIG11c3QgdGhlbiBi ZSBsb25nZXIsIHJvdWdobHkgJmd0OzcgY2hhcmFjdGVycy4gUHJhY3RpY2FsIHZhbHVlcyBh cmUgMC0zIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gcmVmaW5lICA8L3RkPgoJCQk8 dGQ+IDxjb2RlPnNvdW5kZXgsIG1ldGFwaG9uZTwvY29kZT4gPC90ZD4KCQkJPHRkPiA8Y29k ZT5zb3VuZGV4PC9jb2RlPiwgPGNvZGU+bWV0YXBob25lPC9jb2RlPiBvciA8Y29kZT5zb3Vu ZGV4LCBtZXRhcGhvbmU8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4gU3dpdGNoIG9uIHNvdW5kZXgg YW5kL29yIG1ldGFwaG9uZSBzdXBwb3J0IGZvciBwb3RlbnRpYWxseSBiZXR0ZXIgbWF0Y2hp bmcgKHRob3VnaCBpdCYjODIxNztzIHVzdWFsbHkgb25seSBvZiB1c2UgaW4gRW5nbGlzaCkg PC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPiBjYXNlX3NlbnNpdGl2ZSA8L3RkPgoJCQk8 dGQ+IDxjb2RlPjA8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4gPGNvZGU+MDwvY29kZT4gKG9mZikg LyA8Y29kZT4xPC9jb2RlPiAoY2FzZS1zZW5zaXRpdmUpIDwvdGQ+CgkJCTx0ZD4gRG9lcyB3 aGF0IGl0IHNheXMgb24gdGhlIHRpbiA8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+IG1p bl93b3JkX2xlbmd0aCA8L3RkPgoJCQk8dGQ+IDxjb2RlPjQ8L2NvZGU+IDwvdGQ+CgkJCTx0 ZD4gaW50ZWdlciA8L3RkPgoJCQk8dGQ+IFRoZSBtaW5pbXVtIHdvcmQgbGVuZ3RoIGFsbG93 ZWQgaW4gdGhlIHNlYXJjaCByZXN1bHRzIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4g bGltaXQgPC90ZD4KCQkJPHRkPiA8Y29kZT53b3Jkczo1LCBhcnRpY2xlczoxMDwvY29kZT4g PC90ZD4KCQkJPHRkPiBpbnRlZ2VyIC8gPGNvZGU+d29yZHM6PC9jb2RlPiArIGEgbnVtYmVy IC8gPGNvZGU+YXJ0aWNsZXM6PC9jb2RlPiArIGEgbnVtYmVyIDwvdGQ+CgkJCTx0ZD4gVGhl IG1heGltdW0gbnVtYmVyIG9mIHdvcmRzIGFuZC9vciBhcnRpY2xlcyB0byBkaXNwbGF5IGlu IHRoZSByZXN1bHRzLiBVc2UgYSBzaW5nbGUgaW50ZWdlciB0byBsaW1pdCBib3RoIHRvIHRo ZSBzYW1lIHZhbHVlLiBTcGVjaWZ5IDxjb2RlPmFydGljbGVzOjU8L2NvZGU+IHRvIHJlbW92 ZSBhbnkgbGltaXQgb24gdGhlIG51bWJlciBvZiBhbHRlcm5hdGl2ZSBzZWFyY2ggd29yZHMg b2ZmZXJlZCwgYW5kIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgYXJ0aWNsZXMgdG8g YSBtYXhpbXVtIG9mIDUuIFNpbWlsYXJseSwgPGNvZGU+d29yZHM6NDwvY29kZT4gd2lsbCBy ZW1vdmUgdGhlIGFydGljbGUgbGltaXQsIGJ1dCBvbmx5IHNob3cgYSBtYXhpbXVtIG9mIDQg YWx0ZXJuYXRpdmUgd29yZHMuIEJvdGggb2YgdGhlc2UgYXJlIHN1YmplY3QgdG8gdGhlaXIg cmVzcGVjdGl2ZSA8Y29kZT5zaG93PC9jb2RlPiBvcHRpb25zIGJlaW5nIHNldCA8L3RkPgoJ CTwvdHI+CgkJPHRyPgoJCQk8dGQ+IGZvcm0gPC90ZD4KCQkJPHRkPiA8Y29kZT5zZWFyY2hf cmVzdWx0czwvY29kZT4gPC90ZD4KCQkJPHRkPiBhbnkgdmFsaWQgZm9ybSBuYW1lIDwvdGQ+ CgkJCTx0ZD4gVGhlIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+VFhQ PC9zcGFuPjwvc3Bhbj4gZm9ybSB3aXRoIHdoaWNoIHRvIHByb2Nlc3MgZWFjaCBtYXRjaGlu ZyBhcnRpY2xlLiBZb3UgbWF5IGFsc28gdXNlIHRoZSBwbHVnaW4gYXMgYSBjb250YWluZXIu IE5vdGUgdGhhdCA8Y29kZT4mbHQ7dHhwOnNlYXJjaF9yZXN1bHRfZXhjZXJwdCAvJmd0Ozwv Y29kZT4gaXMgaG9ub3VyZWQgYXMgY2xvc2VseSBhcyBwb3NzaWJsZSwgaS5lLiBpZiB0aGUg Y2xvc2VzdCB3b3JkcyBhcmUgZm91bmQgaW4gdGhlIGtleXdvcmRzLCBib2R5IG9yIGV4Y2Vy cHQgZmllbGRzLiBJZiB0aGV5IGFyZSBmb3VuZCBpbiBhbnkgb3RoZXIgbG9jYXRpb24gKGUu Zy4gY3VzdG9tXzMpIHRoZSBhcnRpY2xlIHRpdGxlIHdpbGwgYmUgcmV0dXJuZWQgYnV0IHRo ZSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQgd2lsbCBsaWtlbHkgYmUgZW1wdHkuIFRoaXMgaXMg YSBsaW1pdGF0aW9uIG9mIHRoYXQgdGFnLCBub3QgdGhlIHBsdWdpbiBkaXJlY3RseSA8L3Rk PgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+IGRlbGltIDwvdGQ+CgkJCTx0ZD4gPGNvZGU+LDwv Y29kZT4gPC90ZD4KCQkJPHRkPiBhbnkgY2hhcmFjdGVycyA8L3RkPgoJCQk8dGQ+IENoYW5n ZSB0aGUgZGVsaW1pdGVyIGZvciBhbGwgb3B0aW9ucyB0aGF0IHRha2UgYSBjb21tYS1zZXBh cmF0ZWQgbGlzdCA8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+IG5vX21hdGNoX2xhYmVs IDwvdGQ+CgkJCTx0ZD4gPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5N TFA8L3NwYW4+PC9zcGFuPjogPGNvZGU+bm9fbWF0Y2g8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4g YW55IHRleHQgb3IgPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8 L3NwYW4+PC9zcGFuPiBzdHJpbmcgPC90ZD4KCQkJPHRkPiBUaGUgcGhyYXNlIHRvIGRpc3Bs YXkgd2hlbiBubyBtYXRjaGVzIChtYXliZSBub3QgZXZlbiBmdXp6eSBvbmVzKSBhcmUgZm91 bmQuIFVzZSA8Y29kZT5ub19tYXRjaF9sYWJlbD0mcXVvdDsmcXVvdDs8L2NvZGU+IHRvIHR1 cm4gaXQgb2ZmIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gc3VnZ2VzdF9sYWJlbCA8 L3RkPgoJCQk8dGQ+IDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+TUxQ PC9zcGFuPjwvc3Bhbj46IDxjb2RlPnN1Z2dlc3Q8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4gYW55 IHRleHQgb3IgPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3Nw YW4+PC9zcGFuPiBzdHJpbmcgPC90ZD4KCQkJPHRkPiBUaGUgcGhyYXNlIHRvIGRpc3BsYXkg aW1tZWRpYXRlbHkgcHJpb3IgdG8gc2hvd2luZyBjbG9zZS1tYXRjaGluZyBhcnRpY2xlcy93 b3Jkcy4gVXNlIDxjb2RlPnN1Z2dlc3RfbGFiZWw9JnF1b3Q7JnF1b3Q7PC9jb2RlPiB0byBz d2l0Y2ggaXQgb2ZmIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gdG9vX3Nob3J0X2xh YmVsIDwvdGQ+CgkJCTx0ZD4gPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBz Ij5NTFA8L3NwYW4+PC9zcGFuPjogPGNvZGU+dG9vX3Nob3J0PC9jb2RlPiA8L3RkPgoJCQk8 dGQ+IGFueSB0ZXh0IG9yIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+ TUxQPC9zcGFuPjwvc3Bhbj4gc3RyaW5nICA8L3RkPgoJCQk8dGQ+IFNlYXJjaGVzIG9mIHVu ZGVyIGFib3V0IDMgY2hhcmFjdGVycyAoc29tZXRpbWVzIG1vcmUgZGVwZW5kaW5nIG9uIHlv dXIgY29udGVudCkgYXJlIHRvbyBzaG9ydCBmb3IgYW55IHJlYXNvbmFibGUgZnV6emluZXNz IHRvIGJlIGFwcGxpZWQuIFRoaXMgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgaW4gdGhhdCBjaXJj dW1zdGFuY2UuIFVzZSA8Y29kZT50b29fc2hvcnRfbGFiZWw9JnF1b3Q7JnF1b3Q7PC9jb2Rl PiB0byBzd2l0Y2ggaXQgb2ZmIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gbGFiZWx0 YWcgPC90ZD4KCQkJPHRkPiA8Y29kZT5wPC9jb2RlPiA8L3RkPgoJCQk8dGQ+IGFueSB2YWxp ZCB0YWcgbmFtZSwgd2l0aG91dCBpdHMgYnJhY2tldHMgPC90ZD4KCQkJPHRkPiBUaGUgKFgp SFRNTCB0YWcgaW4gd2hpY2ggdG8gd3JhcCBhbnkgbGFiZWxzIDwvdGQ+CgkJPC90cj4KCTwv dGFibGU+CgoJPGgyPlRpcHMgYW5kIHRyaWNrczwvaDI+CgoJPHVsPgoJCTxsaT5JZiB5b3Ug Y2FuLCBsaW1pdCB0aGUgc2VhcmNoIGNyaXRlcmlhIHVzaW5nIDxjb2RlPnN0YXR1czwvY29k ZT4sIDxjb2RlPnNlY3Rpb248L2NvZGU+IGFuZCA8Y29kZT5jYXRlZ29yeTwvY29kZT4gdG8g aW1wcm92ZSBwZXJmb3JtYW5jZTwvbGk+CgkJPGxpPlR3ZWFrIHRoZSA8Y29kZT5yZWZpbmU8 L2NvZGU+IG9wdGlvbnMgdG8gc2VlIGlmIHlvdSBnZXQgYmV0dGVyIG9yIHdvcnNlIHJlc3Vs dHMgZm9yIHlvdXIgY29udGVudCAvIGxhbmd1YWdlPC9saT4KCQk8bGk+TW9zdCBvZiB0aGUg ZGVmYXVsdCB2YWx1ZXMgYXJlIG9wdGltYWwgZm9yIGdvb2QgcmVzdWx0cywgYnV0IGZvciBz Y2llbnRpZmljIG9yIHNwZWNpYWxpc3Qgc2l0ZXMgeW91IG1heSB3aXNoIHRvIGluY3JlYXNl IHRoZSA8Y29kZT50b2xlcmFuY2U8L2NvZGU+IGFuZCA8Y29kZT5taW5fd29yZF9sZW5ndGg8 L2NvZGU+IHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlczwvbGk+CgkJPGxpPkZvciBvZmZlcmlu ZyBhbiBhZHZhbmNlZCBzZWFyY2ggZmFjaWxpdHksIHdyaXRlIGFuIDxzcGFuIGNsYXNzPSJj YXBzIj5IVE1MPC9zcGFuPiBmb3JtIHRoYXQgYWxsb3dzIHBlb3BsZSB0byBjdXN0b21pc2Ug dGhlIHNlYXJjaCBjcml0ZXJpYSAoZS5nLiBjaGVjayBib3hlcyBmb3IgPGNvZGU+bWV0YXBo b25lPC9jb2RlPiAvIDxjb2RlPnNvdW5kZXggLyBjYXNlX3NlbnNpdGl2ZTwvY29kZT4gOyB0 ZXh0IGJveGVzIGZvciA8Y29kZT50b2xlcmFuY2U8L2NvZGU+IC8gPGNvZGU+bWluX3dvcmRf bGVuZ3RoPC9jb2RlPiAvIDxjb2RlPmxpbWl0PC9jb2RlPiA7IHNlbGVjdCBsaXN0cyBvZiBj YXRlZ29yaWVzIHRvIHNlYXJjaCA7IGV0YykuIFRoZW4gdXNlIGEgc2VyaWVzIG9mIHNtZF9p ZiBzdGF0ZW1lbnRzIGluc2lkZSB5b3VyIDxjb2RlPiZsdDt0eHA6aWZfc2VhcmNoIC8mZ3Q7 PC9jb2RlPiB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBlYWNoIDxzcGFuIGNsYXNz PSJjYXBzIj5VUkw8L3NwYW4+IHZhcmlhYmxlLCBjaGVjayB0aGV5IGhhdmUgYWNjZXB0YWJs ZSB2YWx1ZXMgYW5kIHRoZW4gcGx1ZyB0aGVtIGludG8gdGhlIHNtZF9mdXp6eV9maW5kIHRh ZyB1c2luZyByZXBsYWNlbWVudHMgc3VjaCBhcyA8Y29kZT50b2xlcmFuY2U9JnF1b3Q7e3Nt ZF9pZl90b2xlcmFuY2V9JnF1b3Q7PC9jb2RlPjwvbGk+Cgk8L3VsPgoKCTxoMj5Lbm93biBp c3N1ZXM8L2gyPgoKCTx1bD4KCQk8bGk+U2xvdyB3aXRoIGxhcmdlIGFydGljbGUgc2V0czwv bGk+CgkJPGxpPlNlYXJjaGluZyBmb3IgYSB3b3JkIHdpdGggYW4gYXBvc3Ryb3BoZSBpbiBp dCBtYXkgY2F1c2Ugb2RkIGNoYXJhY3RlciBlbmNvZGluZyBvciBpbmNvbXBsZXRlIHJlc3Vs dHM8L2xpPgoJCTxsaT5TZWFyY2hpbmcgZm9yIG11bHRpcGxlIChzcGFjZS1zZXBhcmF0ZWQp IHdvcmRzIGNhbiBsZWFkIHRvIG9kZCByZXN1bHRzPC9saT4KCQk8bGk+U29tZXRpbWVzIGl0 IG1ha2VzIHlvdSBsYXVnaCBhbmQgcGlja3Mgc29tZXRoaW5nIHRoYXQgc2VlbXMgdG90YWxs eSB1bnJlbGF0ZWQ8L2xpPgoJPC91bD4KCgk8aDI+Q2hhbmdlbG9nPC9oMj4KCgk8dWw+CgkJ PGxpPjI2IE1hciAwNyB8IHYwLjAxIHwgSW5pdGlhbCBwdWJsaWMgYmV0YTwvbGk+CgkJPGxp PjMxIE1hciAwNyB8IHYwLjAyIHwgRml4ZWQgY2FzZSBzZW5zaXRpdml0eSA7IHNwZWQgdXAg YW5kIGltcHJvdmVkIHdvcmRsaXN0IGdlbmVyYXRpb24gOyBhZGRlZCA8Y29kZT5yZWZpbmU8 L2NvZGU+IHRvIHN3aXRjaCBvZmYgc291bmRleC9tZXRhcGhvbmUgaWYgcmVxdWlyZWQ8L2xp PgoJCTxsaT4wNiBBdWcgMDcgfCB2MC4wMyB8IEZpeGVkOiBtdWx0aS13b3JkIHNlYXJjaGlu ZyAoPGNvZGU+c21kX2dldFdvcmQ8L2NvZGU+IGJ1ZykgYW5kIDxjb2RlPnNlYXJjaF9yZXN1 bHRfZXhjZXJwdDwvY29kZT4gOyBhZGRlZCA8Y29kZT5jYXRlZ29yeTwvY29kZT4gYW5kIDxj b2RlPnN0YXR1czwvY29kZT4gc3VwcG9ydDwvbGk+CgkJPGxpPjMwIERlYyAwNyB8IHYwLjEg fCBPZmZpY2lhbCBmaXJzdCByZWxlYXNlLiBBZGRlZCA8Y29kZT5sYWJlbHRhZzwvY29kZT4g YW5kIGN1c3RvbSBmaWVsZCBzdXBwb3J0IDsgZml4ZWQgYmFkIGNvdW50aW5nIGluIDxjb2Rl PmxpbWl0PC9jb2RlPiBhdHRyaWJ1dGUgKHRoYW5rcyBFbHMpPC9saT4KCQk8bGk+MjMgSmFu IDA4IHwgdjAuMTEgfCBGaXhlZDogPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj5pbmcg c29tZSBzdHJpbmdzIGJyb2tlIHRoZSBwbHVnaW4gKHRoYW5rcyBFbHMpPC9saT4KCQk8bGk+ MDEgQXByIDA4IHwgdjAuMTIgfCBNb3ZlZCBzb21lIHNtZF9saWIgZnVuY3Rpb25zIHRvIHRo ZSBwbHVnaW4gOyByZXF1aXJlcyBzbWRfbGliX3YwLjMyPC9saT4KCQk8bGk+MDIgRGVjIDA4 IHwgdjAuMiB8IFJlcXVpcmVzIHNtZF9saWIgdjAuMzMgOyB0ZW50YXRpdmUgdW5pY29kZSBz dXBwb3J0IDsgd2lsbCByZWFkIHNlYXJjaCBsb2NhdGlvbnMgc2V0IGJ5IHdldF9oYXlzdGFj ayA7IGVuaGFuY2VkIDxjb2RlPnN1YmNhdHM8L2NvZGU+IGFuZCByZW5hbWVkIGl0IDxjb2Rl PnN1YmxldmVsPC9jb2RlPiA7IGFkZGVkIDxjb2RlPmRlbGltPC9jb2RlPiA7IGVuaGFuY2Vk IGRlYnVnIG91dHB1dCA7IHBsdWdpbiBjYW4gbm93IGJlIHVzZWQgYXMgYSBjb250YWluZXIg OyB0aWdodGVuZWQgY29kZSwgZW5oYW5jZWQgPGNvZGU+PzwvY29kZT4gYW5kIDxjb2RlPiE8 L2NvZGU+IHN1cHBvcnQgOyBmaXhlZCBzbWRfZ2V0V29yZCAoYWdhaW4hKSBhbmQgZmllbGQg bGlzdCBidWc8YnIgLz4KMTkgRGVjIDA4IHwgdjAuMjEgfCBGaXhlZCA8c3BhbiBjbGFzcz0i Y2FwcyI+TUxQPC9zcGFuPiBzdHJpbmcgYnVnPC9saT4KCTwvdWw+CgoJPGgyPkNyZWRpdHM8 L2gyPgoKCTxwPlRoaXMgcGx1Z2luIHdvdWxkbiYjODIxNzt0IGhhdmUgZXhpc3RlZCB3aXRo b3V0IHRoZSBvcmlnaW5hbCBGdXp6eSBGaW5kIGFsZ29yaXRobSBieSBKYXJubyBFbG9uZW4s IGFzIG5vdGVkIGFib3ZlLiBBbGwga3Vkb3MgZ29lcyBpbiB0aGF0IGRpcmVjdGlvbi4gQWxz bywgZXh0ZW5kZWQgdGhhbmtzIHRvIHRoZSBiZXRhIHRlc3RlcnMsIGVzcGVjaWFsbHkgRWxz IExlcGVsYWFycyBmb3IgZmVlZGJhY2sgYW5kIHVuZW5kaW5nIHBhdGllbmNlIGR1cmluZyBk ZXZlbG9wbWVudC4gQW5kIG9mIGNvdXJzZSBUZWFtIFRleHRQYXR0ZXJuIGZvciB0aGUgYmVz dCA8c3BhbiBjbGFzcz0iY2FwcyI+Q01TPC9zcGFuPiBvbiB0aGUgcGxhbmV0LjwvcD4KCiAg PC9kaXY+CjwhLS0gLS0tIEJFR0lOIFBMVUdJTiBDU1MgLS0tIC0tPgo8c3R5bGUgdHlwZT0i dGV4dC9jc3MiPgojc21kX2hlbHAgeyBsaW5lLWhlaWdodDoxLjMgO30KI3NtZF9oZWxwIGNv ZGUgeyBmb250LXdlaWdodDpib2xkOyBmb250OiAxMDUlLzEzMCUgIkNvdXJpZXIgTmV3Iiwg Y291cmllciwgbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDO30KI3NtZF9o ZWxwIGNvZGUuYmxvY2sgeyBmb250LXdlaWdodDpub3JtYWw7IGJvcmRlcjoxcHggZG90dGVk ICM5OTk7IGJhY2tncm91bmQtY29sb3I6ICNmMGU2OGM7IGRpc3BsYXk6YmxvY2s7IG1hcmdp bjoxMHB4IDEwcHggMjBweDsgcGFkZGluZzoxMHB4OyB9CiNzbWRfaGVscCBhOmxpbmssICNz bWRfaGVscCBhOnZpc2l0ZWQgeyBjb2xvcjogYmx1ZTsgdGV4dC1kZWNvcmF0aW9uOiBub25l OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmx1ZTsgcGFkZGluZy1ib3R0b206MXB4O30K I3NtZF9oZWxwIGE6aG92ZXIsICNzbWRfaGVscCBhOmFjdGl2ZSB7IGNvbG9yOiBibHVlOyB0 ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBibHVlOyBw YWRkaW5nLWJvdHRvbToxcHg7fQojc21kX2hlbHAgaDEgeyBjb2xvcjogIzM2OTsgZm9udDog MjBweCBHZW9yZ2lhLCBzYW5zLXNlcmlmOyBtYXJnaW46IDA7IHRleHQtYWxpZ246IGNlbnRl cjsgfQojc21kX2hlbHAgaDIgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7IHBh ZGRpbmc6MTBweCAwIDA7IGNvbG9yOiAjMzY5OyBmb250OiAxN3B4IEdlb3JnaWEsIHNhbnMt c2VyaWY7IH0KI3NtZF9oZWxwIGgzIHsgY29sb3I6ICM2OTM7IGZvbnQ6IGJvbGQgMTJweCBB cmlhbCwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAg MDt0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO30KI3NtZF9oZWxwIGg0IHsgZm9udDogYm9s ZCAxMXB4IEFyaWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46 IDEwcHggMCAwIDt0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9CiNzbWRfaGVscCAuYXRu bSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0KI3NtZF9oZWxwIC5yZXF1aXJlZCB7Y29sb3I6cmVk O30KI3NtZF9oZWxwIHRhYmxlIHt3aWR0aDoxMDAlOyB0ZXh0LWFsaWduOmNlbnRlcjsgcGFk ZGluZy1ib3R0b206MWVtO30KI3NtZF9oZWxwIHRkLCAjc21kX2hlbHAgdGgge3ZlcnRpY2Fs LWFsaWduOnRvcDsgYm9yZGVyOjJweCByaWRnZSAjY2NjOyBwYWRkaW5nOi40ZW07IH0KPC9z dHlsZT4KPCEtLSAtLS0gRU5EIFBMVUdJTiBDU1MgLS0tIC0tPgoiO3M6MzoibWQ1IjtzOjMy OiJmNmI3NjdjZDI2NjMxYzM4MjIwNWMyY2Q4ZWMxNmZhNCI7fQ==