# Name: smd_lib v0.34 # Type: Library plugin # Shared function library used by smd_ plugins and others. # 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: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjc6InNtZF9saWIiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3N0ZWZkYXdzb24uY29t LyI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMzQiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJT aGFyZWQgZnVuY3Rpb24gbGlicmFyeSB1c2VkIGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJz LiI7czo0OiJjb2RlIjtzOjEwOTM4OiIvLyBTb2Z0d2FyZSBlbmdpbmVlcnMgbG9vayBhd2F5 IG5vdyB1bmxlc3MgeW91IHdpc2ggdG8gYmUgaG9ycmlmaWVkIGJ5IHRoZSBhbW91bnQNCi8v IG9mIGNvdXBsaW5nIGFuZCBjb2hlc2lvbiBpbiB0aGVzZSBmdW5jdGlvbnMuIEknbSB3YXJu aW5nIHlvdS4uLiBpdCdzIG5vdCBwcmV0dHkNCmlmICghY2xhc3NfZXhpc3RzKCdzbWRfTUxQ JykpIHsNCmNsYXNzIHNtZF9NTFAgew0KCXZhciAkc21kX3N0cmluZ3M7DQoJdmFyICRzbWRf b3duZXI7DQoJdmFyICRzbWRfcHJlZml4Ow0KCXZhciAkc21kX2xhbmc7DQoJdmFyICRzbWRf ZXZlbnQ7DQoJZnVuY3Rpb24gc21kX01MUCgkcGx1ZywgJHByZWZ4LCAkc3RyYXJyYXksICRs bmc9J2VuLWdiJywgJGV2PSdwdWJsaWMnKSB7DQoJCSR0aGlzLT5zbWRfb3duZXIgPSAkcGx1 ZzsNCgkJJHRoaXMtPnNtZF9wcmVmaXggPSAkcHJlZng7DQoJCSR0aGlzLT5zbWRfc3RyaW5n cyA9ICRzdHJhcnJheTsNCgkJJHRoaXMtPnNtZF9sYW5nID0gJGxuZzsNCgkJJHRoaXMtPnNt ZF9ldmVudCA9ICRldjsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soYXJyYXkoJiR0aGlzLCAnc21k X0NhbGxiYWNrJyksICdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJyk7DQoJfQ0KCWZ1bmN0aW9u IHNtZF9DYWxsYmFjaygkZXZlbnQ9J2wxMG4uZW51bWVyYXRlX3N0cmluZ3MnLCAkc3RlcD0n JywgJHByZT0wKSB7DQoJCSRyID0gYXJyYXkoDQoJCQknb3duZXInID0+ICR0aGlzLT5zbWRf b3duZXIsDQoJCQkncHJlZml4JyA9PiAkdGhpcy0+c21kX3ByZWZpeCwNCgkJCSdsYW5nJyA9 PiAkdGhpcy0+c21kX2xhbmcsDQoJCQknZXZlbnQnID0+ICR0aGlzLT5zbWRfZXZlbnQsDQoJ CQknc3RyaW5ncycgPT4gJHRoaXMtPnNtZF9zdHJpbmdzLA0KCQkpOw0KCQlyZXR1cm4gJHI7 DQoJfQ0KCS8vIEdlbmVyaWMgbG9va3VwDQoJLy8gICR3aGF0ID0ga2V5IHRvIGxvb2sgdXAN CgkvLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRzIHRoZSBrZXkgaXMgZXhwZWN0aW5nIGZvciBy ZXBsYWNlbWVudA0KCWZ1bmN0aW9uIGdUeHQoJHdoYXQsICRhcmdzID0gYXJyYXkoKSkgew0K CQlnbG9iYWwgJHRleHRhcnJheTsNCg0KCQkvLyBQcmVwYXJlIHRoZSBwcmVmaXhlZCBrZXkg Zm9yIHVzZQ0KCQkka2V5ID0gJHRoaXMtPnNtZF9wcmVmaXggLiAnLScgLiAkd2hhdDsNCgkJ JGtleSA9IHN0cnRvbG93ZXIoJGtleSk7DQoNCgkJLy8gR3JhYiBmcm9tIHRoZSBnbG9iYWwg dGV4dGFycmF5IChwb3NzaWJseSBlZGl0ZWQgYnkgTUxQKSBpZiB3ZSBjYW4NCgkJaWYoaXNz ZXQoJHRleHRhcnJheVska2V5XSkpIHsNCgkJCSRzdHIgPSAkdGV4dGFycmF5WyRrZXldOw0K CQl9IGVsc2Ugew0KCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0aGUgbG9jYWxpc2VkIHRl eHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2luZw0KCQkJLy8gdGhlIChub24gcHJlZml4ZWQp IHN0cmluZyBhcnJheSBpbiB0aGUgcGx1Z2luDQoJCQkka2V5ID0gc3RydG9sb3dlcigkd2hh dCk7DQoJCQkkc3RyID0gKGlzc2V0KCR0aGlzLT5zbWRfc3RyaW5nc1ska2V5XSkpID8gJHRo aXMtPnNtZF9zdHJpbmdzWyRrZXldIDogJHdoYXQ7DQoJCX0NCgkJLy8gUGVyZm9ybSBzdWJz dGl0dXRpb25zDQoJCWlmKCFlbXB0eSgkYXJncykpIHsNCgkJCSRzdHIgPSBzdHJ0cigkc3Ry LCAkYXJncyk7DQoJCX0NCg0KCQlyZXR1cm4gJHN0cjsNCgl9DQp9DQp9DQoNCmlmICghZnVu Y3Rpb25fZXhpc3RzKCJzbWRfZG9MaXN0IikpIHsNCmZ1bmN0aW9uIHNtZF9kb0xpc3QoJGxz dCwgJHJuZz10cnVlLCAkc3ViPSIiLCAkcXRlPXRydWUsICRkbG09IiwiLCAkbGF4PXRydWUp IHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdGhpc2ltYWdlLCAkdGhpc2ZpbGUsICR0aGlz bGluaywgJHByZXRleHQsICR2YXJpYWJsZTsNCg0KCSRpbmMgPSAkZXhjID0gYXJyYXkoKTsN CgkkbHN0ID0gZG9fbGlzdCgkbHN0LCAkZGxtKTsNCgkkbW9kUkUgPSAoJGxheCkgPyAnLyhc P3xcISkoW1xwe0x9XHB7Tn1ccHtQY31ccHtQZH1ccHtac31dKykvJyA6ICcvKFw/fFwhKShb XHB7TH1ccHtOfVxwe1BjfVxwe1BkfV0rKS8nIDsNCglmb3JlYWNoICgkbHN0IGFzICRpdGVt KSB7DQoJCSRtb2QgPSAwOyAvLyAwID0gaW5jbHVkZSwgMSA9IGV4Y2x1ZGUNCgkJJG51bU1v ZHMgPSBwcmVnX21hdGNoX2FsbCgkbW9kUkUsICRpdGVtLCAkbW9kcyk7DQoNCgkJZm9yICgk bW9kQ3RyID0gMDsgJG1vZEN0ciA8ICRudW1Nb2RzOyAkbW9kQ3RyKyspIHsNCgkJCS8vIG1v ZCAidHlwZSIgaXMgZ292ZXJuZWQgYnkgdGhlIGZpcnN0IG9uZSBmb3VuZCBvbmx5LiBpLmUu IGlmICJhcnRpY2xlLT9jIXMiIHdhcyB1c2VkIGluIG9uZSBmaWVsZA0KCQkJLy8gaXQgd291 bGQgYmUgYW4gImluY2x1ZGUiIG9mIHRoZSB3b3JkICJhcnRpY2xlLSIgcGx1cyB0aGUgY2F0 ZWdvcnkgYW5kIHNlY3Rpb24gY29uY2F0ZW5hdGVkDQoJCQkkbW9kID0gKCRtb2RzWzFdWzBd ID09PSAiISIpID8gMSA6IDA7DQoJCQkkbW9kQ2hhciA9ICRtb2RzWzFdWyRtb2RDdHJdOw0K CQkJJG1vZEl0ZW0gPSB0cmltKCRtb2RzWzJdWyRtb2RDdHJdKTsNCgkJCSRsb3dpdGVtID0g c3RydG9sb3dlcigkbW9kSXRlbSk7DQoJCQlpZiAoaXNzZXQoJHZhcmlhYmxlWyRsb3dpdGVt XSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkdmFy aWFibGVbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCR0aGlzaW1h Z2VbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1v ZEl0ZW0sICR0aGlzaW1hZ2VbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlz c2V0KCR0aGlzZmlsZVskbG93aXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgk bW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNmaWxlWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBl bHNlIGlmIChpc3NldCgkdGhpc2xpbmtbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3Ry X3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICR0aGlzbGlua1skbG93aXRlbV0sICRpdGVt KTsNCgkJCX0gZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygkbG93aXRlbSwgJHByZXRleHQp KSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHByZXRl eHRbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRfUE9TVFskbW9k SXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwg JF9QT1NUWyRtb2RJdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChpc3NldCgkX0dFVFsk bW9kSXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRl bSwgJF9HRVRbJG1vZEl0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRfU0VS VkVSWyRtb2RJdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRt b2RJdGVtLCAkX1NFUlZFUlskbW9kSXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSBpZiAoaXNz ZXQoJHRoaXNhcnRpY2xlWyRsb3dpdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNl KCRtb2RDaGFyLiRtb2RJdGVtLCAkdGhpc2FydGljbGVbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJ CQl9IGVsc2Ugew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0s ICRtb2RJdGVtLCAkaXRlbSk7DQoJCQl9DQoJCX0NCg0KCQkvLyBIYW5kbGUgcmFuZ2VzIG9m IHZhbHVlcw0KCQlpZiAoJHJuZyAmJiBwcmVnX21hdGNoKCcvXihcZCspXC0oXGQrKSQvJywg JGl0ZW0pKSB7DQoJCQlsaXN0KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0iLCAkaXRlbSwgMik7 DQoJCQkkaXRlbSA9IGltcGxvZGUoJGRsbSwgcmFuZ2UoJGxvLCAkaGkpKTsNCgkJfQ0KDQoJ CS8vIEl0ZW0gbWF5IGJlIGVtcHR5OyBpZ25vcmUgaXQgaWYgc28NCgkJaWYgKCRpdGVtKSB7 DQoJCQkkaXRlbSA9IGRvX2xpc3QoJGl0ZW0sICRkbG0pOw0KDQoJCQkvLyBIYW5kbGUgc3Vi LWNhdGVnb3JpZXMNCgkJCWlmICgkc3ViKSB7DQoJCQkJbGlzdCgkc3VidHlwZSwgJGxldmVs KSA9IGV4cGxvZGUoIjoiLCAkc3ViKTsNCgkJCQkkbGV2ZWwgPSAoZW1wdHkoJGxldmVsKSkg PyAwIDogJGxldmVsOw0KCQkJCSRsZXZlbCA9IChzdHJ0b2xvd2VyKCRsZXZlbCk9PSJhbGwi KSA/IDk5OTk5IDogJGxldmVsOw0KCQkJCSRvdXRpdGVtcyA9IGFycmF5KCk7DQoJCQkJZm9y ZWFjaCAoJGl0ZW0gYXMgJGNhdCkgew0KCQkJCQkkY2F0cyA9IGdldFRyZWUoZG9zbGFzaCgk Y2F0KSwgJHN1YnR5cGUpOw0KCQkJCQlmb3JlYWNoICgkY2F0cyBhcyAkamR4ID0+ICR2YWwp IHsNCgkJCQkJCWlmICgkY2F0c1skamR4XVsnbGV2ZWwnXSA8PSAkbGV2ZWwpIHsNCgkJCQkJ CQkkb3V0aXRlbXNbXSA9ICRjYXRzWyRqZHhdWyduYW1lJ107DQoJCQkJCQl9DQoJCQkJCX0N CgkJCQl9DQoJCQkJJGl0ZW0gPSAkb3V0aXRlbXM7DQoJCQl9DQoNCgkJCS8vIFF1b3RlIGlm IGFza2VkDQoJCQkkaXRlbSA9ICgkcXRlKSA/IGRvQXJyYXkoJGl0ZW0sICdkb1F1b3RlJykg OiAkaXRlbTsNCgkJCWlmICgkbW9kID09PSAwKSB7DQoJCQkJJGluYyA9IGFycmF5X3VuaXF1 ZShhcnJheV9tZXJnZSgkaW5jLCAkaXRlbSkpOw0KCQkJfSBlbHNlIHsNCgkJCQkkZXhjID0g YXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRleGMsICRpdGVtKSk7DQoJCQl9DQoJCX0NCgl9 DQoJcmV0dXJuIGFycmF5KCRpbmMsICRleGMpOw0KfQ0KfQ0KDQovLyBTcGxpdCBhIHN0cmlu ZyBvbiBhIHBhdHRlcm4gYW5kIGFsbG93IGludGVnZXIgcmFuZ2VzIHRvIGJlIGV4cGFuZGVk DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX3NwbGl0IikpIHsNCmZ1bmN0aW9uIHNtZF9z cGxpdCgkc3RyLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0iLygsfCxccykrLyIsICRw cmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgew0KCSRyZXRhcnIgPSBhcnJheSgpOw0K CWlmICgoc3Vic3RyKCRzcGxpdGF0LDAsMSkgPT0gIi8iKSAmJiAoc3Vic3RyKCRzcGxpdGF0 LCBzdHJsZW4oJHNwbGl0YXQpLTEsIDEpID09ICIvIikpIHsNCgkJJHBhdCA9ICRzcGxpdGF0 Ow0KCX0gZWxzZSB7DQoJCSRwYXQgPSAnL1snLiRzcGxpdGF0LiddKy8nOw0KCX0NCgkkZWxl bXMgPSBwcmVnX3NwbGl0KCRwYXQsICRzdHIsIC0xLCAkcHJlZ29wdCk7DQoJZm9yZWFjaCAo JGVsZW1zIGFzICRpdGVtKSB7DQoJCSRpdGVtID0gdHJpbSgkaXRlbSk7DQoJCSRuZWdhdGUg PSBmYWxzZTsNCgkJLy8gRG9lcyB0aGUgaXRlbSBzdGFydCB3aXRoIGEgbmVnYXRpb24gY2hh cmFjdGVyDQoJCWlmIChzdWJzdHIoJGl0ZW0sMCwxKSA9PT0gIiEiKSB7DQoJCQkkbmVnYXRl ID0gdHJ1ZTsNCgkJCSRpdGVtID0gc3Vic3RyKCRpdGVtLDEpOw0KCQl9DQoJCS8vIElzIHRo ZSBpdGVtIGFuIGludGVnZXIgbGlzdCByYW5nZQ0KCQlpZiAoJGFsbG93UmFuZ2UgJiYgcHJl Z19tYXRjaCgnL14oXGQrKVwtKFxkKykkLycsICRpdGVtKSkgew0KCQkJbGlzdCgkbG8sICRo aSkgPSBleHBsb2RlKCItIiwgJGl0ZW0sIDIpOw0KCQkJJHJuZyA9IHJhbmdlKCRsbywgJGhp KTsNCgkJCS8vIFJlYXBwbHkgdGhlIG5lZ2F0aW9uIGlmIG5lY2Vzc2FyeQ0KCQkJZm9yKCRp ZHggPSAwOyAkaWR4IDwgY291bnQoJHJuZyk7ICRpZHgrKykgew0KCQkJCSRybmdbJGlkeF0g PSAoKCRuZWdhdGUpID8gIiEiIDogIiIpIC4gJHJuZ1skaWR4XTsNCgkJCX0NCgkJCSRyZXRh cnIgPSBhcnJheV9tZXJnZSgkcmV0YXJyLCAkcm5nKTsNCgkJfSBlbHNlIHsNCgkJCSRyZXRh cnJbXSA9ICgoJG5lZ2F0ZSkgPyAiISIgOiAiIikgLiAkaXRlbTsNCgkJfQ0KCX0NCglyZXR1 cm4gJHJldGFycjsNCn0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9kb0RibFF1 b3RlIikpIHsNCmZ1bmN0aW9uIHNtZF9kb0RibFF1b3RlKCR2YWwpIHsNCglyZXR1cm4gJyIn LiR2YWwuJyInOw0KfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX3JlbW92ZVFT VmFyIikpIHsNCmZ1bmN0aW9uIHNtZF9yZW1vdmVRU1ZhcigkdXJsLCAka2V5KSB7DQoJJHVy bCA9IHByZWdfcmVwbGFjZSgnLyguKikoXD98JiknIC4gJGtleSAuICc9W14mXSs/KCYpKC4q KS9pJywgJyQxJDIkNCcsICR1cmwgLiAnJicpOw0KCSR1cmwgPSBzdWJzdHIoJHVybCwgMCwg LTEpOw0KCXJldHVybiAoJHVybCk7DQp9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJz bWRfYWRkUVNWYXIiKSkgew0KZnVuY3Rpb24gc21kX2FkZFFTVmFyKCR1cmwsICRrZXksICR2 YWx1ZSkgew0KCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwgJGtleSk7DQoJaWYgKHN0 cnBvcygkdXJsLCAnPycpID09PSBmYWxzZSkgew0KCQlyZXR1cm4gKCR1cmwgLiAnPycgLiAk a2V5IC4gJz0nIC4gJHZhbHVlKTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gKCR1cmwgLiAnJicg LiAka2V5IC4gJz0nIC4gJHZhbHVlKTsNCgl9DQp9DQp9DQoNCi8vIERFUFJFQ0FURUQ6IGZv ciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygi c21kX2dldFN1YkNhdHMiKSkgew0KZnVuY3Rpb24gc21kX2dldFN1YkNhdHMoJHBhcmVudCwk Y2F0dHlwZSkgew0KCXJldHVybiBnZXRUcmVlKCRwYXJlbnQsJGNhdHR5cGUpOyAvL2dldFRy ZWUoKSBvciBnZXRUcmVlUGF0aCgpPz8NCn0NCn0NCg0KLy8gREVQUkVDQVRFRDogZm9yIGJh Y2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRf Z2V0T3B0cyIpKSB7DQpmdW5jdGlvbiBzbWRfZ2V0T3B0cygkc3RyLCAkYWxsb3dlZCwgJGlk cHJlZml4PSIiLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0iLygsfCxccykrLyIsICRw cmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgew0KCWdsb2JhbCAkcHJldGV4dCwgJHRo aXNhcnRpY2xlOw0KDQoJJG91dCA9IGFycmF5KCk7DQoJJG5vdG91dCA9IGFycmF5KCk7DQoJ JG1hdGNoZXMgPSBzbWRfc3BsaXQoJHN0ciwgJGFsbG93UmFuZ2UsICRzcGxpdGF0LCAkcHJl Z29wdCk7DQoJLy8gQW4gYXJyYXkgdGhhdCB0ZWxscyB0aGUgbG9vcCB3aGF0IHRvIGRvIHdp dGggZWFjaCBvZiB0aGUgdmFsaWQgc3RyaW5ncw0KCS8vICBhcmcxOiB0eXBlICgxPWV4YWN0 IG1hdGNoLCAyPWFueXdoZXJlIHdpdGhpbiBzdHJpbmcsIDM9Y3VzdG9tIGZpZWxkKQ0KCS8v ICBhcmcyOiBwcmVmaXgsIGlmIGFueQ0KCS8vICBhcmczOiB2YXJpYWJsZSB0byBzdWJzdGl0 dXRlDQoJLy8gIGFyZzQ6IGV4dHJhIGNoZWNrLCBpZiBhcHBsaWNhYmxlDQoJLy8gIGFyZzU6 IHN0b3JlIGluIHRoZSBpbi9leGNsdWRlIGxpc3QgKDE9aW5jbHVkZTsgMj1leGNsdWRlKQ0K CSRvcHQgPSBhcnJheSgNCgkJIj9jIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ2MnXSwg IjEiLCAxKSwNCgkJIiFjIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ2MnXSwgIjEiLCAy KSwNCgkJIj9zIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3MnXSwgIjEiLCAxKSwNCgkJ IiFzIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3MnXSwgIjEiLCAyKSwNCgkJIj9xIiA9 PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAxKSwNCgkJIiFxIiA9PiBhcnJh eSgyLCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAyKSwNCgkJIj90IiA9PiBhcnJheSgyLCAi IiwgJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDEp LA0KCQkiIXQiID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddLCAn JHRoaXNhcnRpY2xlIT1OVUxMJywgMiksDQoJCSI/aWQiID0+IGFycmF5KDEsICRpZHByZWZp eCwgJHByZXRleHRbJ2lkJ10sICckdGhpc2FydGljbGUhPU5VTEwnLCAxKSwNCgkJIiFpZCIg PT4gYXJyYXkoMSwgJGlkcHJlZml4LCAkcHJldGV4dFsnaWQnXSwgJyR0aGlzYXJ0aWNsZSE9 TlVMTCcsIDIpLA0KCQkiPyIgPT4gYXJyYXkoMywgIiIsICIiLCAnJHRoaXNhcnRpY2xlIT1O VUxMJywgMSksDQoJCSIhIiA9PiBhcnJheSgzLCAiIiwgIiIsICckdGhpc2FydGljbGUhPU5V TEwnLCAyKSwNCgkpOw0KDQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRtYXRjaGVz KTsgJGlkeCsrKSB7DQoJCSRtYXRjaGVkID0gZmFsc2U7DQoJCSR0aGlzbWF0Y2ggPSAkbWF0 Y2hlc1skaWR4XTsNCgkJZm9yZWFjaCAoJG9wdCBhcyAkdmFyID0+ICRhcmdzKSB7DQoJCQkk b3B2YXIgPSAoJGFyZ3NbNF0gPT0gMSkgPyAib3V0IiA6ICJub3RvdXQiOw0KCQkJc3dpdGNo ICgkYXJnc1swXSkgew0KCQkJCWNhc2UgMToNCgkJCQkJaWYgKCgkdGhpc21hdGNoID09PSAk dmFyKSAmJiBpbl9hcnJheSgkdmFyLCRhbGxvd2VkKSkgew0KCQkJCQkJJG1hdGNoZWQgPSB0 cnVlOw0KCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdzWzNdKSB7DQoJCQkJCQkJ JHJlcCA9IHN0cl9yZXBsYWNlKCR2YXIsICRhcmdzWzFdLiRhcmdzWzJdLCAkdGhpc21hdGNo KTsNCgkJCQkJCQlpZiAoIWluX2FycmF5KCRyZXAsICR7JG9wdmFyfSkpIHsNCgkJCQkJCQkJ JHskb3B2YXJ9W10gPSAkcmVwOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQli cmVhazsNCgkJCQljYXNlIDI6DQoJCQkJCSRwYXQgPSAnL1xcJy4kdmFyLickfFxcJy4kdmFy LidbXkEtWmEtejAtOV0vJzsNCgkJCQkJaWYgKChpc19pbnQoc21kX3ByZWdQb3MoJHBhdCwg JHRoaXNtYXRjaCwgJGZuZCkpKSAmJiBpbl9hcnJheSgkdmFyLCRhbGxvd2VkKSkgew0KCQkJ CQkJJG1hdGNoZWQgPSB0cnVlOw0KCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdz WzNdKSB7DQoJCQkJCQkJJHJlcCA9IHN0cl9yZXBsYWNlKCR2YXIsICRhcmdzWzFdLiRhcmdz WzJdLCAkdGhpc21hdGNoKTsNCgkJCQkJCQlpZiAoIWluX2FycmF5KCRyZXAsICR7JG9wdmFy fSkpIHsNCgkJCQkJCQkJJHskb3B2YXJ9W10gPSAkcmVwOw0KCQkJCQkJCX0NCgkJCQkJCX0N CgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlIDM6DQoJCQkJCSRsZW4gPSBzdHJsZW4o JHZhcik7DQoJCQkJCWlmICgoc3Vic3RyKCR0aGlzbWF0Y2gsMCwkbGVuKSA9PT0gJHZhcikg JiYgaW5fYXJyYXkoJHZhci4iZmllbGQiLCRhbGxvd2VkKSkgew0KCQkJCQkJJG1hdGNoZWQg PSB0cnVlOw0KCQkJCQkJLy8gVXNlIHRoZSBnaXZlbiBmaWVsZCBuYW1lOyB3aGljaCBtYXkg YmUgYSBjb21tYS1zZXBhcmF0ZWQgc3VibGlzdC4NCgkJCQkJCS8vIFNwbGl0IG9mZiB0aGUg ZmllbGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrDQoJCQkJCQkkZmllbGRuYW1lID0g c3Vic3RyKCR0aGlzbWF0Y2gsJGxlbik7DQoJCQkJCQlpZiAoKCRhcmdzWzNdKSAmJiAoaXNz ZXQoJHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldKSkpIHsNCgkJCQkJCQkk ZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVtzdHJ0b2xvd2VyKCRmaWVsZG5hbWUpXTsN CgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOw0K CQkJCQkJfQ0KCQkJCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsNCgkJCQkJCQkk c3Vib3V0ID0gc21kX3NwbGl0KHN0cmlwX3RhZ3MoJGZpZWxkQ29udGVudHMpLCAkYWxsb3dS YW5nZSwgJHNwbGl0YXQsICRwcmVnb3B0KTsNCgkJCQkJCQlmb3JlYWNoICgkc3Vib3V0IGFz ICRzdWJuYW1lKSB7DQoJCQkJCQkJCWlmICghaW5fYXJyYXkoJHN1Ym5hbWUsICR7JG9wdmFy fSkpIHsNCgkJCQkJCQkJCSR7JG9wdmFyfVtdID0gJHN1Ym5hbWU7DQoJCQkJCQkJCX0NCgkJ CQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlpZiAoJG1h dGNoZWQpIHsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCQlpZiAoISRtYXRjaGVkKSB7DQoJ CQkvLyBBc3NpZ24gdGhlIHZhcmlhYmxlIHZlcmJhdGltDQoJCQlpZiAoIWluX2FycmF5KCR0 aGlzbWF0Y2gsICRvdXQpKSB7DQoJCQkJJG91dFtdID0gJHRoaXNtYXRjaDsNCgkJCX0NCgkJ fQ0KCX0NCglyZXR1cm4gYXJyYXkoJG91dCwkbm90b3V0KTsNCn0NCn0NCg0KLy8gU3RvbGVu IGZyb20gcGhwLm5ldDogc3RycG9zIHBhZ2UgY29tbWVudHMuLi4NCmlmICghZnVuY3Rpb25f ZXhpc3RzKCJzbWRfcHJlZ1BvcyIpKSB7DQpmdW5jdGlvbiBzbWRfcHJlZ1Bvcygkc1BhdHRl cm4sICRzU3ViamVjdCwgJiRGb3VuZFN0cmluZywgJGlPZmZzZXQgPSAwKSB7DQoJJEZvdW5k U3RyaW5nID0gbnVsbDsNCglpZiAocHJlZ19tYXRjaCgkc1BhdHRlcm4sICRzU3ViamVjdCwg JGFNYXRjaGVzLCBQUkVHX09GRlNFVF9DQVBUVVJFLCAkaU9mZnNldCkgPiAwKSB7DQoJCSRG b3VuZFN0cmluZyA9ICRhTWF0Y2hlc1swXVswXTsNCgkJcmV0dXJuICRhTWF0Y2hlc1swXVsx XTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0KfQ0KLy8uLi4gYW5kIGFy cmF5X2NvbWJpbmUuLi4NCmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9jb21iaW5lIikp IHsNCglmdW5jdGlvbiBhcnJheV9jb21iaW5lKCRhcnIxLCRhcnIyKSB7DQoJCSRvdXQgPSBh cnJheSgpOw0KCQlmb3JlYWNoKCRhcnIxIGFzICRrZXkxID0+ICR2YWx1ZTEpIHsNCgkJCSRv dXRbJHZhbHVlMV0gPSAkYXJyMlska2V5MV07DQoJCX0NCiAgIAlyZXR1cm4gJG91dDsNCgl9 DQp9DQovLy4uLiBhbmQgaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUNCmlmICghZnVuY3Rpb25f ZXhpc3RzKCJodG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpKSB7DQoJZnVuY3Rpb24gaHRtbHNw ZWNpYWxjaGFyc19kZWNvZGUoJHN0cmluZywgJHF1b3RlX3N0eWxlID0gRU5UX0NPTVBBVCkg ew0KCQlyZXR1cm4gc3RydHIoJHN0cmluZywgYXJyYXlfZmxpcChnZXRfaHRtbF90cmFuc2xh dGlvbl90YWJsZShIVE1MX1NQRUNJQUxDSEFSUywgJHF1b3RlX3N0eWxlKSkpOw0KCX0NCn0i O3M6NDoidHlwZSI7czoxOiIyIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6NDoiaGVscCI7czox MDc1NzoiCTxwPjxkaXYgaWQ9InNtZF9oZWxwIj48L3A+CgoJPGgxPnNtZF8gcGx1Z2luIGxp YnJhcnk8L2gxPgoKCTxwPk9mZmVycyBubyBwdWJsaWMgdGV4dHBhdHRlcm4gdGFncy4gSXQg aXMgc2ltcGx5IGEgc2hhcmVkIGxpYnJhcnkgb2YgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGJ5 IHNtZF8gcGx1Z2lucy48L3A+CgoJPGgyPkNoYW5nZWxvZzwvaDI+CgoJPHVsPgoJCTxsaT52 MC4xICAgMDctMDItMjUgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZTwvbGk+CgkJPGxpPnYwLjIg ICAwNy0wMy0wMyBBZGRlZDogPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBz Ij5NTFA8L3NwYW4+PC9zcGFuPiAoTXVsdGktTGluZ3VhbCBQYWNrKSBsaWJyYXJ5IHN1cHBv cnQ8L2xpPgoJCTxsaT52MC4yMSAgMDctMDMtMDYgQWRkZWQ6IGludGVnZXIgcmFuZ2UgZnVu Y3Rpb25hbGl0eS4gPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+IG5vdyB0YWtlcyBhIFJlZ0V4 IGFyZzwvbGk+CgkJPGxpPnYwLjIxYSAwNy0wMy0yMSBGaXhlZDogQ2hhcmFjdGVyIHJhbmdl cyBpZ25vcmVkICh0aGFua3MgbXJkYWxlKTwvbGk+CgkJPGxpPnYwLjIxYiAwNy0wNC0wMiBG aXhlZDogU3RpY2t5IGFydGljbGUgc3VwcG9ydCBpbiA8Y29kZT5zbWRfZ2V0QXR0czwvY29k ZT4gKHRoYW5rcyBwaWVtYW4pPC9saT4KCQk8bGk+djAuMjFjIDA3LTA3LTI5IEZpeGVkOiBO dW1lcmljIHJhbmdlcyBpbiBjYXRlZ29yaWVzICh0aGFua3Mgd29sbGUpPC9saT4KCQk8bGk+ djAuMjFkIDA3LTA4LTAzIEZpeGVkOiBOZWdhdGlvbiB3aXRoIG11bHRpcGxlIGVsZW1lbnRz PC9saT4KCQk8bGk+djAuMjFlIDA3LTA5LTE0IEZpeGVkOiBBYmlsaXR5IHRvIGxlYXZlIGVt cHR5IHNwbGl0UmFuZ2UgcGFyYW1ldGVycyBpbnRhY3Q8L2xpPgoJCTxsaT52MC4yMiAgMDct MDktMjAgRml4ZWQ6IFVuZGVmaW5lZCBpbmRleCB3YXJuaW5ncyAodGhhbmtzIEFtYml0aW91 c2xlbW9uKS4gRW5oYW5jZWQgbWF0Y2hlcyBzbyBzcGFjZXMgYXJlIGFsbG93ZWQgaW4gc3Ry aW5ncyAodGhhbmtzIERyUm9nZyk8L2xpPgoJCTxsaT52MC4yMyAgMDctMDQtMDkgPHNwYW4g Y2xhc3M9ImNhcHMiPkJFVEE8L3NwYW4+IDogQWRkZWQgdGhlIEZ1enp5RmluZCBjbGFzcyBh bmQgZ2V0V29yZCBmdW5jdGlvbi4gZ2V0QXR0cygpIG5vdyBhbGxvd3MgPGNvZGU+P3E8L2Nv ZGU+PC9saT4KCQk8bGk+djAuMyAgIDA3LTEwLTI5IFJld3JvdGUgPGNvZGU+c21kX2dldEF0 dHM8L2NvZGU+IGFzIDxjb2RlPnNtZF9nZXRPcHRzPC9jb2RlPiB0byBhbGxvdyByZXBsYWNl ZCB2YXJzIHdpdGhpbiB0ZXh0LiBEZXByZWNhdGVkIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2Rl PiwgYWRkZWQgPGNvZGU+c21kX3ByZWdQb3M8L2NvZGU+LiBDaGFuZ2VkIDxjb2RlPnNtZF9z cGxpdFJhbmdlPC9jb2RlPiBhcyA8Y29kZT5zbWRfc3BsaXQ8L2NvZGU+IHRvIGFsbG93IHJh bmdlcyB0byBiZSBzd2l0Y2hlZCBvbiBvciBvZmYuIERlcHJlY2F0ZWQgPGNvZGU+c21kX3Nw bGl0UmFuZ2U8L2NvZGU+LiBBZGRlZCBnZW5lcmljIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8 L3NwYW4+IGNsYXNzIHN1cHBvcnQgKDxjb2RlPnNtZF9NTFA8L2NvZGU+KS4gRGVwcmVjYXRl ZCA8Y29kZT5zbWRNTFA8L2NvZGU+IGFycmF5LCA8Y29kZT5zbWRfZ1R4dDwvY29kZT4gYW5k IDxjb2RlPnNtZF9nZXRDYWxsZXI8L2NvZGU+LiBNYWRlIDxjb2RlPnNtZF9GdXp6eUZpbmQ8 L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0V29yZDwvY29kZT4gb2ZmaWNpYWw8L2xpPgoJCTxs aT52MC4zMSAgMDctMTEtMjcgUmVtb3ZlZCA8Y29kZT5zbWRNTFA8L2NvZGU+IGFycmF5LCA8 Y29kZT5zbWRfZ1R4dDwvY29kZT4gYW5kIDxjb2RlPnNtZF9nZXRDYWxsZXI8L2NvZGU+LiBE ZXByZWNhdGVkIDxjb2RlPnNtZF9nZXRTdWJDYXRzPC9jb2RlPi4gQWRkZWQgYSBmZXcgUEhQ NCBoZWxwZXIgZnVuY3Rpb25zPC9saT4KCQk8bGk+djAuMzIgIDA4LTAzLTI5IFJlbW92ZWQg PGNvZGU+c21kX2dldEF0dHM8L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0U3ViQ2F0czwvY29k ZT4uIERlcHJlY2F0ZWQgPGNvZGU+c21kX2dldE9wdHM8L2NvZGU+IGFuZCA8Y29kZT5zbWRf c3BsaXQ8L2NvZGU+LiBBZGRlZCA8Y29kZT5zbWRfZG9MaXN0PC9jb2RlPi4gTW92ZWQgdGhl IDxjb2RlPnNtZF9GdXp6eUZpbmQ8L2NvZGU+IGNsYXNzIGFuZCA8Y29kZT5zbWRfZ2V0V29y ZDwvY29kZT4gaW50byB0aGUgc21kX2Z1enp5X2ZpbmQgcGx1Z2luIHdoZXJlIHRoZXkgc2hv dWxkIGhhdmUgYmVlbiBhbGwgYWxvbmc8L2xpPgoJCTxsaT52MC4zMyAgMDgtMTItMDIgVW5k ZXByZWNhdGVkKCEpIDxjb2RlPnNtZF9zcGxpdDwvY29kZT4gc2luY2UgaXQmIzgyMTc7cyBh Y3R1YWxseSBxdWl0ZSB1c2VmdWwgOyBleHRlbmRlZCA8Y29kZT5zbWRfZG9MaXN0PC9jb2Rl PiB0byBlbmNvbXBhc3MgPGNvZGU+JHRoaXNpbWFnZTwvY29kZT4gKGZvciBmdXR1cmUpIGFu ZCA8Y29kZT4kdmFyaWFibGU8L2NvZGU+IDsgZml4ZWQgYnVnIGluIDxjb2RlPnNtZF9kb0xp c3Q8L2NvZGU+IHdoZW4gdXNpbmcgc3ViY2F0czwvbGk+CgkJPGxpPnYwLjM0ICAwOC0xMi0x MyA8Y29kZT5zbWRfZG9MaXN0PC9jb2RlPiB1c2VzIGEgdW5pY29kZSByZWdleDwvbGk+Cgk8 L3VsPgoKCTxoMj5GdW5jdGlvbiBSZWZlcmVuY2U8L2gyPgoKCTxwPjxzdHJvbmc+c21kX2Fk ZFFTVmFyPC9zdHJvbmc+PGJyIC8+CjxzdHJvbmc+c21kX3JlbW92ZVFTVmFyPC9zdHJvbmc+ PC9wPgoKCTxwPkFkZCBvciByZW1vdmUgYSBxdWVyeSBzdHJpbmcgdmFyaWFibGUgdG8gdGhl IGdpdmVuIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+LCB0YWtpbmcgaW50byBhY2Nv dW50IGFueSBleGlzdGluZyB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgaW4gdGhlIDxzcGFuIGNs YXNzPSJjYXBzIj5VUkw8L3NwYW4+IGFscmVhZHkuICYjODIxNjtBZGQmIzgyMTc7IHRha2Vz IHRocmVlIGFyZ3VtZW50cywgJiM4MjE2O1JlbW92ZSYjODIxNzsganVzdCB0YWtlcyB0aGUg Zmlyc3QgdHdvOjwvcD4KCgk8b2w+CgkJPGxpPlRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJM PC9zcGFuPiBzdHJpbmcgdG8gYWRkIHRvL3JlbW92ZSBmcm9tPC9saT4KCQk8bGk+VGhlIGlk IG9mIHRoZSBxdWVyeXN0cmluZyAodGhlIGJpdCBiZWZvcmUgdGhlID0gc2lnbik8L2xpPgoJ CTxsaT5UaGUgdmFsdWUgb2YgdGhlIG5ldyBxdWVyeXN0cmluZyAodGhlIGJpdCBhZnRlciB0 aGUgPSBzaWduKTwvbGk+Cgk8L29sPgoKCTxwPmUuZy4gPGNvZGU+c21kX2FkZFFTVmFyKCR0 aGlzYXJ0aWNsZVsmIzM5O3VybF90aXRsZSYjMzk7XSwgJiMzOTt0cGcmIzM5OywgMTUpOzwv Y29kZT4gd291bGQgYWRkIDxjb2RlPnRwZz0xNTwvY29kZT4gdG8gdGhlIGN1cnJlbnQgYXJ0 aWNsZSYjODIxNztzIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+LiBJZiB0aGVyZSBh cmUgbm8gb3RoZXIgdmFyaWFibGVzIGN1cnJlbnRseSBpbiB0aGUgPHNwYW4gY2xhc3M9ImNh cHMiPlVSTDwvc3Bhbj4sIGl0IGlzIGFkZGVkIHdpdGggYSBxdWVzdGlvbiBtYXJrLCBvdGhl cndpc2UgaXQgaXMgYXBwZW5kZWQgd2l0aCBhbiBhbXBlcnNhbmQuPC9wPgoKCTxwPjxzdHJv bmc+c21kX2RvTGlzdDwvc3Ryb25nPjwvcD4KCgk8cD5SZXR1cm4gYW4gZXhwYW5kZWQgbGlz dCBvZiBpdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8L3A+CgoJPG9sPgoJ CTxsaT5Bbnl0aGluZyBjb250YWluaW5nICYjODIxNjs/JiM4MjE3OyBvciAmIzgyMTY7ISYj ODIxNzsgaXMgY2hlY2tlZCBmb3IgYSBtYXRjaCB3aXRoIGEgPHNwYW4gY2xhc3M9ImNhcHMi PlRYUDwvc3Bhbj4gZmllbGQgKDxjb2RlPiZsdDt0eHA6dmFyaWFibGUgLyZndDs8L2NvZGU+ LCBpbWFnZSwgZmlsZSwgbGluaywgZ2xvYmFsIGFydGljbGUsIHVybCA8c3BhbiBjbGFzcz0i Y2FwcyI+UE9TVDwvc3Bhbj4vR0VUL1NFUlZFUiwgb3IgaW5kaXZpZHVhbCBhcnRpY2xlLCBp biB0aGF0IG9yZGVyKTwvbGk+CgkJPGxpPkFueSByYW5nZXMgb2YgaXRlbXMgYXJlIGV4cGFu ZGVkIChlLmcuIDQtNyA9Jmd0OyA0LDUsNiw3KSBpZiB0aGUgPGNvZGU+cm5nPC9jb2RlPiBv cHRpb24gcGVybWl0cyBpdDwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3Nw YW4+IGZpZWxkcyBtYXkgdGhlbXNlbHZlcyBiZSBsaXN0cyBvciByYW5nZXM8L2xpPgoJCTxs aT5Bbnl0aGluZyB0aGF0IGlzIG5vdCBhIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+ IGZpZWxkIGlzIHVzZWQgdmVyYmF0aW08L2xpPgoJCTxsaT5UaGUgaXRlbXMgYXJlIHJldHVy bmVkIGFzIDIgbGlzdHM7IGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uPC9saT4KCTwvb2w+CgoJ PHA+QXJncyAoIFsqXSA9IG1hbmRhdG9yeSApIDoKCTxvbD4KCQk8bGk+WypdIGxzdCA9IHRo ZSBsaXN0IGFzIGEgZGVsaW1pdGVkIHN0cmluZzwvbGk+CgkJPGxpPnJuZyA9IHdoZXRoZXIg dG8gYWxsb3cgcmFuZ2VzIG9yIG5vdCAoYm9vbCkuIERlZmF1bHQgPSB0cnVlPC9saT4KCQk8 bGk+c3ViID0gdGhlIHR5cGUgb2Ygc3ViY2F0ZWdvcnkgdG8gdHJhdmVyc2UgKGltYWdlLCBm aWxlLCBsaW5rLCBhcnRpY2xlLCBub25lPSYjODIyMTsmIzgyMjA7KSBhbmQgaG93IG1hbnkg bGV2ZWxzIHRvIGdvIGRvd24gKGUuZy4gaW1hZ2U6MikuIERlZmF1bHQgPSAmIzgyMTY7JiM4 MjE3OzwvbGk+CgkJPGxpPnF0ZSA9IHdoZXRoZXIgdG8gcXVvdGUgZWFjaCBpdGVtIGluIHRo ZSBhcnJheSBvciBub3QgKGJvb2wpLiBEZWZhdWx0ID0gdHJ1ZTwvbGk+CgkJPGxpPmRsbSA9 IHRoZSBkZWxpbWl0ZXIgKHN0cmluZykuIERlZmF1bHQgPSAmIzgyMjA7LCYjODIyMTs8L2xp PgoJCTxsaT5sYXggPSBXaGV0aGVyIHRvIGJlIGxheCBvciBzdHJpY3QgYWJvdXQgd2hhdCBj aGFyYWN0ZXJzIGNvbnN0aXR1dGUgYSBmaWVsZDsgcHJpbWFyaWx5IHdoZXRoZXIgc3BhY2Vz IGFyZSBhbGxvd2VkIGluLCBzYXksIGN1c3RvbSBmaWVsZHMuIERlZmF1bHQgPSAmIzgyMjA7 MSYjODIyMTs8L2xpPgoJPC9vbD48L3A+CgoJPHA+PHN0cm9uZz5zbWRfZ2V0T3B0czwvc3Ry b25nPjwvcD4KCgk8cD5EZXByZWNhdGVkIGFzIGl0IGlzIG1vc3RseSBzdXBlcnNlZGVkIGJ5 IHNtZF9kb0xpc3Q7IHRoaXMgb25lIGlzIGNsdW5raWVyIGJ1dCBoYXMgJGlkcHJlZml4IHNv IGl0IHJlbWFpbnMgZm9yIG5vdy4gSXQgc2VhcmNoZXMgdGhlIHBhc3NlZCBzdHJpbmcgZm9y IHByZWRldGVybWluZWQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgYW5kLCBpZiB0aGF0IHNl cXVlbmNlIGlzIGluIHRoZSBnaXZlbiAkYWxsb3dlZCBhcnJheSwgcmVwbGFjZXMgaXQgYXMg Zm9sbG93czo8L3A+CgoJPHVsPgoJCTxsaT4/YyA9IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5 ICghYyA9IG5vdCBjdXJyZW50IGNhdGVnb3J5KTwvbGk+CgkJPGxpPj9zID0gY3VycmVudCBz ZWN0aW9uICghcyA9IG5vdCBjdXJyZW50IHNlY3Rpb24pPC9saT4KCQk8bGk+P3QgPSBjdXJy ZW50IGFydGljbGUgdGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0bGUpPC9saT4KCQk8bGk+ P2lkID0gY3VycmVudCBhcnRpY2xlIElELCBwcmVwZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFp ZCA9IG5vdCBjdXJyZW50IElEKTwvbGk+CgkJPGxpPj9xID0gY3VycmVudCBxdWVyeSB0ZXJt ICghcSA9IG5vdCBjdXJyZW50IHF1ZXJ5IHRlcm0pPC9saT4KCQk8bGk+P2ZpZWxkID0gY29u dGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGZpZWxkIChjb3VsZCBiZSBh IGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+CgkJPGxpPiFmaWVsZCA9IG5vdCB0aGUgY29u dGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGZpZWxkIChjb3VsZCBiZSBh IGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+Cgk8L3VsPgoKCTxwPkludGVnZXIgcmFuZ2Vz IChlLmcuIDEtNSkgd2lsbCBiZSBleHBhbmRlZCBpbnRvIHRoZWlyIGluZGl2aWR1YWwgdmFs dWVzIGlmIHRoZSAkYWxsb3dSYW5nZSBvcHRpb24gaXMgdHJ1ZTsgYW55dGhpbmcgZWxzZSBp cyByZXR1cm5lZCB2ZXJiYXRpbS4gSXQgb3V0cHV0cyB0d28gYXJyYXlzOiB0aGUgMXN0IGNv bnRhaW5zIGl0ZW1zIGZvciBpbmNsdXNpb24sIHRoZSAybmQgY29udGFpbnMgaXRlbXMgZm9y IGV4Y2x1c2lvbi48L3A+CgoJPHA+QXJncyAoIFsqXSA9IG1hbmRhdG9yeSApIDoKCTxvbD4K CQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciBtYXRjaGVzPC9saT4KCQk8bGk+ WypdIEFuIGFycmF5IGNvbnRhaW5pbmcgc2hvcnRjdXRzIHRoYXQgYXJlICYjODIyMDthbGxv d2VkJiM4MjIxOyB0byBiZSBmb3VuZCBpbiB0aGUgc3RyaW5nICg/YywgP3MsID90LCA/Zmll bGQgZXRjKTwvbGk+CgkJPGxpPlRoZSBwcmVmaXggZm9yID9pZCBzdHJpbmdzPC9saT4KCQk8 bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2UgZXhwYW5zaW9u IG9yIG5vdDwvbGk+CgkJPGxpPlJlZ0V4IHN0cmluZyB0byBzcGxpdCBvcHRpb25zIGF0IChz ZWUgc21kX3NwbGl0KTwvbGk+CgkJPGxpPnByZWdfc3BsaXQgb3B0aW9uIChzZWUgc21kX3Nw bGl0KTwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ryb25nPnNtZF9zcGxpdDwvc3Ryb25nPjwv cD4KCgk8cD5SZXR1cm5zIGFuIGFycmF5IG9mIGl0ZW1zIGZyb20gYSBzdHJpbmcgb2YgKHVz dWFsbHkpIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMuIElmIGFueSB2YWx1ZXMgY29udGFpbiBy YW5nZXMgb2YgbnVtYmVycyBsaWtlIDEtNSB0aGF0IG5lZWQgJiM4MjE2O2V4cGFuZGluZyYj ODIxNzsgZmlyc3QgKGFuZCAkYWxsb3dSYW5nZSBpcyB0cnVlKSwgdGhleSBhcmUgZGVhbHQg d2l0aC4gVGFrZXMgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgKCBbKl0gPSBtYW5kYXRvcnkg YXJncykgOjwvcD4KCgk8b2w+CgkJPGxpPlsqXSBUaGUgc3RyaW5nIHRvIHNwbGl0PC9saT4K CQk8bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2UgZXhwYW5z aW9uIG9yIG5vdCAoaS5lLiAxLTUgYmVjb21lcyAxLDIsMyw0LDUpPC9saT4KCQk8bGk+VGhl IHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIgY2xhc3NlcyB0byBtYXRjaC4gSWYgYSBm dWxsIFJlZ0V4IHN0YXJ0aW5nIGFuZCBlbmRpbmcgd2l0aCAmIzgyMTY7LyYjODIxNzsgY2hh cmFjdGVycyBpcyBzdXBwbGllZCwgdGhlIGV4cHJlc3Npb24gaXMgdXNlZCB2ZXJiYXRpbS4g V2l0aG91dCB0aGUgJiM4MjE2Oy8mIzgyMTc7IGNoYXJhY3RlcnMsIHRoZSBleHByZXNzaW9u IGlzIHRyZWF0ZWQgYXMgYSBsaXN0IG9mIGNoYXJhY3RlciBjbGFzc2VzIHRvIGZpbmQuIERl ZmF1bHRzIHRvICYjODIyMDsvKCx8LFxzKSsvJiM4MjIxOyB3aGljaCBpcyBhIGNvbW1hLCBv ciBjb21tYSBhbmQgYSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci48L2xpPgoJCTxsaT5wcmVnX3Nw bGl0IG9wdGlvbiBjb25zdGFudCBhcyBkZWZpbmVkIGluIHRoZSBwaHAgbWFudWFsPC9saT4K CTwvb2w+CgoJPHA+PHN0cm9uZz5zbWRfTUxQPC9zdHJvbmc+PGJyIC8+Ckluc3RhbnRpYXRl IG9uZSBvZiB0aGVzZSB0byBoYW5kbGUgPGFjcm9ueW0gdGl0bGU9Ik11bHRpLUxpbmd1YWwg UGFjayI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L2Fjcm9ueW0+IGluIHlvdXIg cGx1Z2luIGxpa2UgdGhpczo8L3A+CgoJPHA+MSkgRGVjbGFyZSBhIHVuaXF1ZSBnbG9iYWwg dmFyaWFibGUsIGUuZy4gZ2xvYmFsICRteVBsdWc8YnIgLz4KMikgRGVmaW5lIHlvdXIgZGVm YXVsdCBzdHJpbmcgcmVwbGFjZW1lbnQgYXJyYXkgKGRvZXNuJiM4MjE3O3QgbmVlZCB0byBi ZSBnbG9iYWwpLCBlLmc6PC9wPgoKCTxwPgkkbXlTdHJpbmdzID0gYXJyYXkgKCYjODIyMDtt c2cxJiM4MjIxOyA9Jmd0OyAmIzgyMjA7VGhpcyBpcyBtZXNzYWdlIDEmIzgyMjE7LCAmIzgy MjA7bXNnMiYjODIyMTsgPSZndDsgJiM4MjIwO1RoaXMgaXMgbWVzc2FnZSAyJiM4MjIxOyk7 PC9wPgoKCTxwPjMpIENyZWF0ZSBhbiA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPiBo YW5kbGVyOjwvcD4KCgk8cD4JJG15UGx1ZyA9IG5ldyBzbWRfTUxQKCYjODIyMDtwbHVnaW5f bmFtZSYjODIyMTssICYjODIyMDtwbHVnaW5fcHJlZml4JiM4MjIxOywgJG15U3RyaW5ncyk7 PC9wPgoKCTxwPjQpIFRoYXQmIzgyMTc7cyBpdCEgVGhlcmUgYXJlIHR3byBvcHRpb25hbCBh cmdzIHRvIHNtZF9NTFA6CglhKSB0aGUgZGVmYXVsdCAoZnVsbCkgbGFuZ3VhZ2UgdG8gdXNl LCBlLmcgJiM4MjIwO2RhLWRrJiM4MjIxOy4gRGVmYXVsdHMgdG8gJiM4MjIwO2VuLWdiJiM4 MjIxOy4KCWIpIHRoZSBpbnRlcmZhY2UgdGhlIHN0cmluZ3MgYXJlIGZvci4gQ2hvb3NlIGZy b20gJiM4MjIwO3B1YmxpYyYjODIyMTsgKHRoZSBkZWZhdWx0KSwgJiM4MjIwO2FkbWluJiM4 MjIxOyBvciAmIzgyMjA7Y29tbW9uJiM4MjIxOzwvcD4KCgk8cD41KSBUbyB1c2UgYSByZXBs YWNlbWVudCBzdHJpbmcgaW4geW91ciBjb2RlOgoJYSkgTWFrZSBzdXJlIHRvIGltcG9ydCB0 aGUgdW5pcXVlIGdsb2JhbCB2YXJpYWJsZTogZS5nLiBnbG9iYWwgJG15UGx1ZzsKCWIpIENh bGwgJG15UGx1Zy0mZ3Q7Z1R4dCgmIzgyMjA7bWVzc2FnZUlEJiM4MjIxOyk7IFsgZS5nLiAk bXlQbHVnLSZndDtnVHh0KCYjODIyMDttc2cxJiM4MjIxOykgXQoJYykgSWYgeW91IHdhbnQg dG8gcmVwbGFjZSBhbnkgYXJncyBpbiB5b3VyIG1lc3NhZ2Ugc3RyaW5nLCBwYXNzIGFuIGFz c29jaWF0aXZlIGFycmF5IGFzIHRoZSAybmQgYXJnIHRvIGdUeHQoKTwvcD4KCgk8cD48c3Ry b25nPnNtZF9kb0RibFF1b3RlPC9zdHJvbmc+PC9wPgoKCTxwPkFsdGVybmF0aXZlIHRvIHRo ZSBjb3JlJiM4MjE3O3MgZG9RdW90ZSgpLiBUaGlzIG9uZSBkYmwtcXVvdGVzIGluc3RlYWQg b2Ygc2dsLXF1b3RlczwvcD4KCgk8cD48c3Ryb25nPnNtZF9wcmVnUG9zPC9zdHJvbmc+PC9w PgoKCTxwPkxpZnRlZCBmcm9tIG9uZSBvZiB0aGUgY29tbWVudHMgaW4gdGhlIDxzcGFuIGNs YXNzPSJjYXBzIj5QSFA8L3NwYW4+IG1hbnVhbCwgdGhpcyBqdXN0IGxvb2tzIGZvciBhIFJl Z0V4IHN0cmluZyB3aXRoaW4gYW5vdGhlciwgcmV0dXJuaW5nIHRoZSBtYXRjaGVzIGl0IGZp bmRzIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG1hdGNoLjwvcD4KCgk8cD48c3Ry b25nPmFycmF5X2NvbWJpbmU8L3N0cm9uZz48L3A+CgoJPHA+UEhQNCBlcXVpdmFsZW50IG9m IHRoZSBzdGFuZGFyZCBQSFA1IGZ1bmN0aW9uLCBsaWZ0ZWQgZnJvbSBwaHAubmV0PC9wPgoK CTxwPjxzdHJvbmc+aHRtbHNwZWNpYWxjaGFyc19kZWNvZGU8L3N0cm9uZz48L3A+CgoJPHA+ UEhQNCBlcXVpdmFsZW50IG9mIHRoZSBzdGFuZGFyZCBQSFA1IGZ1bmN0aW9uLCBsaWZ0ZWQg ZnJvbSBwaHAubmV0PC9wPgoKICA8L2Rpdj4KPCEtLSAtLS0gQkVHSU4gUExVR0lOIENTUyAt LS0gLS0+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiNzbWRfaGVscCB7IGxpbmUtaGVpZ2h0 OjEuMyA7fQojc21kX2hlbHAgY29kZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IGZvbnQ6IDEwNSUv MTMwJSAiQ291cmllciBOZXciLCBjb3VyaWVyLCBtb25vc3BhY2U7IGJhY2tncm91bmQtY29s b3I6ICNGRkZGQ0M7fQojc21kX2hlbHAgY29kZS5ibG9jayB7IGZvbnQtd2VpZ2h0Om5vcm1h bDsgYm9yZGVyOjFweCBkb3R0ZWQgIzk5OTsgYmFja2dyb3VuZC1jb2xvcjogI2YwZTY4Yzsg ZGlzcGxheTpibG9jazsgbWFyZ2luOjEwcHggMTBweCAyMHB4OyBwYWRkaW5nOjEwcHg7IH0K I3NtZF9oZWxwIGE6bGluaywgI3NtZF9oZWxwIGE6dmlzaXRlZCB7IGNvbG9yOiBibHVlOyB0 ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibHVlOyBw YWRkaW5nLWJvdHRvbToxcHg7fQojc21kX2hlbHAgYTpob3ZlciwgI3NtZF9oZWxwIGE6YWN0 aXZlIHsgY29sb3I6IGJsdWU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRv bTogMnB4IHNvbGlkIGJsdWU7IHBhZGRpbmctYm90dG9tOjFweDt9CiNzbWRfaGVscCBoMSB7 IGNvbG9yOiAjMzY5OyBmb250OiAyMHB4IEdlb3JnaWEsIHNhbnMtc2VyaWY7IG1hcmdpbjog MDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CiNzbWRfaGVscCBoMiB7IGJvcmRlci1ib3R0b206 IDFweCBzb2xpZCBibGFjazsgcGFkZGluZzoxMHB4IDAgMDsgY29sb3I6ICMzNjk7IGZvbnQ6 IDE3cHggR2VvcmdpYSwgc2Fucy1zZXJpZjsgfQojc21kX2hlbHAgaDMgeyBjb2xvcjogIzY5 MzsgZm9udDogYm9sZCAxMnB4IEFyaWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzog MXB4OyBtYXJnaW46IDEwcHggMCAwO3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7fQojc21k X2hlbHAgaDQgeyBmb250OiBib2xkIDExcHggQXJpYWwsIHNhbnMtc2VyaWY7IGxldHRlci1z cGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAwIDAgO3RleHQtdHJhbnNmb3JtOiB1cHBlcmNh c2U7IH0KI3NtZF9oZWxwIC5hdHQtbmFtZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0KI3NtZF9o ZWxwIC5tYW5kIHsgYmFja2dyb3VuZDojZWVlOyBib3JkZXI6MXB4IGRvdHRlZCAjOTk5OyB9 CiNzbWRfaGVscCB0YWJsZSB7d2lkdGg6MTAwJTsgdGV4dC1hbGlnbjpjZW50ZXI7IHBhZGRp bmctYm90dG9tOjFlbTt9CiNzbWRfaGVscCB0ZCwgI3NtZF9oZWxwIHRoIHtib3JkZXI6MXB4 IHNvbGlkICM5OTk7IHBhZGRpbmc6LjVlbSAwO30KPC9zdHlsZT4KPCEtLSAtLS0gRU5EIFBM VUdJTiBDU1MgLS0tIC0tPgoiO3M6MzoibWQ1IjtzOjMyOiIyMDM1MGRmZDY4MWQyMGNmZGMz ODNhOTE4YzNjOGNmMSI7fQ==