# Name: smd_lib v0.36 # 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 LyI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMzYiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJT aGFyZWQgZnVuY3Rpb24gbGlicmFyeSB1c2VkIGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJz LiI7czo0OiJjb2RlIjtzOjExMjg3OiIvLyBTb2Z0d2FyZSBlbmdpbmVlcnMgbG9vayBhd2F5 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 CgkkbHN0ID0gZG9fbGlzdCgkbHN0LCAkZGxtKTsNCg0KCS8vIFNvbWV0aW1lcyBwZXNreSBV bmljb2RlIGlzIG5vdCBjb21waWxlZCBpbiBzbyBkZXRlY3QgaWYgc28gYW5kIGZhbGwgYmFj ayB0byBBU0NJSQ0KCWlmICghQHByZWdfbWF0Y2goJy9ccEwvdScsICdhJykpIHsNCgkJJG1v ZFJFID0gKCRsYXgpID8gJy8oXD98XCEpKFtBLVphLXowLTlfXC0gXSspLycgOiAnLyhcP3xc ISkoW0EtWmEtejAtOV9cLV0rKS8nOw0KCX0gZWxzZSB7DQoJCSRtb2RSRSA9ICgkbGF4KSA/ ICcvKFw/fFwhKShbXHB7TH1ccHtOfVxwe1BjfVxwe1BkfVxwe1pzfV0rKS8nIDogJy8oXD98 XCEpKFtccHtMfVxwe059XHB7UGN9XHB7UGR9XSspLyc7DQoJfQ0KDQoJZm9yZWFjaCAoJGxz dCBhcyAkaXRlbSkgew0KCQkkbW9kID0gMDsgLy8gMCA9IGluY2x1ZGUsIDEgPSBleGNsdWRl DQoJCSRudW1Nb2RzID0gcHJlZ19tYXRjaF9hbGwoJG1vZFJFLCAkaXRlbSwgJG1vZHMpOw0K DQoJCWZvciAoJG1vZEN0ciA9IDA7ICRtb2RDdHIgPCAkbnVtTW9kczsgJG1vZEN0cisrKSB7 DQoJCQkvLyBtb2QgInR5cGUiIGlzIGdvdmVybmVkIGJ5IHRoZSBmaXJzdCBvbmUgZm91bmQg b25seS4gaS5lLiBpZiAiYXJ0aWNsZS0/YyFzIiB3YXMgdXNlZCBpbiBvbmUgZmllbGQNCgkJ CS8vIGl0IHdvdWxkIGJlIGFuICJpbmNsdWRlIiBvZiB0aGUgd29yZCAiYXJ0aWNsZS0iIHBs dXMgdGhlIGNhdGVnb3J5IGFuZCBzZWN0aW9uIGNvbmNhdGVuYXRlZA0KCQkJJG1vZCA9ICgk bW9kc1sxXVswXSA9PT0gIiEiKSA/IDEgOiAwOw0KCQkJJG1vZENoYXIgPSAkbW9kc1sxXVsk bW9kQ3RyXTsNCgkJCSRtb2RJdGVtID0gdHJpbSgkbW9kc1syXVskbW9kQ3RyXSk7DQoJCQkk bG93aXRlbSA9IHN0cnRvbG93ZXIoJG1vZEl0ZW0pOw0KCQkJaWYgKGlzc2V0KCR2YXJpYWJs ZVskbG93aXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9k SXRlbSwgJHZhcmlhYmxlWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChpc3Nl dCgkdGhpc2ltYWdlWyRsb3dpdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRt b2RDaGFyLiRtb2RJdGVtLCAkdGhpc2ltYWdlWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBl bHNlIGlmIChpc3NldCgkdGhpc2ZpbGVbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3Ry X3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICR0aGlzZmlsZVskbG93aXRlbV0sICRpdGVt KTsNCgkJCX0gZWxzZSBpZiAoaXNzZXQoJHRoaXNsaW5rWyRsb3dpdGVtXSkpIHsNCgkJCQkk aXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkdGhpc2xpbmtbJGxvd2l0 ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGFycmF5X2tleV9leGlzdHMoJGxvd2l0ZW0s ICRwcmV0ZXh0KSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0 ZW0sICRwcmV0ZXh0WyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChpc3NldCgk X1BPU1RbJG1vZEl0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIu JG1vZEl0ZW0sICRfUE9TVFskbW9kSXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSBpZiAoaXNz ZXQoJF9HRVRbJG1vZEl0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENo YXIuJG1vZEl0ZW0sICRfR0VUWyRtb2RJdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChp c3NldCgkX1NFUlZFUlskbW9kSXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgk bW9kQ2hhci4kbW9kSXRlbSwgJF9TRVJWRVJbJG1vZEl0ZW1dLCAkaXRlbSk7DQoJCQl9IGVs c2UgaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskbG93aXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBz dHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNhcnRpY2xlWyRsb3dpdGVtXSwg JGl0ZW0pOw0KCQkJfSBlbHNlIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFy LiRtb2RJdGVtLCAkbW9kSXRlbSwgJGl0ZW0pOw0KCQkJfQ0KCQl9DQoNCgkJLy8gSGFuZGxl IHJhbmdlcyBvZiB2YWx1ZXMNCgkJJHNpdGVtID0gZG9fbGlzdCgkaXRlbSwgJGRsbSk7DQoJ CWZvcmVhY2ggKCRzaXRlbSBhcyAkaWR4ID0+ICRlbGVtKSB7DQoJCQlpZiAoJHJuZyAmJiBw cmVnX21hdGNoKCcvXihcZCspXC0oXGQrKSQvJywgJGVsZW0pKSB7DQoJCQkJbGlzdCgkbG8s ICRoaSkgPSBleHBsb2RlKCItIiwgJGVsZW0sIDIpOw0KCQkJCSRzaXRlbVskaWR4XSA9IGlt cGxvZGUoJGRsbSwgcmFuZ2UoJGxvLCAkaGkpKTsNCgkJCX0NCgkJfQ0KCQkkaXRlbSA9IGlt cGxvZGUoJGRsbSwgJHNpdGVtKTsNCg0KCQkvLyBJdGVtIG1heSBiZSBlbXB0eTsgaWdub3Jl IGl0IGlmIHNvDQoJCWlmICgkaXRlbSkgew0KCQkJJGl0ZW0gPSBkb19saXN0KCRpdGVtLCAk ZGxtKTsNCg0KCQkJLy8gSGFuZGxlIHN1Yi1jYXRlZ29yaWVzDQoJCQlpZiAoJHN1Yikgew0K CQkJCWxpc3QoJHN1YnR5cGUsICRsZXZlbCkgPSBleHBsb2RlKCI6IiwgJHN1Yik7DQoJCQkJ JGxldmVsID0gKGVtcHR5KCRsZXZlbCkpID8gMCA6ICRsZXZlbDsNCgkJCQkkbGV2ZWwgPSAo c3RydG9sb3dlcigkbGV2ZWwpPT0iYWxsIikgPyA5OTk5OSA6ICRsZXZlbDsNCgkJCQkkb3V0 aXRlbXMgPSBhcnJheSgpOw0KCQkJCWZvcmVhY2ggKCRpdGVtIGFzICRjYXQpIHsNCgkJCQkJ JGNhdHMgPSBnZXRUcmVlKGRvc2xhc2goJGNhdCksICRzdWJ0eXBlKTsNCgkJCQkJZm9yZWFj aCAoJGNhdHMgYXMgJGpkeCA9PiAkdmFsKSB7DQoJCQkJCQlpZiAoJGNhdHNbJGpkeF1bJ2xl dmVsJ10gPD0gJGxldmVsKSB7DQoJCQkJCQkJJG91dGl0ZW1zW10gPSAkY2F0c1skamR4XVsn bmFtZSddOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCSRpdGVtID0gJG91dGl0ZW1z Ow0KCQkJfQ0KDQoJCQkvLyBRdW90ZSBpZiBhc2tlZA0KCQkJJGl0ZW0gPSAoJHF0ZSkgPyBk b0FycmF5KCRpdGVtLCAnZG9RdW90ZScpIDogJGl0ZW07DQoJCQlpZiAoJG1vZCA9PT0gMCkg ew0KCQkJCSRpbmMgPSBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoJGluYywgJGl0ZW0pKTsN CgkJCX0gZWxzZSB7DQoJCQkJJGV4YyA9IGFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSgkZXhj LCAkaXRlbSkpOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBhcnJheSgkaW5jLCAkZXhjKTsN Cn0NCn0NCg0KLy8gU3BsaXQgYSBzdHJpbmcgb24gYSBwYXR0ZXJuIGFuZCBhbGxvdyBpbnRl Z2VyIHJhbmdlcyB0byBiZSBleHBhbmRlZA0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9z cGxpdCIpKSB7DQpmdW5jdGlvbiBzbWRfc3BsaXQoJHN0ciwgJGFsbG93UmFuZ2U9dHJ1ZSwg JHNwbGl0YXQ9Ii8oLHwsXHMpKy8iLCAkcHJlZ29wdCA9IFBSRUdfU1BMSVRfTk9fRU1QVFkp IHsNCgkkcmV0YXJyID0gYXJyYXkoKTsNCglpZiAoKHN1YnN0cigkc3BsaXRhdCwwLDEpID09 ICIvIikgJiYgKHN1YnN0cigkc3BsaXRhdCwgc3RybGVuKCRzcGxpdGF0KS0xLCAxKSA9PSAi LyIpKSB7DQoJCSRwYXQgPSAkc3BsaXRhdDsNCgl9IGVsc2Ugew0KCQkkcGF0ID0gJy9bJy4k c3BsaXRhdC4nXSsvJzsNCgl9DQoJJGVsZW1zID0gcHJlZ19zcGxpdCgkcGF0LCAkc3RyLCAt MSwgJHByZWdvcHQpOw0KCWZvcmVhY2ggKCRlbGVtcyBhcyAkaXRlbSkgew0KCQkkaXRlbSA9 IHRyaW0oJGl0ZW0pOw0KCQkkbmVnYXRlID0gZmFsc2U7DQoJCS8vIERvZXMgdGhlIGl0ZW0g c3RhcnQgd2l0aCBhIG5lZ2F0aW9uIGNoYXJhY3Rlcg0KCQlpZiAoc3Vic3RyKCRpdGVtLDAs MSkgPT09ICIhIikgew0KCQkJJG5lZ2F0ZSA9IHRydWU7DQoJCQkkaXRlbSA9IHN1YnN0cigk aXRlbSwxKTsNCgkJfQ0KCQkvLyBJcyB0aGUgaXRlbSBhbiBpbnRlZ2VyIGxpc3QgcmFuZ2UN CgkJaWYgKCRhbGxvd1JhbmdlICYmIHByZWdfbWF0Y2goJy9eKFxkKylcLShcZCspJC8nLCAk aXRlbSkpIHsNCgkJCWxpc3QoJGxvLCAkaGkpID0gZXhwbG9kZSgiLSIsICRpdGVtLCAyKTsN CgkJCSRybmcgPSByYW5nZSgkbG8sICRoaSk7DQoJCQkvLyBSZWFwcGx5IHRoZSBuZWdhdGlv biBpZiBuZWNlc3NhcnkNCgkJCWZvcigkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRybmcpOyAk aWR4KyspIHsNCgkJCQkkcm5nWyRpZHhdID0gKCgkbmVnYXRlKSA/ICIhIiA6ICIiKSAuICRy bmdbJGlkeF07DQoJCQl9DQoJCQkkcmV0YXJyID0gYXJyYXlfbWVyZ2UoJHJldGFyciwgJHJu Zyk7DQoJCX0gZWxzZSB7DQoJCQkkcmV0YXJyW10gPSAoKCRuZWdhdGUpID8gIiEiIDogIiIp IC4gJGl0ZW07DQoJCX0NCgl9DQoJcmV0dXJuICRyZXRhcnI7DQp9DQp9DQoNCmlmICghZnVu Y3Rpb25fZXhpc3RzKCJzbWRfZG9EYmxRdW90ZSIpKSB7DQpmdW5jdGlvbiBzbWRfZG9EYmxR dW90ZSgkdmFsKSB7DQoJcmV0dXJuICciJy4kdmFsLiciJzsNCn0NCn0NCg0KaWYgKCFmdW5j dGlvbl9leGlzdHMoInNtZF9yZW1vdmVRU1ZhciIpKSB7DQpmdW5jdGlvbiBzbWRfcmVtb3Zl UVNWYXIoJHVybCwgJGtleSkgew0KCSR1cmwgPSBwcmVnX3JlcGxhY2UoJy8oLiopKFw/fCYp JyAuICRrZXkgLiAnPVteJl0rPygmKSguKikvaScsICckMSQyJDQnLCAkdXJsIC4gJyYnKTsN CgkkdXJsID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsNCglyZXR1cm4gKCR1cmwpOw0KfQ0KfQ0K DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX2FkZFFTVmFyIikpIHsNCmZ1bmN0aW9uIHNt ZF9hZGRRU1ZhcigkdXJsLCAka2V5LCAkdmFsdWUpIHsNCgkkdXJsID0gc21kX3JlbW92ZVFT VmFyKCR1cmwsICRrZXkpOw0KCWlmIChzdHJwb3MoJHVybCwgJz8nKSA9PT0gZmFsc2UpIHsN CgkJcmV0dXJuICgkdXJsIC4gJz8nIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7DQoJfSBlbHNl IHsNCgkJcmV0dXJuICgkdXJsIC4gJyYnIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7DQoJfQ0K fQ0KfQ0KDQovLyBERVBSRUNBVEVEOiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25s eQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9nZXRTdWJDYXRzIikpIHsNCmZ1bmN0aW9u IHNtZF9nZXRTdWJDYXRzKCRwYXJlbnQsJGNhdHR5cGUpIHsNCglyZXR1cm4gZ2V0VHJlZSgk cGFyZW50LCRjYXR0eXBlKTsgLy9nZXRUcmVlKCkgb3IgZ2V0VHJlZVBhdGgoKT8/DQp9DQp9 DQoNCi8vIERFUFJFQ0FURUQ6IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5DQpp ZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX2dldE9wdHMiKSkgew0KZnVuY3Rpb24gc21kX2dl dE9wdHMoJHN0ciwgJGFsbG93ZWQsICRpZHByZWZpeD0iIiwgJGFsbG93UmFuZ2U9dHJ1ZSwg JHNwbGl0YXQ9Ii8oLHwsXHMpKy8iLCAkcHJlZ29wdCA9IFBSRUdfU1BMSVRfTk9fRU1QVFkp IHsNCglnbG9iYWwgJHByZXRleHQsICR0aGlzYXJ0aWNsZTsNCg0KCSRvdXQgPSBhcnJheSgp Ow0KCSRub3RvdXQgPSBhcnJheSgpOw0KCSRtYXRjaGVzID0gc21kX3NwbGl0KCRzdHIsICRh bGxvd1JhbmdlLCAkc3BsaXRhdCwgJHByZWdvcHQpOw0KCS8vIEFuIGFycmF5IHRoYXQgdGVs bHMgdGhlIGxvb3Agd2hhdCB0byBkbyB3aXRoIGVhY2ggb2YgdGhlIHZhbGlkIHN0cmluZ3MN CgkvLyAgYXJnMTogdHlwZSAoMT1leGFjdCBtYXRjaCwgMj1hbnl3aGVyZSB3aXRoaW4gc3Ry aW5nLCAzPWN1c3RvbSBmaWVsZCkNCgkvLyAgYXJnMjogcHJlZml4LCBpZiBhbnkNCgkvLyAg YXJnMzogdmFyaWFibGUgdG8gc3Vic3RpdHV0ZQ0KCS8vICBhcmc0OiBleHRyYSBjaGVjaywg aWYgYXBwbGljYWJsZQ0KCS8vICBhcmc1OiBzdG9yZSBpbiB0aGUgaW4vZXhjbHVkZSBsaXN0 ICgxPWluY2x1ZGU7IDI9ZXhjbHVkZSkNCgkkb3B0ID0gYXJyYXkoDQoJCSI/YyIgPT4gYXJy YXkoMiwgIiIsICRwcmV0ZXh0WydjJ10sICIxIiwgMSksDQoJCSIhYyIgPT4gYXJyYXkoMiwg IiIsICRwcmV0ZXh0WydjJ10sICIxIiwgMiksDQoJCSI/cyIgPT4gYXJyYXkoMiwgIiIsICRw cmV0ZXh0WydzJ10sICIxIiwgMSksDQoJCSIhcyIgPT4gYXJyYXkoMiwgIiIsICRwcmV0ZXh0 WydzJ10sICIxIiwgMiksDQoJCSI/cSIgPT4gYXJyYXkoMiwgIiIsICRwcmV0ZXh0WydxJ10s ICIxIiwgMSksDQoJCSIhcSIgPT4gYXJyYXkoMiwgIiIsICRwcmV0ZXh0WydxJ10sICIxIiwg MiksDQoJCSI/dCIgPT4gYXJyYXkoMiwgIiIsICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10s ICckdGhpc2FydGljbGUhPU5VTEwnLCAxKSwNCgkJIiF0IiA9PiBhcnJheSgyLCAiIiwgJHRo aXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDIpLA0KCQki P2lkIiA9PiBhcnJheSgxLCAkaWRwcmVmaXgsICRwcmV0ZXh0WydpZCddLCAnJHRoaXNhcnRp Y2xlIT1OVUxMJywgMSksDQoJCSIhaWQiID0+IGFycmF5KDEsICRpZHByZWZpeCwgJHByZXRl eHRbJ2lkJ10sICckdGhpc2FydGljbGUhPU5VTEwnLCAyKSwNCgkJIj8iID0+IGFycmF5KDMs ICIiLCAiIiwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDEpLA0KCQkiISIgPT4gYXJyYXkoMywg IiIsICIiLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMiksDQoJKTsNCg0KCWZvciAoJGlkeCA9 IDA7ICRpZHggPCBjb3VudCgkbWF0Y2hlcyk7ICRpZHgrKykgew0KCQkkbWF0Y2hlZCA9IGZh bHNlOw0KCQkkdGhpc21hdGNoID0gJG1hdGNoZXNbJGlkeF07DQoJCWZvcmVhY2ggKCRvcHQg YXMgJHZhciA9PiAkYXJncykgew0KCQkJJG9wdmFyID0gKCRhcmdzWzRdID09IDEpID8gIm91 dCIgOiAibm90b3V0IjsNCgkJCXN3aXRjaCAoJGFyZ3NbMF0pIHsNCgkJCQljYXNlIDE6DQoJ CQkJCWlmICgoJHRoaXNtYXRjaCA9PT0gJHZhcikgJiYgaW5fYXJyYXkoJHZhciwkYWxsb3dl ZCkpIHsNCgkJCQkJCSRtYXRjaGVkID0gdHJ1ZTsNCgkJCQkJCWlmICgkYXJnc1syXSAhPSAi IiAmJiAkYXJnc1szXSkgew0KCQkJCQkJCSRyZXAgPSBzdHJfcmVwbGFjZSgkdmFyLCAkYXJn c1sxXS4kYXJnc1syXSwgJHRoaXNtYXRjaCk7DQoJCQkJCQkJaWYgKCFpbl9hcnJheSgkcmVw LCAkeyRvcHZhcn0pKSB7DQoJCQkJCQkJCSR7JG9wdmFyfVtdID0gJHJlcDsNCgkJCQkJCQl9 DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAyOg0KCQkJCQkkcGF0 ID0gJy9cXCcuJHZhci4nJHxcXCcuJHZhci4nW15BLVphLXowLTldLyc7DQoJCQkJCWlmICgo aXNfaW50KHNtZF9wcmVnUG9zKCRwYXQsICR0aGlzbWF0Y2gsICRmbmQpKSkgJiYgaW5fYXJy YXkoJHZhciwkYWxsb3dlZCkpIHsNCgkJCQkJCSRtYXRjaGVkID0gdHJ1ZTsNCgkJCQkJCWlm ICgkYXJnc1syXSAhPSAiIiAmJiAkYXJnc1szXSkgew0KCQkJCQkJCSRyZXAgPSBzdHJfcmVw bGFjZSgkdmFyLCAkYXJnc1sxXS4kYXJnc1syXSwgJHRoaXNtYXRjaCk7DQoJCQkJCQkJaWYg KCFpbl9hcnJheSgkcmVwLCAkeyRvcHZhcn0pKSB7DQoJCQkJCQkJCSR7JG9wdmFyfVtdID0g JHJlcDsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJY2Fz ZSAzOg0KCQkJCQkkbGVuID0gc3RybGVuKCR2YXIpOw0KCQkJCQlpZiAoKHN1YnN0cigkdGhp c21hdGNoLDAsJGxlbikgPT09ICR2YXIpICYmIGluX2FycmF5KCR2YXIuImZpZWxkIiwkYWxs b3dlZCkpIHsNCgkJCQkJCSRtYXRjaGVkID0gdHJ1ZTsNCgkJCQkJCS8vIFVzZSB0aGUgZ2l2 ZW4gZmllbGQgbmFtZTsgd2hpY2ggbWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIHN1Ymxpc3Qu DQoJCQkJCQkvLyBTcGxpdCBvZmYgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgcXVlc3Rpb24g bWFyaw0KCQkJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkdGhpc21hdGNoLCRsZW4pOw0KCQkJ CQkJaWYgKCgkYXJnc1szXSkgJiYgKGlzc2V0KCR0aGlzYXJ0aWNsZVtzdHJ0b2xvd2VyKCRm aWVsZG5hbWUpXSkpKSB7DQoJCQkJCQkJJGZpZWxkQ29udGVudHMgPSAkdGhpc2FydGljbGVb c3RydG9sb3dlcigkZmllbGRuYW1lKV07DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCSRmaWVs ZENvbnRlbnRzID0gJGZpZWxkbmFtZTsNCgkJCQkJCX0NCgkJCQkJCWlmICghZW1wdHkoJGZp ZWxkQ29udGVudHMpKSB7DQoJCQkJCQkJJHN1Ym91dCA9IHNtZF9zcGxpdChzdHJpcF90YWdz KCRmaWVsZENvbnRlbnRzKSwgJGFsbG93UmFuZ2UsICRzcGxpdGF0LCAkcHJlZ29wdCk7DQoJ CQkJCQkJZm9yZWFjaCAoJHN1Ym91dCBhcyAkc3VibmFtZSkgew0KCQkJCQkJCQlpZiAoIWlu X2FycmF5KCRzdWJuYW1lLCAkeyRvcHZhcn0pKSB7DQoJCQkJCQkJCQkkeyRvcHZhcn1bXSA9 ICRzdWJuYW1lOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJ CWJyZWFrOw0KCQkJfQ0KCQkJaWYgKCRtYXRjaGVkKSB7DQoJCQkJYnJlYWs7DQoJCQl9DQoJ CX0NCgkJaWYgKCEkbWF0Y2hlZCkgew0KCQkJLy8gQXNzaWduIHRoZSB2YXJpYWJsZSB2ZXJi YXRpbQ0KCQkJaWYgKCFpbl9hcnJheSgkdGhpc21hdGNoLCAkb3V0KSkgew0KCQkJCSRvdXRb XSA9ICR0aGlzbWF0Y2g7DQoJCQl9DQoJCX0NCgl9DQoJcmV0dXJuIGFycmF5KCRvdXQsJG5v dG91dCk7DQp9DQp9DQoNCi8vIFN0b2xlbiBmcm9tIHBocC5uZXQ6IHN0cnBvcyBwYWdlIGNv bW1lbnRzLi4uDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX3ByZWdQb3MiKSkgew0KZnVu Y3Rpb24gc21kX3ByZWdQb3MoJHNQYXR0ZXJuLCAkc1N1YmplY3QsICYkRm91bmRTdHJpbmcs ICRpT2Zmc2V0ID0gMCkgew0KCSRGb3VuZFN0cmluZyA9IG51bGw7DQoJaWYgKHByZWdfbWF0 Y2goJHNQYXR0ZXJuLCAkc1N1YmplY3QsICRhTWF0Y2hlcywgUFJFR19PRkZTRVRfQ0FQVFVS RSwgJGlPZmZzZXQpID4gMCkgew0KCQkkRm91bmRTdHJpbmcgPSAkYU1hdGNoZXNbMF1bMF07 DQoJCXJldHVybiAkYU1hdGNoZXNbMF1bMV07DQoJfSBlbHNlIHsNCgkJcmV0dXJuIGZhbHNl Ow0KCX0NCn0NCn0NCi8vLi4uIGFuZCBhcnJheV9jb21iaW5lLi4uDQppZiAoIWZ1bmN0aW9u X2V4aXN0cygiYXJyYXlfY29tYmluZSIpKSB7DQoJZnVuY3Rpb24gYXJyYXlfY29tYmluZSgk YXJyMSwkYXJyMikgew0KCQkkb3V0ID0gYXJyYXkoKTsNCgkJZm9yZWFjaCgkYXJyMSBhcyAk a2V5MSA9PiAkdmFsdWUxKSB7DQoJCQkkb3V0WyR2YWx1ZTFdID0gJGFycjJbJGtleTFdOw0K CQl9DQogICAJcmV0dXJuICRvdXQ7DQoJfQ0KfQ0KLy8uLi4gYW5kIGh0bWxzcGVjaWFsY2hh cnNfZGVjb2RlDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygiaHRtbHNwZWNpYWxjaGFyc19kZWNv ZGUiKSkgew0KCWZ1bmN0aW9uIGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCRzdHJpbmcsICRx dW90ZV9zdHlsZSA9IEVOVF9DT01QQVQpIHsNCgkJcmV0dXJuIHN0cnRyKCRzdHJpbmcsIGFy cmF5X2ZsaXAoZ2V0X2h0bWxfdHJhbnNsYXRpb25fdGFibGUoSFRNTF9TUEVDSUFMQ0hBUlMs ICRxdW90ZV9zdHlsZSkpKTsNCgl9DQp9IjtzOjQ6InR5cGUiO3M6MToiMiI7czo1OiJvcmRl ciI7czoxOiI1IjtzOjQ6ImhlbHAiO3M6MTEwMjY6Igk8cD48ZGl2IGlkPSJzbWRfaGVscCI+ PC9wPgoKCTxoMT5zbWRfIHBsdWdpbiBsaWJyYXJ5PC9oMT4KCgk8cD5PZmZlcnMgbm8gcHVi bGljIHRleHRwYXR0ZXJuIHRhZ3MuIEl0IGlzIHNpbXBseSBhIHNoYXJlZCBsaWJyYXJ5IG9m IGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBieSBzbWRfIHBsdWdpbnMuPC9wPgoKCTxoMj5DaGFu Z2Vsb2c8L2gyPgoKCTx1bD4KCQk8bGk+djAuMSAgIDA3LTAyLTI1IEluaXRpYWwgcHVibGlj IHJlbGVhc2U8L2xpPgoJCTxsaT52MC4yICAgMDctMDMtMDMgQWRkZWQ6IDxzcGFuIGNsYXNz PSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPjwvc3Bhbj4gKE11bHRpLUxp bmd1YWwgUGFjaykgbGlicmFyeSBzdXBwb3J0PC9saT4KCQk8bGk+djAuMjEgIDA3LTAzLTA2 IEFkZGVkOiBpbnRlZ2VyIHJhbmdlIGZ1bmN0aW9uYWxpdHkuIDxjb2RlPnNtZF9nZXRBdHRz PC9jb2RlPiBub3cgdGFrZXMgYSBSZWdFeCBhcmc8L2xpPgoJCTxsaT52MC4yMWEgMDctMDMt MjEgRml4ZWQ6IENoYXJhY3RlciByYW5nZXMgaWdub3JlZCAodGhhbmtzIG1yZGFsZSk8L2xp PgoJCTxsaT52MC4yMWIgMDctMDQtMDIgRml4ZWQ6IFN0aWNreSBhcnRpY2xlIHN1cHBvcnQg aW4gPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+ICh0aGFua3MgcGllbWFuKTwvbGk+CgkJPGxp PnYwLjIxYyAwNy0wNy0yOSBGaXhlZDogTnVtZXJpYyByYW5nZXMgaW4gY2F0ZWdvcmllcyAo dGhhbmtzIHdvbGxlKTwvbGk+CgkJPGxpPnYwLjIxZCAwNy0wOC0wMyBGaXhlZDogTmVnYXRp b24gd2l0aCBtdWx0aXBsZSBlbGVtZW50czwvbGk+CgkJPGxpPnYwLjIxZSAwNy0wOS0xNCBG aXhlZDogQWJpbGl0eSB0byBsZWF2ZSBlbXB0eSBzcGxpdFJhbmdlIHBhcmFtZXRlcnMgaW50 YWN0PC9saT4KCQk8bGk+djAuMjIgIDA3LTA5LTIwIEZpeGVkOiBVbmRlZmluZWQgaW5kZXgg d2FybmluZ3MgKHRoYW5rcyBBbWJpdGlvdXNsZW1vbikuIEVuaGFuY2VkIG1hdGNoZXMgc28g c3BhY2VzIGFyZSBhbGxvd2VkIGluIHN0cmluZ3MgKHRoYW5rcyBEclJvZ2cpPC9saT4KCQk8 bGk+djAuMjMgIDA3LTA0LTA5IDxzcGFuIGNsYXNzPSJjYXBzIj5CRVRBPC9zcGFuPiA6IEFk ZGVkIHRoZSBGdXp6eUZpbmQgY2xhc3MgYW5kIGdldFdvcmQgZnVuY3Rpb24uIGdldEF0dHMo KSBub3cgYWxsb3dzIDxjb2RlPj9xPC9jb2RlPjwvbGk+CgkJPGxpPnYwLjMgICAwNy0xMC0y OSBSZXdyb3RlIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiBhcyA8Y29kZT5zbWRfZ2V0T3B0 czwvY29kZT4gdG8gYWxsb3cgcmVwbGFjZWQgdmFycyB3aXRoaW4gdGV4dC4gRGVwcmVjYXRl ZCA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4sIGFkZGVkIDxjb2RlPnNtZF9wcmVnUG9zPC9j b2RlPi4gQ2hhbmdlZCA8Y29kZT5zbWRfc3BsaXRSYW5nZTwvY29kZT4gYXMgPGNvZGU+c21k X3NwbGl0PC9jb2RlPiB0byBhbGxvdyByYW5nZXMgdG8gYmUgc3dpdGNoZWQgb24gb3Igb2Zm LiBEZXByZWNhdGVkIDxjb2RlPnNtZF9zcGxpdFJhbmdlPC9jb2RlPi4gQWRkZWQgZ2VuZXJp YyA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPiBjbGFzcyBzdXBwb3J0ICg8Y29kZT5z bWRfTUxQPC9jb2RlPikuIERlcHJlY2F0ZWQgPGNvZGU+c21kTUxQPC9jb2RlPiBhcnJheSwg PGNvZGU+c21kX2dUeHQ8L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0Q2FsbGVyPC9jb2RlPi4g TWFkZSA8Y29kZT5zbWRfRnV6enlGaW5kPC9jb2RlPiBhbmQgPGNvZGU+c21kX2dldFdvcmQ8 L2NvZGU+IG9mZmljaWFsPC9saT4KCQk8bGk+djAuMzEgIDA3LTExLTI3IFJlbW92ZWQgPGNv ZGU+c21kTUxQPC9jb2RlPiBhcnJheSwgPGNvZGU+c21kX2dUeHQ8L2NvZGU+IGFuZCA8Y29k ZT5zbWRfZ2V0Q2FsbGVyPC9jb2RlPi4gRGVwcmVjYXRlZCA8Y29kZT5zbWRfZ2V0U3ViQ2F0 czwvY29kZT4uIEFkZGVkIGEgZmV3IFBIUDQgaGVscGVyIGZ1bmN0aW9uczwvbGk+CgkJPGxp PnYwLjMyICAwOC0wMy0yOSBSZW1vdmVkIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiBhbmQg PGNvZGU+c21kX2dldFN1YkNhdHM8L2NvZGU+LiBEZXByZWNhdGVkIDxjb2RlPnNtZF9nZXRP cHRzPC9jb2RlPiBhbmQgPGNvZGU+c21kX3NwbGl0PC9jb2RlPi4gQWRkZWQgPGNvZGU+c21k X2RvTGlzdDwvY29kZT4uIE1vdmVkIHRoZSA8Y29kZT5zbWRfRnV6enlGaW5kPC9jb2RlPiBj bGFzcyBhbmQgPGNvZGU+c21kX2dldFdvcmQ8L2NvZGU+IGludG8gdGhlIHNtZF9mdXp6eV9m aW5kIHBsdWdpbiB3aGVyZSB0aGV5IHNob3VsZCBoYXZlIGJlZW4gYWxsIGFsb25nPC9saT4K CQk8bGk+djAuMzMgIDA4LTEyLTAyIFVuZGVwcmVjYXRlZCghKSA8Y29kZT5zbWRfc3BsaXQ8 L2NvZGU+IHNpbmNlIGl0JiM4MjE3O3MgYWN0dWFsbHkgcXVpdGUgdXNlZnVsIDsgZXh0ZW5k ZWQgPGNvZGU+c21kX2RvTGlzdDwvY29kZT4gdG8gZW5jb21wYXNzIDxjb2RlPiR0aGlzaW1h Z2U8L2NvZGU+IChmb3IgZnV0dXJlKSBhbmQgPGNvZGU+JHZhcmlhYmxlPC9jb2RlPiA7IGZp eGVkIGJ1ZyBpbiA8Y29kZT5zbWRfZG9MaXN0PC9jb2RlPiB3aGVuIHVzaW5nIHN1YmNhdHM8 L2xpPgoJCTxsaT52MC4zNCAgMDgtMTItMTMgPGNvZGU+c21kX2RvTGlzdDwvY29kZT4gdXNl cyBhIHVuaWNvZGUgcmVnZXg8L2xpPgoJCTxsaT52MC4zNSAgMDktMDItMjQgPGNvZGU+c21k X2RvTGlzdDwvY29kZT4gZml4ZWQgcmFuZ2VzIGluICYjODIxNjs/JiM4MjE3OyB2YXJpYWJs ZXMgKHRoYW5rcyBrb29icyk8L2xpPgoJCTxsaT52MC4zNiAgMDktMDQtMDIgPGNvZGU+c21k X2RvTGlzdDwvY29kZT4gZmFsbHMgYmFjayB0byA8c3BhbiBjbGFzcz0iY2FwcyI+QVNDSUk8 L3NwYW4+IGlmIFVuaWNvZGUgbm90IGF2YWlsYWJsZSAodGhhbmtzIFJlZEZveCAvIG1sYXJp bm8gLyBkZWNvZGVybHRkKTwvbGk+Cgk8L3VsPgoKCTxoMj5GdW5jdGlvbiBSZWZlcmVuY2U8 L2gyPgoKCTxwPjxzdHJvbmc+c21kX2FkZFFTVmFyPC9zdHJvbmc+PGJyIC8+CjxzdHJvbmc+ c21kX3JlbW92ZVFTVmFyPC9zdHJvbmc+PC9wPgoKCTxwPkFkZCBvciByZW1vdmUgYSBxdWVy eSBzdHJpbmcgdmFyaWFibGUgdG8gdGhlIGdpdmVuIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8 L3NwYW4+LCB0YWtpbmcgaW50byBhY2NvdW50IGFueSBleGlzdGluZyB2YXJpYWJsZXMgdGhh dCBtYXkgYmUgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+IGFscmVhZHku ICYjODIxNjtBZGQmIzgyMTc7IHRha2VzIHRocmVlIGFyZ3VtZW50cywgJiM4MjE2O1JlbW92 ZSYjODIxNzsganVzdCB0YWtlcyB0aGUgZmlyc3QgdHdvOjwvcD4KCgk8b2w+CgkJPGxpPlRo ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPiBzdHJpbmcgdG8gYWRkIHRvL3JlbW92 ZSBmcm9tPC9saT4KCQk8bGk+VGhlIGlkIG9mIHRoZSBxdWVyeXN0cmluZyAodGhlIGJpdCBi ZWZvcmUgdGhlID0gc2lnbik8L2xpPgoJCTxsaT5UaGUgdmFsdWUgb2YgdGhlIG5ldyBxdWVy eXN0cmluZyAodGhlIGJpdCBhZnRlciB0aGUgPSBzaWduKTwvbGk+Cgk8L29sPgoKCTxwPmUu Zy4gPGNvZGU+c21kX2FkZFFTVmFyKCR0aGlzYXJ0aWNsZVsmIzM5O3VybF90aXRsZSYjMzk7 XSwgJiMzOTt0cGcmIzM5OywgMTUpOzwvY29kZT4gd291bGQgYWRkIDxjb2RlPnRwZz0xNTwv Y29kZT4gdG8gdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIDxzcGFuIGNsYXNzPSJjYXBz Ij5VUkw8L3NwYW4+LiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdmFyaWFibGVzIGN1cnJlbnRs eSBpbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4sIGl0IGlzIGFkZGVkIHdp dGggYSBxdWVzdGlvbiBtYXJrLCBvdGhlcndpc2UgaXQgaXMgYXBwZW5kZWQgd2l0aCBhbiBh bXBlcnNhbmQuPC9wPgoKCTxwPjxzdHJvbmc+c21kX2RvTGlzdDwvc3Ryb25nPjwvcD4KCgk8 cD5SZXR1cm4gYW4gZXhwYW5kZWQgbGlzdCBvZiBpdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcg cHJvcGVydGllczo8L3A+CgoJPG9sPgoJCTxsaT5Bbnl0aGluZyBjb250YWluaW5nICYjODIx Njs/JiM4MjE3OyBvciAmIzgyMTY7ISYjODIxNzsgaXMgY2hlY2tlZCBmb3IgYSBtYXRjaCB3 aXRoIGEgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gZmllbGQgKDxjb2RlPiZsdDt0 eHA6dmFyaWFibGUgLyZndDs8L2NvZGU+LCBpbWFnZSwgZmlsZSwgbGluaywgZ2xvYmFsIGFy dGljbGUsIHVybCA8c3BhbiBjbGFzcz0iY2FwcyI+UE9TVDwvc3Bhbj4vR0VUL1NFUlZFUiwg b3IgaW5kaXZpZHVhbCBhcnRpY2xlLCBpbiB0aGF0IG9yZGVyKTwvbGk+CgkJPGxpPkFueSBy YW5nZXMgb2YgaXRlbXMgYXJlIGV4cGFuZGVkIChlLmcuIDQtNyA9Jmd0OyA0LDUsNiw3KSBp ZiB0aGUgPGNvZGU+cm5nPC9jb2RlPiBvcHRpb24gcGVybWl0cyBpdDwvbGk+CgkJPGxpPjxz cGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IGZpZWxkcyBtYXkgdGhlbXNlbHZlcyBiZSBs aXN0cyBvciByYW5nZXM8L2xpPgoJCTxsaT5Bbnl0aGluZyB0aGF0IGlzIG5vdCBhIDxzcGFu IGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IGZpZWxkIGlzIHVzZWQgdmVyYmF0aW08L2xpPgoJ CTxsaT5UaGUgaXRlbXMgYXJlIHJldHVybmVkIGFzIDIgbGlzdHM7IGluY2x1c2lvbiBhbmQg ZXhjbHVzaW9uPC9saT4KCTwvb2w+CgoJPHA+QXJncyAoIFsqXSA9IG1hbmRhdG9yeSApIDoK CTxvbD4KCQk8bGk+WypdIGxzdCA9IHRoZSBsaXN0IGFzIGEgZGVsaW1pdGVkIHN0cmluZzwv bGk+CgkJPGxpPnJuZyA9IHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2VzIG9yIG5vdCAoYm9vbCku IERlZmF1bHQgPSB0cnVlPC9saT4KCQk8bGk+c3ViID0gdGhlIHR5cGUgb2Ygc3ViY2F0ZWdv cnkgdG8gdHJhdmVyc2UgKGltYWdlLCBmaWxlLCBsaW5rLCBhcnRpY2xlLCBub25lPSYjODIy MTsmIzgyMjA7KSBhbmQgaG93IG1hbnkgbGV2ZWxzIHRvIGdvIGRvd24gKGUuZy4gaW1hZ2U6 MikuIERlZmF1bHQgPSAmIzgyMTY7JiM4MjE3OzwvbGk+CgkJPGxpPnF0ZSA9IHdoZXRoZXIg dG8gcXVvdGUgZWFjaCBpdGVtIGluIHRoZSBhcnJheSBvciBub3QgKGJvb2wpLiBEZWZhdWx0 ID0gdHJ1ZTwvbGk+CgkJPGxpPmRsbSA9IHRoZSBkZWxpbWl0ZXIgKHN0cmluZykuIERlZmF1 bHQgPSAmIzgyMjA7LCYjODIyMTs8L2xpPgoJCTxsaT5sYXggPSBXaGV0aGVyIHRvIGJlIGxh eCBvciBzdHJpY3QgYWJvdXQgd2hhdCBjaGFyYWN0ZXJzIGNvbnN0aXR1dGUgYSBmaWVsZDsg cHJpbWFyaWx5IHdoZXRoZXIgc3BhY2VzIGFyZSBhbGxvd2VkIGluLCBzYXksIGN1c3RvbSBm aWVsZHMuIERlZmF1bHQgPSAmIzgyMjA7MSYjODIyMTs8L2xpPgoJPC9vbD48L3A+CgoJPHA+ PHN0cm9uZz5zbWRfZ2V0T3B0czwvc3Ryb25nPjwvcD4KCgk8cD5EZXByZWNhdGVkIGFzIGl0 IGlzIG1vc3RseSBzdXBlcnNlZGVkIGJ5IHNtZF9kb0xpc3Q7IHRoaXMgb25lIGlzIGNsdW5r aWVyIGJ1dCBoYXMgJGlkcHJlZml4IHNvIGl0IHJlbWFpbnMgZm9yIG5vdy4gSXQgc2VhcmNo ZXMgdGhlIHBhc3NlZCBzdHJpbmcgZm9yIHByZWRldGVybWluZWQgc2VxdWVuY2VzIG9mIGNo YXJhY3RlcnMgYW5kLCBpZiB0aGF0IHNlcXVlbmNlIGlzIGluIHRoZSBnaXZlbiAkYWxsb3dl ZCBhcnJheSwgcmVwbGFjZXMgaXQgYXMgZm9sbG93czo8L3A+CgoJPHVsPgoJCTxsaT4/YyA9 IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5ICghYyA9IG5vdCBjdXJyZW50IGNhdGVnb3J5KTwv bGk+CgkJPGxpPj9zID0gY3VycmVudCBzZWN0aW9uICghcyA9IG5vdCBjdXJyZW50IHNlY3Rp b24pPC9saT4KCQk8bGk+P3QgPSBjdXJyZW50IGFydGljbGUgdGl0bGUgKCF0ID0gbm90IGN1 cnJlbnQgdGl0bGUpPC9saT4KCQk8bGk+P2lkID0gY3VycmVudCBhcnRpY2xlIElELCBwcmVw ZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFpZCA9IG5vdCBjdXJyZW50IElEKTwvbGk+CgkJPGxp Pj9xID0gY3VycmVudCBxdWVyeSB0ZXJtICghcSA9IG5vdCBjdXJyZW50IHF1ZXJ5IHRlcm0p PC9saT4KCQk8bGk+P2ZpZWxkID0gY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYj ODIxNztzIGZpZWxkIChjb3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+CgkJ PGxpPiFmaWVsZCA9IG5vdCB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYj ODIxNztzIGZpZWxkIChjb3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+Cgk8 L3VsPgoKCTxwPkludGVnZXIgcmFuZ2VzIChlLmcuIDEtNSkgd2lsbCBiZSBleHBhbmRlZCBp bnRvIHRoZWlyIGluZGl2aWR1YWwgdmFsdWVzIGlmIHRoZSAkYWxsb3dSYW5nZSBvcHRpb24g aXMgdHJ1ZTsgYW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCB2ZXJiYXRpbS4gSXQgb3V0cHV0 cyB0d28gYXJyYXlzOiB0aGUgMXN0IGNvbnRhaW5zIGl0ZW1zIGZvciBpbmNsdXNpb24sIHRo ZSAybmQgY29udGFpbnMgaXRlbXMgZm9yIGV4Y2x1c2lvbi48L3A+CgoJPHA+QXJncyAoIFsq XSA9IG1hbmRhdG9yeSApIDoKCTxvbD4KCQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc2VhcmNo IGZvciBtYXRjaGVzPC9saT4KCQk8bGk+WypdIEFuIGFycmF5IGNvbnRhaW5pbmcgc2hvcnRj dXRzIHRoYXQgYXJlICYjODIyMDthbGxvd2VkJiM4MjIxOyB0byBiZSBmb3VuZCBpbiB0aGUg c3RyaW5nICg/YywgP3MsID90LCA/ZmllbGQgZXRjKTwvbGk+CgkJPGxpPlRoZSBwcmVmaXgg Zm9yID9pZCBzdHJpbmdzPC9saT4KCQk8bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIg dG8gYWxsb3cgcmFuZ2UgZXhwYW5zaW9uIG9yIG5vdDwvbGk+CgkJPGxpPlJlZ0V4IHN0cmlu ZyB0byBzcGxpdCBvcHRpb25zIGF0IChzZWUgc21kX3NwbGl0KTwvbGk+CgkJPGxpPnByZWdf c3BsaXQgb3B0aW9uIChzZWUgc21kX3NwbGl0KTwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ry b25nPnNtZF9zcGxpdDwvc3Ryb25nPjwvcD4KCgk8cD5SZXR1cm5zIGFuIGFycmF5IG9mIGl0 ZW1zIGZyb20gYSBzdHJpbmcgb2YgKHVzdWFsbHkpIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMu IElmIGFueSB2YWx1ZXMgY29udGFpbiByYW5nZXMgb2YgbnVtYmVycyBsaWtlIDEtNSB0aGF0 IG5lZWQgJiM4MjE2O2V4cGFuZGluZyYjODIxNzsgZmlyc3QgKGFuZCAkYWxsb3dSYW5nZSBp cyB0cnVlKSwgdGhleSBhcmUgZGVhbHQgd2l0aC4gVGFrZXMgdGhlIGZvbGxvd2luZyBhcmd1 bWVudHMgKCBbKl0gPSBtYW5kYXRvcnkgYXJncykgOjwvcD4KCgk8b2w+CgkJPGxpPlsqXSBU aGUgc3RyaW5nIHRvIHNwbGl0PC9saT4KCQk8bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRo ZXIgdG8gYWxsb3cgcmFuZ2UgZXhwYW5zaW9uIG9yIG5vdCAoaS5lLiAxLTUgYmVjb21lcyAx LDIsMyw0LDUpPC9saT4KCQk8bGk+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIg Y2xhc3NlcyB0byBtYXRjaC4gSWYgYSBmdWxsIFJlZ0V4IHN0YXJ0aW5nIGFuZCBlbmRpbmcg d2l0aCAmIzgyMTY7LyYjODIxNzsgY2hhcmFjdGVycyBpcyBzdXBwbGllZCwgdGhlIGV4cHJl c3Npb24gaXMgdXNlZCB2ZXJiYXRpbS4gV2l0aG91dCB0aGUgJiM4MjE2Oy8mIzgyMTc7IGNo YXJhY3RlcnMsIHRoZSBleHByZXNzaW9uIGlzIHRyZWF0ZWQgYXMgYSBsaXN0IG9mIGNoYXJh Y3RlciBjbGFzc2VzIHRvIGZpbmQuIERlZmF1bHRzIHRvICYjODIyMDsvKCx8LFxzKSsvJiM4 MjIxOyB3aGljaCBpcyBhIGNvbW1hLCBvciBjb21tYSBhbmQgYSB3aGl0ZXNwYWNlIGNoYXJh Y3Rlci48L2xpPgoJCTxsaT5wcmVnX3NwbGl0IG9wdGlvbiBjb25zdGFudCBhcyBkZWZpbmVk IGluIHRoZSBwaHAgbWFudWFsPC9saT4KCTwvb2w+CgoJPHA+PHN0cm9uZz5zbWRfTUxQPC9z dHJvbmc+PGJyIC8+Ckluc3RhbnRpYXRlIG9uZSBvZiB0aGVzZSB0byBoYW5kbGUgPGFjcm9u eW0gdGl0bGU9Ik11bHRpLUxpbmd1YWwgUGFjayI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwv c3Bhbj48L2Fjcm9ueW0+IGluIHlvdXIgcGx1Z2luIGxpa2UgdGhpczo8L3A+CgoJPHA+MSkg RGVjbGFyZSBhIHVuaXF1ZSBnbG9iYWwgdmFyaWFibGUsIGUuZy4gZ2xvYmFsICRteVBsdWc8 YnIgLz4KMikgRGVmaW5lIHlvdXIgZGVmYXVsdCBzdHJpbmcgcmVwbGFjZW1lbnQgYXJyYXkg KGRvZXNuJiM4MjE3O3QgbmVlZCB0byBiZSBnbG9iYWwpLCBlLmc6PC9wPgoKCTxwPgkkbXlT dHJpbmdzID0gYXJyYXkgKCYjODIyMDttc2cxJiM4MjIxOyA9Jmd0OyAmIzgyMjA7VGhpcyBp cyBtZXNzYWdlIDEmIzgyMjE7LCAmIzgyMjA7bXNnMiYjODIyMTsgPSZndDsgJiM4MjIwO1Ro aXMgaXMgbWVzc2FnZSAyJiM4MjIxOyk7PC9wPgoKCTxwPjMpIENyZWF0ZSBhbiA8c3BhbiBj bGFzcz0iY2FwcyI+TUxQPC9zcGFuPiBoYW5kbGVyOjwvcD4KCgk8cD4JJG15UGx1ZyA9IG5l dyBzbWRfTUxQKCYjODIyMDtwbHVnaW5fbmFtZSYjODIyMTssICYjODIyMDtwbHVnaW5fcHJl Zml4JiM4MjIxOywgJG15U3RyaW5ncyk7PC9wPgoKCTxwPjQpIFRoYXQmIzgyMTc7cyBpdCEg VGhlcmUgYXJlIHR3byBvcHRpb25hbCBhcmdzIHRvIHNtZF9NTFA6CglhKSB0aGUgZGVmYXVs dCAoZnVsbCkgbGFuZ3VhZ2UgdG8gdXNlLCBlLmcgJiM4MjIwO2RhLWRrJiM4MjIxOy4gRGVm YXVsdHMgdG8gJiM4MjIwO2VuLWdiJiM4MjIxOy4KCWIpIHRoZSBpbnRlcmZhY2UgdGhlIHN0 cmluZ3MgYXJlIGZvci4gQ2hvb3NlIGZyb20gJiM4MjIwO3B1YmxpYyYjODIyMTsgKHRoZSBk ZWZhdWx0KSwgJiM4MjIwO2FkbWluJiM4MjIxOyBvciAmIzgyMjA7Y29tbW9uJiM4MjIxOzwv cD4KCgk8cD41KSBUbyB1c2UgYSByZXBsYWNlbWVudCBzdHJpbmcgaW4geW91ciBjb2RlOgoJ YSkgTWFrZSBzdXJlIHRvIGltcG9ydCB0aGUgdW5pcXVlIGdsb2JhbCB2YXJpYWJsZTogZS5n LiBnbG9iYWwgJG15UGx1ZzsKCWIpIENhbGwgJG15UGx1Zy0mZ3Q7Z1R4dCgmIzgyMjA7bWVz c2FnZUlEJiM4MjIxOyk7IFsgZS5nLiAkbXlQbHVnLSZndDtnVHh0KCYjODIyMDttc2cxJiM4 MjIxOykgXQoJYykgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhbnkgYXJncyBpbiB5b3VyIG1l c3NhZ2Ugc3RyaW5nLCBwYXNzIGFuIGFzc29jaWF0aXZlIGFycmF5IGFzIHRoZSAybmQgYXJn IHRvIGdUeHQoKTwvcD4KCgk8cD48c3Ryb25nPnNtZF9kb0RibFF1b3RlPC9zdHJvbmc+PC9w PgoKCTxwPkFsdGVybmF0aXZlIHRvIHRoZSBjb3JlJiM4MjE3O3MgZG9RdW90ZSgpLiBUaGlz IG9uZSBkYmwtcXVvdGVzIGluc3RlYWQgb2Ygc2dsLXF1b3RlczwvcD4KCgk8cD48c3Ryb25n PnNtZF9wcmVnUG9zPC9zdHJvbmc+PC9wPgoKCTxwPkxpZnRlZCBmcm9tIG9uZSBvZiB0aGUg Y29tbWVudHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IG1hbnVhbCwg dGhpcyBqdXN0IGxvb2tzIGZvciBhIFJlZ0V4IHN0cmluZyB3aXRoaW4gYW5vdGhlciwgcmV0 dXJuaW5nIHRoZSBtYXRjaGVzIGl0IGZpbmRzIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZp cnN0IG1hdGNoLjwvcD4KCgk8cD48c3Ryb25nPmFycmF5X2NvbWJpbmU8L3N0cm9uZz48L3A+ CgoJPHA+UEhQNCBlcXVpdmFsZW50IG9mIHRoZSBzdGFuZGFyZCBQSFA1IGZ1bmN0aW9uLCBs aWZ0ZWQgZnJvbSBwaHAubmV0PC9wPgoKCTxwPjxzdHJvbmc+aHRtbHNwZWNpYWxjaGFyc19k ZWNvZGU8L3N0cm9uZz48L3A+CgoJPHA+UEhQNCBlcXVpdmFsZW50IG9mIHRoZSBzdGFuZGFy ZCBQSFA1IGZ1bmN0aW9uLCBsaWZ0ZWQgZnJvbSBwaHAubmV0PC9wPgoKICA8L2Rpdj4KPCEt LSAtLS0gQkVHSU4gUExVR0lOIENTUyAtLS0gLS0+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+ CiNzbWRfaGVscCB7IGxpbmUtaGVpZ2h0OjEuMyA7fQojc21kX2hlbHAgY29kZSB7IGZvbnQt d2VpZ2h0OmJvbGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBjb3VyaWVyLCBt b25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQojc21kX2hlbHAgY29kZS5i bG9jayB7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgYm9yZGVyOjFweCBkb3R0ZWQgIzk5OTsgYmFj a2dyb3VuZC1jb2xvcjogI2YwZTY4YzsgZGlzcGxheTpibG9jazsgbWFyZ2luOjEwcHggMTBw eCAyMHB4OyBwYWRkaW5nOjEwcHg7IH0KI3NtZF9oZWxwIGE6bGluaywgI3NtZF9oZWxwIGE6 dmlzaXRlZCB7IGNvbG9yOiBibHVlOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRlci1i b3R0b206IDFweCBzb2xpZCBibHVlOyBwYWRkaW5nLWJvdHRvbToxcHg7fQojc21kX2hlbHAg YTpob3ZlciwgI3NtZF9oZWxwIGE6YWN0aXZlIHsgY29sb3I6IGJsdWU7IHRleHQtZGVjb3Jh dGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGJsdWU7IHBhZGRpbmctYm90 dG9tOjFweDt9CiNzbWRfaGVscCBoMSB7IGNvbG9yOiAjMzY5OyBmb250OiAyMHB4IEdlb3Jn aWEsIHNhbnMtc2VyaWY7IG1hcmdpbjogMDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CiNzbWRf aGVscCBoMiB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsgcGFkZGluZzoxMHB4 IDAgMDsgY29sb3I6ICMzNjk7IGZvbnQ6IDE3cHggR2VvcmdpYSwgc2Fucy1zZXJpZjsgfQoj c21kX2hlbHAgaDMgeyBjb2xvcjogIzY5MzsgZm9udDogYm9sZCAxMnB4IEFyaWFsLCBzYW5z LXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46IDEwcHggMCAwO3RleHQtdHJh bnNmb3JtOiB1cHBlcmNhc2U7fQojc21kX2hlbHAgaDQgeyBmb250OiBib2xkIDExcHggQXJp YWwsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAwIDAg O3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KI3NtZF9oZWxwIC5hdHQtbmFtZSB7IGZv bnQtd2VpZ2h0OmJvbGQ7IH0KI3NtZF9oZWxwIC5tYW5kIHsgYmFja2dyb3VuZDojZWVlOyBi b3JkZXI6MXB4IGRvdHRlZCAjOTk5OyB9CiNzbWRfaGVscCB0YWJsZSB7d2lkdGg6MTAwJTsg dGV4dC1hbGlnbjpjZW50ZXI7IHBhZGRpbmctYm90dG9tOjFlbTt9CiNzbWRfaGVscCB0ZCwg I3NtZF9oZWxwIHRoIHtib3JkZXI6MXB4IHNvbGlkICM5OTk7IHBhZGRpbmc6LjVlbSAwO30K PC9zdHlsZT4KPCEtLSAtLS0gRU5EIFBMVUdJTiBDU1MgLS0tIC0tPgoiO3M6MzoibWQ1Ijtz OjMyOiI0YzQ3NjU2ODAyMTBkOTA3NzcyZTQ0YmNhM2I0NmI3NyI7fQ==