# Name: smd_lib v0.32 # Type: Library plugin # Shared function library used by smd_ plugins and others. # Author: Stef Dawson # URL: http://stefdawson.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6Nzoic21kX2xpYiI7czo2OiJhdXRob3IiO3M6MTE6IlN0ZWYg RGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nvbi5jb20v IjtzOjc6InZlcnNpb24iO3M6NDoiMC4zMiI7czoxMToiZGVzY3JpcHRpb24iO3M6NTY6IlNo YXJlZCBmdW5jdGlvbiBsaWJyYXJ5IHVzZWQgYnkgc21kXyBwbHVnaW5zIGFuZCBvdGhlcnMu IjtzOjQ6ImNvZGUiO3M6OTkyNToiLy8gU29mdHdhcmUgZW5naW5lZXJzIGxvb2sgYXdheSBu b3cgdW5sZXNzIHlvdSB3aXNoIHRvIGJlIGhvcnJpZmllZCBieSB0aGUgYW1vdW50DQovLyBv ZiBjb3VwbGluZyBhbmQgY29oZXNpb24gaW4gdGhlc2UgZnVuY3Rpb25zLiBJJ20gd2Fybmlu ZyB5b3UuLi4gaXQncyBub3QgcHJldHR5DQppZiAoIWNsYXNzX2V4aXN0cygnc21kX01MUCcp KSB7DQpjbGFzcyBzbWRfTUxQIHsNCgl2YXIgJHNtZF9zdHJpbmdzOw0KCXZhciAkc21kX293 bmVyOw0KCXZhciAkc21kX3ByZWZpeDsNCgl2YXIgJHNtZF9sYW5nOw0KCXZhciAkc21kX2V2 ZW50Ow0KCWZ1bmN0aW9uIHNtZF9NTFAoJHBsdWcsICRwcmVmeCwgJHN0cmFycmF5LCAkbG5n PSdlbi1nYicsICRldj0ncHVibGljJykgew0KCQkkdGhpcy0+c21kX293bmVyID0gJHBsdWc7 DQoJCSR0aGlzLT5zbWRfcHJlZml4ID0gJHByZWZ4Ow0KCQkkdGhpcy0+c21kX3N0cmluZ3Mg PSAkc3RyYXJyYXk7DQoJCSR0aGlzLT5zbWRfbGFuZyA9ICRsbmc7DQoJCSR0aGlzLT5zbWRf ZXZlbnQgPSAkZXY7DQoJCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCYkdGhpcywgJ3NtZF9D YWxsYmFjaycpLCAnbDEwbi5lbnVtZXJhdGVfc3RyaW5ncycpOw0KCX0NCglmdW5jdGlvbiBz bWRfQ2FsbGJhY2soJGV2ZW50PSdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJywgJHN0ZXA9Jycs ICRwcmU9MCkgew0KCQkkciA9IGFycmF5KA0KCQkJJ293bmVyJyA9PiAkdGhpcy0+c21kX293 bmVyLA0KCQkJJ3ByZWZpeCcgPT4gJHRoaXMtPnNtZF9wcmVmaXgsDQoJCQknbGFuZycgPT4g JHRoaXMtPnNtZF9sYW5nLA0KCQkJJ2V2ZW50JyA9PiAkdGhpcy0+c21kX2V2ZW50LA0KCQkJ J3N0cmluZ3MnID0+ICR0aGlzLT5zbWRfc3RyaW5ncywNCgkJKTsNCgkJcmV0dXJuICRyOw0K CX0NCgkvLyBHZW5lcmljIGxvb2t1cA0KCS8vICAkd2hhdCA9IGtleSB0byBsb29rIHVwDQoJ Ly8gICRhcmdzID0gYW55IGFyZ3VtZW50cyB0aGUga2V5IGlzIGV4cGVjdGluZyBmb3IgcmVw bGFjZW1lbnQNCglmdW5jdGlvbiBnVHh0KCR3aGF0LCAkYXJncyA9IGFycmF5KCkpIHsNCgkJ Z2xvYmFsICR0ZXh0YXJyYXk7DQoNCgkJLy8gUHJlcGFyZSB0aGUgcHJlZml4ZWQga2V5IGZv ciB1c2UNCgkJJGtleSA9ICR0aGlzLT5zbWRfcHJlZml4IC4gJy0nIC4gJHdoYXQ7DQoJCSRr ZXkgPSBzdHJ0b2xvd2VyKCRrZXkpOw0KDQoJCS8vIEdyYWIgZnJvbSB0aGUgZ2xvYmFsIHRl eHRhcnJheSAocG9zc2libHkgZWRpdGVkIGJ5IE1MUCkgaWYgd2UgY2FuDQoJCWlmKGlzc2V0 KCR0ZXh0YXJyYXlbJGtleV0pKSB7DQoJCQkkc3RyID0gJHRleHRhcnJheVska2V5XTsNCgkJ fSBlbHNlIHsNCgkJCS8vIFRoZSBzdHJpbmcgaXNuJ3QgaW4gdGhlIGxvY2FsaXNlZCB0ZXh0 YXJyYXkgc28gZmFsbGJhY2sgdG8gdXNpbmcNCgkJCS8vIHRoZSAobm9uIHByZWZpeGVkKSBz dHJpbmcgYXJyYXkgaW4gdGhlIHBsdWdpbg0KCQkJJGtleSA9IHN0cnRvbG93ZXIoJHdoYXQp Ow0KCQkJJHN0ciA9IChpc3NldCgkdGhpcy0+c21kX3N0cmluZ3NbJGtleV0pKSA/ICR0aGlz LT5zbWRfc3RyaW5nc1ska2V5XSA6ICR3aGF0Ow0KCQl9DQoJCS8vIFBlcmZvcm0gc3Vic3Rp dHV0aW9ucw0KCQlpZighZW1wdHkoJGFyZ3MpKSB7DQoJCQkkc3RyID0gc3RydHIoJHN0ciwg JGFyZ3MpOw0KCQl9DQoNCgkJcmV0dXJuICRzdHI7DQoJfQ0KfQ0KfQ0KDQppZiAoIWZ1bmN0 aW9uX2V4aXN0cygic21kX2RvTGlzdCIpKSB7DQpmdW5jdGlvbiBzbWRfZG9MaXN0KCRsc3Qs ICRybmc9dHJ1ZSwgJHN1Yj0iIiwgJHF0ZT10cnVlLCAkZGxtPSIsIikgew0KCWdsb2JhbCAk dGhpc2FydGljbGUsICRwcmV0ZXh0Ow0KDQoJJGluYyA9ICRleGMgPSBhcnJheSgpOw0KCSRs c3QgPSBkb19saXN0KCRsc3QsICRkbG0pOw0KCSRtb2RSRSA9ICcvKFw/fFwhKShbQS1aYS16 MC05X1wtIF0rKS8nOw0KCWZvcmVhY2ggKCRsc3QgYXMgJGl0ZW0pIHsNCgkJJG1vZCA9IDA7 IC8vIDAgPSBpbmNsdWRlLCAxID0gZXhjbHVkZQ0KCQkkbnVtTW9kcyA9IHByZWdfbWF0Y2hf YWxsKCRtb2RSRSwgJGl0ZW0sICRtb2RzKTsNCg0KCQlmb3IgKCRtb2RDdHIgPSAwOyAkbW9k Q3RyIDwgJG51bU1vZHM7ICRtb2RDdHIrKykgew0KCQkJLy8gbW9kICJ0eXBlIiBpcyBnb3Zl cm5lZCBieSB0aGUgZmlyc3Qgb25lIGZvdW5kIG9ubHkuIGkuZS4gaWYgImFydGljbGUtP2Mh cyIgd2FzIHVzZWQgaW4gb25lIGZpZWxkDQoJCQkvLyBpdCB3b3VsZCBiZSBhbiAiaW5jbHVk ZSIgb2YgdGhlIHdvcmQgImFydGljbGUtIiBwbHVzIHRoZSBjYXRlZ29yeSBhbmQgc2VjdGlv biBjb25jYXRlbmF0ZWQNCgkJCSRtb2QgPSAoJG1vZHNbMV1bMF0gPT09ICIhIikgPyAxIDog MDsNCgkJCSRtb2RDaGFyID0gJG1vZHNbMV1bJG1vZEN0cl07DQoJCQkkbW9kSXRlbSA9IHRy aW0oJG1vZHNbMl1bJG1vZEN0cl0pOw0KCQkJJGxvd2l0ZW0gPSBzdHJ0b2xvd2VyKCRtb2RJ dGVtKTsNCgkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCRsb3dpdGVtLCAkcHJldGV4dCkpIHsN CgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkcHJldGV4dFsk bG93aXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSBpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWyRs b3dpdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVt LCAkdGhpc2FydGljbGVbJGxvd2l0ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2Ugew0KCQkJCSRp dGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICRtb2RJdGVtLCAkaXRlbSk7 DQoJCQl9DQoJCX0NCg0KCQkvLyBIYW5kbGUgcmFuZ2VzIG9mIHZhbHVlcw0KCQlpZiAoJHJu ZyAmJiBwcmVnX21hdGNoKCcvXihcZCspXC0oXGQrKSQvJywgJGl0ZW0pKSB7DQoJCQlsaXN0 KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0iLCAkaXRlbSwgMik7DQoJCQkkaXRlbSA9IGltcGxv ZGUoJGRsbSwgcmFuZ2UoJGxvLCAkaGkpKTsNCgkJfQ0KDQoJCS8vIEl0ZW0gbWF5IGJlIGVt cHR5OyBpZ25vcmUgaXQgaWYgc28NCgkJaWYgKCRpdGVtKSB7DQoJCQkkaXRlbSA9IGRvX2xp c3QoJGl0ZW0sICRkbG0pOw0KCQkJLy8gSGFuZGxlIHN1Yi1jYXRlZ29yaWVzDQoJCQlpZiAo JHN1Yikgew0KCQkJCWxpc3QoJHN1YnR5cGUsICRsZXZlbCkgPSBleHBsb2RlKCI6IiwgJHN1 Yik7DQoJCQkJJGxldmVsID0gKGVtcHR5KCRsZXZlbCkpID8gMCA6ICRsZXZlbDsNCgkJCQkk bGV2ZWwgPSAoc3RydG9sb3dlcigkbGV2ZWwpPT0iYWxsIikgPyA5OTk5OSA6ICRsZXZlbDsN CgkJCQlmb3JlYWNoICgkaXRlbSBhcyAkY2F0KSB7DQoJCQkJCSRjYXRzID0gZ2V0VHJlZShk b3NsYXNoKCRjYXQpLCAkc3VidHlwZSk7DQoJCQkJCWZvcmVhY2ggKCRjYXRzIGFzICRqZHgg PT4gJHZhbCkgew0KCQkJCQkJaWYgKCRjYXRzWyRqZHhdWydsZXZlbCddIDw9ICRsZXZlbCkg ew0KCQkJCQkJCSRpdGVtW10gPSAkY2F0c1skamR4XVsnbmFtZSddOw0KCQkJCQkJfQ0KCQkJ CQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBRdW90ZSBpZiBhc2tlZA0KCQkJJGl0ZW0gPSAo JHF0ZSkgPyBkb0FycmF5KCRpdGVtLCAnZG9RdW90ZScpIDogJGl0ZW07DQoJCQlpZiAoJG1v ZCA9PT0gMCkgew0KCQkJCSRpbmMgPSBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoJGluYywg JGl0ZW0pKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGV4YyA9IGFycmF5X3VuaXF1ZShhcnJheV9t ZXJnZSgkZXhjLCAkaXRlbSkpOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBhcnJheSgkaW5j LCAkZXhjKTsNCn0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9kb0RibFF1b3Rl IikpIHsNCmZ1bmN0aW9uIHNtZF9kb0RibFF1b3RlKCR2YWwpIHsNCglyZXR1cm4gJyInLiR2 YWwuJyInOw0KfQ0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX3JlbW92ZVFTVmFy IikpIHsNCmZ1bmN0aW9uIHNtZF9yZW1vdmVRU1ZhcigkdXJsLCAka2V5KSB7DQoJJHVybCA9 IHByZWdfcmVwbGFjZSgnLyguKikoXD98JiknIC4gJGtleSAuICc9W14mXSs/KCYpKC4qKS9p JywgJyQxJDIkNCcsICR1cmwgLiAnJicpOw0KCSR1cmwgPSBzdWJzdHIoJHVybCwgMCwgLTEp Ow0KCXJldHVybiAoJHVybCk7DQp9DQp9DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRf YWRkUVNWYXIiKSkgew0KZnVuY3Rpb24gc21kX2FkZFFTVmFyKCR1cmwsICRrZXksICR2YWx1 ZSkgew0KCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwgJGtleSk7DQoJaWYgKHN0cnBv cygkdXJsLCAnPycpID09PSBmYWxzZSkgew0KCQlyZXR1cm4gKCR1cmwgLiAnPycgLiAka2V5 IC4gJz0nIC4gJHZhbHVlKTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gKCR1cmwgLiAnJicgLiAk a2V5IC4gJz0nIC4gJHZhbHVlKTsNCgl9DQp9DQp9DQoNCi8vIERFUFJFQ0FURUQ6IGZvciBi YWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21k X2dldFN1YkNhdHMiKSkgew0KZnVuY3Rpb24gc21kX2dldFN1YkNhdHMoJHBhcmVudCwkY2F0 dHlwZSkgew0KCXJldHVybiBnZXRUcmVlKCRwYXJlbnQsJGNhdHR5cGUpOyAvL2dldFRyZWUo KSBvciBnZXRUcmVlUGF0aCgpPz8NCn0NCn0NCg0KLy8gREVQUkVDQVRFRDogZm9yIGJhY2t3 YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfZ2V0 T3B0cyIpKSB7DQpmdW5jdGlvbiBzbWRfZ2V0T3B0cygkc3RyLCAkYWxsb3dlZCwgJGlkcHJl Zml4PSIiLCAkYWxsb3dSYW5nZT10cnVlLCAkc3BsaXRhdD0iLygsfCxccykrLyIsICRwcmVn b3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgew0KCWdsb2JhbCAkcHJldGV4dCwgJHRoaXNh cnRpY2xlOw0KDQoJJG91dCA9IGFycmF5KCk7DQoJJG5vdG91dCA9IGFycmF5KCk7DQoJJG1h dGNoZXMgPSBzbWRfc3BsaXQoJHN0ciwgJGFsbG93UmFuZ2UsICRzcGxpdGF0LCAkcHJlZ29w dCk7DQoJLy8gQW4gYXJyYXkgdGhhdCB0ZWxscyB0aGUgbG9vcCB3aGF0IHRvIGRvIHdpdGgg ZWFjaCBvZiB0aGUgdmFsaWQgc3RyaW5ncw0KCS8vICBhcmcxOiB0eXBlICgxPWV4YWN0IG1h dGNoLCAyPWFueXdoZXJlIHdpdGhpbiBzdHJpbmcsIDM9Y3VzdG9tIGZpZWxkKQ0KCS8vICBh cmcyOiBwcmVmaXgsIGlmIGFueQ0KCS8vICBhcmczOiB2YXJpYWJsZSB0byBzdWJzdGl0dXRl DQoJLy8gIGFyZzQ6IGV4dHJhIGNoZWNrLCBpZiBhcHBsaWNhYmxlDQoJLy8gIGFyZzU6IHN0 b3JlIGluIHRoZSBpbi9leGNsdWRlIGxpc3QgKDE9aW5jbHVkZTsgMj1leGNsdWRlKQ0KCSRv cHQgPSBhcnJheSgNCgkJIj9jIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ2MnXSwgIjEi LCAxKSwNCgkJIiFjIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ2MnXSwgIjEiLCAyKSwN CgkJIj9zIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3MnXSwgIjEiLCAxKSwNCgkJIiFz IiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3MnXSwgIjEiLCAyKSwNCgkJIj9xIiA9PiBh cnJheSgyLCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAxKSwNCgkJIiFxIiA9PiBhcnJheSgy LCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAyKSwNCgkJIj90IiA9PiBhcnJheSgyLCAiIiwg JHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDEpLA0K CQkiIXQiID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddLCAnJHRo aXNhcnRpY2xlIT1OVUxMJywgMiksDQoJCSI/aWQiID0+IGFycmF5KDEsICRpZHByZWZpeCwg JHByZXRleHRbJ2lkJ10sICckdGhpc2FydGljbGUhPU5VTEwnLCAxKSwNCgkJIiFpZCIgPT4g YXJyYXkoMSwgJGlkcHJlZml4LCAkcHJldGV4dFsnaWQnXSwgJyR0aGlzYXJ0aWNsZSE9TlVM TCcsIDIpLA0KCQkiPyIgPT4gYXJyYXkoMywgIiIsICIiLCAnJHRoaXNhcnRpY2xlIT1OVUxM JywgMSksDQoJCSIhIiA9PiBhcnJheSgzLCAiIiwgIiIsICckdGhpc2FydGljbGUhPU5VTEwn LCAyKSwNCgkpOw0KDQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRtYXRjaGVzKTsg JGlkeCsrKSB7DQoJCSRtYXRjaGVkID0gZmFsc2U7DQoJCSR0aGlzbWF0Y2ggPSAkbWF0Y2hl c1skaWR4XTsNCgkJZm9yZWFjaCAoJG9wdCBhcyAkdmFyID0+ICRhcmdzKSB7DQoJCQkkb3B2 YXIgPSAoJGFyZ3NbNF0gPT0gMSkgPyAib3V0IiA6ICJub3RvdXQiOw0KCQkJc3dpdGNoICgk YXJnc1swXSkgew0KCQkJCWNhc2UgMToNCgkJCQkJaWYgKCgkdGhpc21hdGNoID09PSAkdmFy KSAmJiBpbl9hcnJheSgkdmFyLCRhbGxvd2VkKSkgew0KCQkJCQkJJG1hdGNoZWQgPSB0cnVl Ow0KCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdzWzNdKSB7DQoJCQkJCQkJJHJl cCA9IHN0cl9yZXBsYWNlKCR2YXIsICRhcmdzWzFdLiRhcmdzWzJdLCAkdGhpc21hdGNoKTsN CgkJCQkJCQlpZiAoIWluX2FycmF5KCRyZXAsICR7JG9wdmFyfSkpIHsNCgkJCQkJCQkJJHsk b3B2YXJ9W10gPSAkcmVwOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQlicmVh azsNCgkJCQljYXNlIDI6DQoJCQkJCSRwYXQgPSAnL1xcJy4kdmFyLickfFxcJy4kdmFyLidb XkEtWmEtejAtOV0vJzsNCgkJCQkJaWYgKChpc19pbnQoc21kX3ByZWdQb3MoJHBhdCwgJHRo aXNtYXRjaCwgJGZuZCkpKSAmJiBpbl9hcnJheSgkdmFyLCRhbGxvd2VkKSkgew0KCQkJCQkJ JG1hdGNoZWQgPSB0cnVlOw0KCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdzWzNd KSB7DQoJCQkJCQkJJHJlcCA9IHN0cl9yZXBsYWNlKCR2YXIsICRhcmdzWzFdLiRhcmdzWzJd LCAkdGhpc21hdGNoKTsNCgkJCQkJCQlpZiAoIWluX2FycmF5KCRyZXAsICR7JG9wdmFyfSkp IHsNCgkJCQkJCQkJJHskb3B2YXJ9W10gPSAkcmVwOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJ CQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlIDM6DQoJCQkJCSRsZW4gPSBzdHJsZW4oJHZh cik7DQoJCQkJCWlmICgoc3Vic3RyKCR0aGlzbWF0Y2gsMCwkbGVuKSA9PT0gJHZhcikgJiYg aW5fYXJyYXkoJHZhci4iZmllbGQiLCRhbGxvd2VkKSkgew0KCQkJCQkJJG1hdGNoZWQgPSB0 cnVlOw0KCQkJCQkJLy8gVXNlIHRoZSBnaXZlbiBmaWVsZCBuYW1lOyB3aGljaCBtYXkgYmUg YSBjb21tYS1zZXBhcmF0ZWQgc3VibGlzdC4NCgkJCQkJCS8vIFNwbGl0IG9mZiB0aGUgZmll bGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrDQoJCQkJCQkkZmllbGRuYW1lID0gc3Vi c3RyKCR0aGlzbWF0Y2gsJGxlbik7DQoJCQkJCQlpZiAoKCRhcmdzWzNdKSAmJiAoaXNzZXQo JHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldKSkpIHsNCgkJCQkJCQkkZmll bGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVtzdHJ0b2xvd2VyKCRmaWVsZG5hbWUpXTsNCgkJ CQkJCX0gZWxzZSB7DQoJCQkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOw0KCQkJ CQkJfQ0KCQkJCQkJaWYgKCFlbXB0eSgkZmllbGRDb250ZW50cykpIHsNCgkJCQkJCQkkc3Vi b3V0ID0gc21kX3NwbGl0KHN0cmlwX3RhZ3MoJGZpZWxkQ29udGVudHMpLCAkYWxsb3dSYW5n ZSwgJHNwbGl0YXQsICRwcmVnb3B0KTsNCgkJCQkJCQlmb3JlYWNoICgkc3Vib3V0IGFzICRz dWJuYW1lKSB7DQoJCQkJCQkJCWlmICghaW5fYXJyYXkoJHN1Ym5hbWUsICR7JG9wdmFyfSkp IHsNCgkJCQkJCQkJCSR7JG9wdmFyfVtdID0gJHN1Ym5hbWU7DQoJCQkJCQkJCX0NCgkJCQkJ CQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlpZiAoJG1hdGNo ZWQpIHsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCQlpZiAoISRtYXRjaGVkKSB7DQoJCQkv LyBBc3NpZ24gdGhlIHZhcmlhYmxlIHZlcmJhdGltDQoJCQlpZiAoIWluX2FycmF5KCR0aGlz bWF0Y2gsICRvdXQpKSB7DQoJCQkJJG91dFtdID0gJHRoaXNtYXRjaDsNCgkJCX0NCgkJfQ0K CX0NCglyZXR1cm4gYXJyYXkoJG91dCwkbm90b3V0KTsNCn0NCn0NCg0KLy8gREVQUkVDQVRF RDogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkNCmlmICghZnVuY3Rpb25fZXhp c3RzKCJzbWRfc3BsaXQiKSkgew0KZnVuY3Rpb24gc21kX3NwbGl0KCRzdHIsICRhbGxvd1Jh bmdlPXRydWUsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVHX1NQTElU X05PX0VNUFRZKSB7DQoJJHJldGFyciA9IGFycmF5KCk7DQoJaWYgKChzdWJzdHIoJHNwbGl0 YXQsMCwxKSA9PSAiLyIpICYmIChzdWJzdHIoJHNwbGl0YXQsIHN0cmxlbigkc3BsaXRhdCkt MSwgMSkgPT0gIi8iKSkgew0KCQkkcGF0ID0gJHNwbGl0YXQ7DQoJfSBlbHNlIHsNCgkJJHBh dCA9ICcvWycuJHNwbGl0YXQuJ10rLyc7DQoJfQ0KCSRlbGVtcyA9IHByZWdfc3BsaXQoJHBh dCwgJHN0ciwgLTEsICRwcmVnb3B0KTsNCglmb3JlYWNoICgkZWxlbXMgYXMgJGl0ZW0pIHsN CgkJJGl0ZW0gPSB0cmltKCRpdGVtKTsNCgkJJG5lZ2F0ZSA9IGZhbHNlOw0KCQkvLyBEb2Vz IHRoZSBpdGVtIHN0YXJ0IHdpdGggYSBuZWdhdGlvbiBjaGFyYWN0ZXINCgkJaWYgKHN1YnN0 cigkaXRlbSwwLDEpID09PSAiISIpIHsNCgkJCSRuZWdhdGUgPSB0cnVlOw0KCQkJJGl0ZW0g PSBzdWJzdHIoJGl0ZW0sMSk7DQoJCX0NCgkJLy8gSXMgdGhlIGl0ZW0gYW4gaW50ZWdlciBs aXN0IHJhbmdlDQoJCWlmICgkYWxsb3dSYW5nZSAmJiBwcmVnX21hdGNoKCcvXihcZCspXC0o XGQrKSQvJywgJGl0ZW0pKSB7DQoJCQlsaXN0KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0iLCAk aXRlbSwgMik7DQoJCQkkcm5nID0gcmFuZ2UoJGxvLCAkaGkpOw0KCQkJLy8gUmVhcHBseSB0 aGUgbmVnYXRpb24gaWYgbmVjZXNzYXJ5DQoJCQlmb3IoJGlkeCA9IDA7ICRpZHggPCBjb3Vu dCgkcm5nKTsgJGlkeCsrKSB7DQoJCQkJJHJuZ1skaWR4XSA9ICgoJG5lZ2F0ZSkgPyAiISIg OiAiIikgLiAkcm5nWyRpZHhdOw0KCQkJfQ0KCQkJJHJldGFyciA9IGFycmF5X21lcmdlKCRy ZXRhcnIsICRybmcpOw0KCQl9IGVsc2Ugew0KCQkJJHJldGFycltdID0gKCgkbmVnYXRlKSA/ ICIhIiA6ICIiKSAuICRpdGVtOw0KCQl9DQoJfQ0KCXJldHVybiAkcmV0YXJyOw0KfQ0KfQ0K DQovLyBTdG9sZW4gZnJvbSBwaHAubmV0OiBzdHJwb3MgcGFnZSBjb21tZW50cy4uLg0KaWYg KCFmdW5jdGlvbl9leGlzdHMoInNtZF9wcmVnUG9zIikpIHsNCmZ1bmN0aW9uIHNtZF9wcmVn UG9zKCRzUGF0dGVybiwgJHNTdWJqZWN0LCAmJEZvdW5kU3RyaW5nLCAkaU9mZnNldCA9IDAp IHsNCgkkRm91bmRTdHJpbmcgPSBudWxsOw0KCWlmIChwcmVnX21hdGNoKCRzUGF0dGVybiwg JHNTdWJqZWN0LCAkYU1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUsICRpT2Zmc2V0KSA+ IDApIHsNCgkJJEZvdW5kU3RyaW5nID0gJGFNYXRjaGVzWzBdWzBdOw0KCQlyZXR1cm4gJGFN YXRjaGVzWzBdWzFdOw0KCX0gZWxzZSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQp9DQp9DQov Ly4uLiBhbmQgYXJyYXlfY29tYmluZS4uLg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImFycmF5 X2NvbWJpbmUiKSkgew0KCWZ1bmN0aW9uIGFycmF5X2NvbWJpbmUoJGFycjEsJGFycjIpIHsN CgkJJG91dCA9IGFycmF5KCk7DQoJCWZvcmVhY2goJGFycjEgYXMgJGtleTEgPT4gJHZhbHVl MSkgew0KCQkJJG91dFskdmFsdWUxXSA9ICRhcnIyWyRrZXkxXTsNCgkJfQ0KICAgCXJldHVy biAkb3V0Ow0KCX0NCn0NCi8vLi4uIGFuZCBodG1sc3BlY2lhbGNoYXJzX2RlY29kZQ0KaWYg KCFmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIikpIHsNCglmdW5j dGlvbiBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgkc3RyaW5nLCAkcXVvdGVfc3R5bGUgPSBF TlRfQ09NUEFUKSB7DQoJCXJldHVybiBzdHJ0cigkc3RyaW5nLCBhcnJheV9mbGlwKGdldF9o dG1sX3RyYW5zbGF0aW9uX3RhYmxlKEhUTUxfU1BFQ0lBTENIQVJTLCAkcXVvdGVfc3R5bGUp KSk7DQoJfQ0KfSI7czo0OiJ0eXBlIjtzOjE6IjIiO3M6NDoiaGVscCI7czoxMDE3OToiCTxw PjxkaXYgaWQ9InNtZF9oZWxwIj48L3A+CgoJPGgxPnNtZF8gcGx1Z2luIGxpYnJhcnk8L2gx PgoKCTxwPk9mZmVycyBubyBwdWJsaWMgdGV4dHBhdHRlcm4gdGFncy4gSXQgaXMgc2ltcGx5 IGEgc2hhcmVkIGxpYnJhcnkgb2YgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHNtZF8gcGx1 Z2lucy48L3A+CgoJPGgyPkNoYW5nZWxvZzwvaDI+CgoJPHVsPgoJCTxsaT52MC4xICAgMDct MDItMjUgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZTwvbGk+CgkJPGxpPnYwLjIgICAwNy0wMy0w MyBBZGRlZDogPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3Nw YW4+PC9zcGFuPiAoTXVsdGktTGluZ3VhbCBQYWNrKSBsaWJyYXJ5IHN1cHBvcnQ8L2xpPgoJ CTxsaT52MC4yMSAgMDctMDMtMDYgQWRkZWQ6IGludGVnZXIgcmFuZ2UgZnVuY3Rpb25hbGl0 eS4gPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+IG5vdyB0YWtlcyBhIFJlZ0V4IGFyZzwvbGk+ CgkJPGxpPnYwLjIxYSAwNy0wMy0yMSBGaXhlZDogQ2hhcmFjdGVyIHJhbmdlcyBpZ25vcmVk ICh0aGFua3MgbXJkYWxlKTwvbGk+CgkJPGxpPnYwLjIxYiAwNy0wNC0wMiBGaXhlZDogU3Rp Y2t5IGFydGljbGUgc3VwcG9ydCBpbiA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4gKHRoYW5r cyBwaWVtYW4pPC9saT4KCQk8bGk+djAuMjFjIDA3LTA3LTI5IEZpeGVkOiBOdW1lcmljIHJh bmdlcyBpbiBjYXRlZ29yaWVzICh0aGFua3Mgd29sbGUpPC9saT4KCQk8bGk+djAuMjFkIDA3 LTA4LTAzIEZpeGVkOiBOZWdhdGlvbiB3aXRoIG11bHRpcGxlIGVsZW1lbnRzPC9saT4KCQk8 bGk+djAuMjFlIDA3LTA5LTE0IEZpeGVkOiBBYmlsaXR5IHRvIGxlYXZlIGVtcHR5IHNwbGl0 UmFuZ2UgcGFyYW1ldGVycyBpbnRhY3Q8L2xpPgoJCTxsaT52MC4yMiAgMDctMDktMjAgRml4 ZWQ6IFVuZGVmaW5lZCBpbmRleCB3YXJuaW5ncyAodGhhbmtzIEFtYml0aW91c2xlbW9uKS4g RW5oYW5jZWQgbWF0Y2hlcyBzbyBzcGFjZXMgYXJlIGFsbG93ZWQgaW4gc3RyaW5ncyAodGhh bmtzIERyUm9nZyk8L2xpPgoJCTxsaT52MC4yMyAgMDctMDQtMDkgPHNwYW4gY2xhc3M9ImNh cHMiPkJFVEE8L3NwYW4+IDogQWRkZWQgdGhlIEZ1enp5RmluZCBjbGFzcyBhbmQgZ2V0V29y ZCBmdW5jdGlvbi4gZ2V0QXR0cygpIG5vdyBhbGxvd3MgPGNvZGU+P3E8L2NvZGU+PC9saT4K CQk8bGk+djAuMyAgIDA3LTEwLTI5IFJld3JvdGUgPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+ IGFzIDxjb2RlPnNtZF9nZXRPcHRzPC9jb2RlPiB0byBhbGxvdyByZXBsYWNlZCB2YXJzIHdp dGhpbiB0ZXh0LiBEZXByZWNhdGVkIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiwgYWRkZWQg PGNvZGU+c21kX3ByZWdQb3M8L2NvZGU+LiBDaGFuZ2VkIDxjb2RlPnNtZF9zcGxpdFJhbmdl PC9jb2RlPiBhcyA8Y29kZT5zbWRfc3BsaXQ8L2NvZGU+IHRvIGFsbG93IHJhbmdlcyB0byBi ZSBzd2l0Y2hlZCBvbiBvciBvZmYuIERlcHJlY2F0ZWQgPGNvZGU+c21kX3NwbGl0UmFuZ2U8 L2NvZGU+LiBBZGRlZCBnZW5lcmljIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IGNs YXNzIHN1cHBvcnQgKDxjb2RlPnNtZF9NTFA8L2NvZGU+KS4gRGVwcmVjYXRlZCA8Y29kZT5z bWRNTFA8L2NvZGU+IGFycmF5LCA8Y29kZT5zbWRfZ1R4dDwvY29kZT4gYW5kIDxjb2RlPnNt ZF9nZXRDYWxsZXI8L2NvZGU+LiBNYWRlIDxjb2RlPnNtZF9GdXp6eUZpbmQ8L2NvZGU+IGFu ZCA8Y29kZT5zbWRfZ2V0V29yZDwvY29kZT4gb2ZmaWNpYWw8L2xpPgoJCTxsaT52MC4zMSAg MDctMTEtMjcgUmVtb3ZlZCA8Y29kZT5zbWRNTFA8L2NvZGU+IGFycmF5LCA8Y29kZT5zbWRf Z1R4dDwvY29kZT4gYW5kIDxjb2RlPnNtZF9nZXRDYWxsZXI8L2NvZGU+LiBEZXByZWNhdGVk IDxjb2RlPnNtZF9nZXRTdWJDYXRzPC9jb2RlPi4gQWRkZWQgYSBmZXcgUEhQNCBoZWxwZXIg ZnVuY3Rpb25zPC9saT4KCQk8bGk+djAuMzIgIDA4LTAzLTI5IFJlbW92ZWQgPGNvZGU+c21k X2dldEF0dHM8L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0U3ViQ2F0czwvY29kZT4uIERlcHJl Y2F0ZWQgPGNvZGU+c21kX2dldE9wdHM8L2NvZGU+IGFuZCA8Y29kZT5zbWRfc3BsaXQ8L2Nv ZGU+LiBBZGRlZCA8Y29kZT5zbWRfZG9MaXN0PC9jb2RlPi4gTW92ZWQgdGhlIDxjb2RlPnNt ZF9GdXp6eUZpbmQ8L2NvZGU+IGNsYXNzIGFuZCA8Y29kZT5zbWRfZ2V0V29yZDwvY29kZT4g aW50byB0aGUgc21kX2Z1enp5X2ZpbmQgcGx1Z2luIHdoZXJlIHRoZXkgc2hvdWxkIGhhdmUg YmVlbiBhbGwgYWxvbmc8L2xpPgoJPC91bD4KCgk8aDI+RnVuY3Rpb24gUmVmZXJlbmNlPC9o Mj4KCgk8cD48c3Ryb25nPnNtZF9hZGRRU1Zhcjwvc3Ryb25nPjxiciAvPgo8c3Ryb25nPnNt ZF9yZW1vdmVRU1Zhcjwvc3Ryb25nPjwvcD4KCgk8cD5BZGQgb3IgcmVtb3ZlIGEgcXVlcnkg c3RyaW5nIHZhcmlhYmxlIHRvIHRoZSBnaXZlbiA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9z cGFuPiwgdGFraW5nIGludG8gYWNjb3VudCBhbnkgZXhpc3RpbmcgdmFyaWFibGVzIHRoYXQg bWF5IGJlIGluIHRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPiBhbHJlYWR5LiAm IzgyMTY7QWRkJiM4MjE3OyB0YWtlcyB0aHJlZSBhcmd1bWVudHMsICYjODIxNjtSZW1vdmUm IzgyMTc7IGp1c3QgdGFrZXMgdGhlIGZpcnN0IHR3bzo8L3A+CgoJPG9sPgoJCTxsaT5UaGUg PHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4gc3RyaW5nIHRvIGFkZCB0by9yZW1vdmUg ZnJvbTwvbGk+CgkJPGxpPlRoZSBpZCBvZiB0aGUgcXVlcnlzdHJpbmcgKHRoZSBiaXQgYmVm b3JlIHRoZSA9IHNpZ24pPC9saT4KCQk8bGk+VGhlIHZhbHVlIG9mIHRoZSBuZXcgcXVlcnlz dHJpbmcgKHRoZSBiaXQgYWZ0ZXIgdGhlID0gc2lnbik8L2xpPgoJPC9vbD4KCgk8cD5lLmcu IDxjb2RlPnNtZF9hZGRRU1ZhcigkdGhpc2FydGljbGVbJiMzOTt1cmxfdGl0bGUmIzM5O10s ICYjMzk7dHBnJiMzOTssIDE1KTs8L2NvZGU+IHdvdWxkIGFkZCA8Y29kZT50cGc9MTU8L2Nv ZGU+IHRvIHRoZSBjdXJyZW50IGFydGljbGUmIzgyMTc7cyA8c3BhbiBjbGFzcz0iY2FwcyI+ VVJMPC9zcGFuPi4gSWYgdGhlcmUgYXJlIG5vIG90aGVyIHZhcmlhYmxlcyBjdXJyZW50bHkg aW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+LCBpdCBpcyBhZGRlZCB3aXRo IGEgcXVlc3Rpb24gbWFyaywgb3RoZXJ3aXNlIGl0IGlzIGFwcGVuZGVkIHdpdGggYW4gYW1w ZXJzYW5kLjwvcD4KCgk8cD48c3Ryb25nPnNtZF9kb0xpc3Q8L3N0cm9uZz48L3A+CgoJPHA+ UmV0dXJuIGFuIGV4cGFuZGVkIGxpc3Qgb2YgaXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIHBy b3BlcnRpZXM6PC9wPgoKCTxvbD4KCQk8bGk+QW55dGhpbmcgY29udGFpbmluZyAmIzgyMTY7 PyYjODIxNzsgb3IgJiM4MjE2OyEmIzgyMTc7IGlzIGNoZWNrZWQgZm9yIGEgbWF0Y2ggd2l0 aCBhIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IGZpZWxkPC9saT4KCQk8bGk+QW55 IHJhbmdlcyBvZiBpdGVtcyBhcmUgZXhwYW5kZWQgKGUuZy4gNC03ID0mZ3Q7IDQsNSw2LDcp IGlmIHRoZSA8Y29kZT5ybmc8L2NvZGU+IG9wdGlvbiBwZXJtaXRzIGl0PC9saT4KCQk8bGk+ PHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gZmllbGRzIG1heSB0aGVtc2VsdmVzIGJl IGxpc3RzIG9yIHJhbmdlczwvbGk+CgkJPGxpPkFueXRoaW5nIHRoYXQgaXMgbm90IGEgPHNw YW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gZmllbGQgaXMgdXNlZCB2ZXJiYXRpbTwvbGk+ CgkJPGxpPlRoZSBpdGVtcyBhcmUgcmV0dXJuZWQgYXMgMiBsaXN0czsgaW5jbHVzaW9uIGFu ZCBleGNsdXNpb248L2xpPgoJPC9vbD4KCgk8cD5BcmdzICggWypdID0gbWFuZGF0b3J5ICkg OgoJPG9sPgoJCTxsaT5bKl0gbHN0ID0gdGhlIGxpc3QgYXMgYSBkZWxpbWl0ZWQgc3RyaW5n PC9saT4KCQk8bGk+cm5nID0gd2hldGhlciB0byBhbGxvdyByYW5nZXMgb3Igbm90IChib29s KS4gRGVmYXVsdCA9IHRydWU8L2xpPgoJCTxsaT5zdWIgPSB0aGUgdHlwZSBvZiBzdWJjYXRl Z29yeSB0byB0cmF2ZXJzZSAoaW1hZ2UsIGZpbGUsIGxpbmssIGFydGljbGUsIG5vbmU9JiM4 MjIxOyYjODIyMDspIGFuZCBob3cgbWFueSBsZXZlbHMgdG8gZ28gZG93biAoZS5nLiBpbWFn ZToyKS4gRGVmYXVsdCA9ICYjODIxNjsmIzgyMTc7PC9saT4KCQk8bGk+cXRlID0gd2hldGhl ciB0byBxdW90ZSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5IG9yIG5vdCAoYm9vbCkuIERlZmF1 bHQgPSB0cnVlPC9saT4KCQk8bGk+ZGxtID0gdGhlIGRlbGltaXRlciAoc3RyaW5nKS4gRGVm YXVsdCA9ICYjODIyMDssJiM4MjIxOzwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ryb25nPnNt ZF9nZXRPcHRzPC9zdHJvbmc+PC9wPgoKCTxwPkRlcHJlY2F0ZWQgYXMgaXQgaXMgbW9zdGx5 IHN1cGVyc2VkZWQgYnkgc21kX2RvTGlzdDsgdGhpcyBvbmUgaXMgY2x1bmtpZXIgYnV0IGhh cyAkaWRwcmVmaXggc28gaXQgcmVtYWlucyBmb3Igbm93LiBJdCBzZWFyY2hlcyB0aGUgcGFz c2VkIHN0cmluZyBmb3IgcHJlZGV0ZXJtaW5lZCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyBh bmQsIGlmIHRoYXQgc2VxdWVuY2UgaXMgaW4gdGhlIGdpdmVuICRhbGxvd2VkIGFycmF5LCBy ZXBsYWNlcyBpdCBhcyBmb2xsb3dzOjwvcD4KCgk8dWw+CgkJPGxpPj9jID0gY3VycmVudCBn bG9iYWwgY2F0ZWdvcnkgKCFjID0gbm90IGN1cnJlbnQgY2F0ZWdvcnkpPC9saT4KCQk8bGk+ P3MgPSBjdXJyZW50IHNlY3Rpb24gKCFzID0gbm90IGN1cnJlbnQgc2VjdGlvbik8L2xpPgoJ CTxsaT4/dCA9IGN1cnJlbnQgYXJ0aWNsZSB0aXRsZSAoIXQgPSBub3QgY3VycmVudCB0aXRs ZSk8L2xpPgoJCTxsaT4/aWQgPSBjdXJyZW50IGFydGljbGUgSUQsIHByZXBlbmRlZCB3aXRo ICRpZHByZWZpeCAoIWlkID0gbm90IGN1cnJlbnQgSUQpPC9saT4KCQk8bGk+P3EgPSBjdXJy ZW50IHF1ZXJ5IHRlcm0gKCFxID0gbm90IGN1cnJlbnQgcXVlcnkgdGVybSk8L2xpPgoJCTxs aT4/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJiM4MjE3O3MgZmll bGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpPC9saT4KCQk8bGk+IWZpZWxk ID0gbm90IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJiM4MjE3O3MgZmll bGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpPC9saT4KCTwvdWw+CgoJPHA+ SW50ZWdlciByYW5nZXMgKGUuZy4gMS01KSB3aWxsIGJlIGV4cGFuZGVkIGludG8gdGhlaXIg aW5kaXZpZHVhbCB2YWx1ZXMgaWYgdGhlICRhbGxvd1JhbmdlIG9wdGlvbiBpcyB0cnVlOyBh bnl0aGluZyBlbHNlIGlzIHJldHVybmVkIHZlcmJhdGltLiBJdCBvdXRwdXRzIHR3byBhcnJh eXM6IHRoZSAxc3QgY29udGFpbnMgaXRlbXMgZm9yIGluY2x1c2lvbiwgdGhlIDJuZCBjb250 YWlucyBpdGVtcyBmb3IgZXhjbHVzaW9uLjwvcD4KCgk8cD5BcmdzICggWypdID0gbWFuZGF0 b3J5ICkgOgoJPG9sPgoJCTxsaT5bKl0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yIG1hdGNo ZXM8L2xpPgoJCTxsaT5bKl0gQW4gYXJyYXkgY29udGFpbmluZyBzaG9ydGN1dHMgdGhhdCBh cmUgJiM4MjIwO2FsbG93ZWQmIzgyMjE7IHRvIGJlIGZvdW5kIGluIHRoZSBzdHJpbmcgKD9j LCA/cywgP3QsID9maWVsZCBldGMpPC9saT4KCQk8bGk+VGhlIHByZWZpeCBmb3IgP2lkIHN0 cmluZ3M8L2xpPgoJCTxsaT5Cb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBhbGxvdyBy YW5nZSBleHBhbnNpb24gb3Igbm90PC9saT4KCQk8bGk+UmVnRXggc3RyaW5nIHRvIHNwbGl0 IG9wdGlvbnMgYXQgKHNlZSBzbWRfc3BsaXQpPC9saT4KCQk8bGk+cHJlZ19zcGxpdCBvcHRp b24gKHNlZSBzbWRfc3BsaXQpPC9saT4KCTwvb2w+PC9wPgoKCTxwPjxzdHJvbmc+c21kX3Nw bGl0PC9zdHJvbmc+PC9wPgoKCTxwPkRlcHJlY2F0ZWQgYXMgaXQgaGFzIGJlZW4gYWJzb3Ji ZWQgaW50byBzbWRfZG9MaXN0IGJ1dCBrZXB0IGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24gZm9y IG5vdy4gUmV0dXJucyBhbiBhcnJheSBvZiBpdGVtcyBmcm9tIGEgc3RyaW5nIG9mICh1c3Vh bGx5KSBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzLiBJZiBhbnkgdmFsdWVzIGNvbnRhaW4gcmFu Z2VzIG9mIG51bWJlcnMgbGlrZSAxLTUgdGhhdCBuZWVkICYjODIxNjtleHBhbmRpbmcmIzgy MTc7IGZpcnN0IChhbmQgJGFsbG93UmFuZ2UgaXMgdHJ1ZSksIHRoZXkgYXJlIGRlYWx0IHdp dGguIFRha2VzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzICggWypdID0gbWFuZGF0b3J5IGFy Z3MpIDo8L3A+CgoJPG9sPgoJCTxsaT5bKl0gVGhlIHN0cmluZyB0byBzcGxpdCB1cDwvbGk+ CgkJPGxpPkJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGFsbG93IHJhbmdlIGV4cGFu c2lvbiBvciBub3QgKGkuZS4gMS01IGJlY29tZXMgMSwyLDMsNCw1KTwvbGk+CgkJPGxpPlRo ZSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIGNsYXNzZXMgdG8gbWF0Y2guIElmIGEg ZnVsbCBSZWdFeCBzdGFydGluZyBhbmQgZW5kaW5nIHdpdGggJiM4MjE2Oy8mIzgyMTc7IGNo YXJhY3RlcnMgaXMgc3VwcGxpZWQsIHRoZSBleHByZXNzaW9uIGlzIHVzZWQgdmVyYmF0aW0u IFdpdGhvdXQgdGhlICYjODIxNjsvJiM4MjE3OyBjaGFyYWN0ZXJzLCB0aGUgZXhwcmVzc2lv biBpcyB0cmVhdGVkIGFzIGEgbGlzdCBvZiBjaGFyYWN0ZXIgY2xhc3NlcyB0byBmaW5kLiBE ZWZhdWx0cyB0byAmIzgyMjA7LygsfCxccykrLyYjODIyMTsgd2hpY2ggaXMgYSBjb21tYSwg b3IgY29tbWEgYW5kIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuPC9saT4KCQk8bGk+cHJlZ19z cGxpdCBvcHRpb24gY29uc3RhbnQgYXMgZGVmaW5lZCBpbiB0aGUgcGhwIG1hbnVhbDwvbGk+ Cgk8L29sPgoKCTxwPjxzdHJvbmc+c21kX01MUDwvc3Ryb25nPjxiciAvPgpJbnN0YW50aWF0 ZSBvbmUgb2YgdGhlc2UgdG8gaGFuZGxlIDxhY3JvbnltIHRpdGxlPSJNdWx0aS1MaW5ndWFs IFBhY2siPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+PC9hY3JvbnltPiBpbiB5b3Vy IHBsdWdpbiBsaWtlIHRoaXM6PC9wPgoKCTxwPjEpIERlY2xhcmUgYSB1bmlxdWUgZ2xvYmFs IHZhcmlhYmxlLCBlLmcuIGdsb2JhbCAkbXlQbHVnPGJyIC8+CjIpIERlZmluZSB5b3VyIGRl ZmF1bHQgc3RyaW5nIHJlcGxhY2VtZW50IGFycmF5IChkb2VzbiYjODIxNzt0IG5lZWQgdG8g YmUgZ2xvYmFsKSwgZS5nOjwvcD4KCgk8cD4JJG15U3RyaW5ncyA9IGFycmF5ICgmIzgyMjA7 bXNnMSYjODIyMTsgPSZndDsgJiM4MjIwO1RoaXMgaXMgbWVzc2FnZSAxJiM4MjIxOywgJiM4 MjIwO21zZzImIzgyMjE7ID0mZ3Q7ICYjODIyMDtUaGlzIGlzIG1lc3NhZ2UgMiYjODIyMTsp OzwvcD4KCgk8cD4zKSBDcmVhdGUgYW4gPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4g aGFuZGxlcjo8L3A+CgoJPHA+CSRteVBsdWcgPSBuZXcgc21kX01MUCgmIzgyMjA7cGx1Z2lu X25hbWUmIzgyMjE7LCAmIzgyMjA7cGx1Z2luX3ByZWZpeCYjODIyMTssICRteVN0cmluZ3Mp OzwvcD4KCgk8cD40KSBUaGF0JiM4MjE3O3MgaXQhIFRoZXJlIGFyZSB0d28gb3B0aW9uYWwg YXJncyB0byBzbWRfTUxQOgoJYSkgdGhlIGRlZmF1bHQgKGZ1bGwpIGxhbmd1YWdlIHRvIHVz ZSwgZS5nICYjODIyMDtkYS1kayYjODIyMTsuIERlZmF1bHRzIHRvICYjODIyMDtlbi1nYiYj ODIyMTsuCgliKSB0aGUgaW50ZXJmYWNlIHRoZSBzdHJpbmdzIGFyZSBmb3IuIENob29zZSBm cm9tICYjODIyMDtwdWJsaWMmIzgyMjE7ICh0aGUgZGVmYXVsdCksICYjODIyMDthZG1pbiYj ODIyMTsgb3IgJiM4MjIwO2NvbW1vbiYjODIyMTs8L3A+CgoJPHA+NSkgVG8gdXNlIGEgcmVw bGFjZW1lbnQgc3RyaW5nIGluIHlvdXIgY29kZToKCWEpIE1ha2Ugc3VyZSB0byBpbXBvcnQg dGhlIHVuaXF1ZSBnbG9iYWwgdmFyaWFibGU6IGUuZy4gZ2xvYmFsICRteVBsdWc7CgliKSBD YWxsICRteVBsdWctJmd0O2dUeHQoJiM4MjIwO21lc3NhZ2VJRCYjODIyMTspOyBbIGUuZy4g JG15UGx1Zy0mZ3Q7Z1R4dCgmIzgyMjA7bXNnMSYjODIyMTspIF0KCWMpIElmIHlvdSB3YW50 IHRvIHJlcGxhY2UgYW55IGFyZ3MgaW4geW91ciBtZXNzYWdlIHN0cmluZywgcGFzcyBhbiBh c3NvY2lhdGl2ZSBhcnJheSBhcyB0aGUgMm5kIGFyZyB0byBnVHh0KCk8L3A+CgoJPHA+PHN0 cm9uZz5zbWRfZG9EYmxRdW90ZTwvc3Ryb25nPjwvcD4KCgk8cD5BbHRlcm5hdGl2ZSB0byB0 aGUgY29yZSYjODIxNztzIGRvUXVvdGUoKS4gVGhpcyBvbmUgZGJsLXF1b3RlcyBpbnN0ZWFk IG9mIHNnbC1xdW90ZXM8L3A+CgoJPHA+PHN0cm9uZz5zbWRfcHJlZ1Bvczwvc3Ryb25nPjwv cD4KCgk8cD5MaWZ0ZWQgZnJvbSBvbmUgb2YgdGhlIGNvbW1lbnRzIGluIHRoZSA8c3BhbiBj bGFzcz0iY2FwcyI+UEhQPC9zcGFuPiBtYW51YWwsIHRoaXMganVzdCBsb29rcyBmb3IgYSBS ZWdFeCBzdHJpbmcgd2l0aGluIGFub3RoZXIsIHJldHVybmluZyB0aGUgbWF0Y2hlcyBpdCBm aW5kcyBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBtYXRjaC48L3A+CgoJPHA+PHN0 cm9uZz5hcnJheV9jb21iaW5lPC9zdHJvbmc+PC9wPgoKCTxwPlBIUDQgZXF1aXZhbGVudCBv ZiB0aGUgc3RhbmRhcmQgUEhQNSBmdW5jdGlvbiwgbGlmdGVkIGZyb20gcGhwLm5ldDwvcD4K Cgk8cD48c3Ryb25nPmh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlPC9zdHJvbmc+PC9wPgoKCTxw PlBIUDQgZXF1aXZhbGVudCBvZiB0aGUgc3RhbmRhcmQgUEhQNSBmdW5jdGlvbiwgbGlmdGVk IGZyb20gcGhwLm5ldDwvcD4KCgk8cD48L2Rpdj48L3A+CjwhLS0gLS0tIEJFR0lOIFBMVUdJ TiBDU1MgLS0tIC0tPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgojc21kX2hlbHAgeyBsaW5l LWhlaWdodDoxLjMgO30KI3NtZF9oZWxwIGNvZGUgeyBmb250LXdlaWdodDpib2xkOyBmb250 OiAxMDUlLzEzMCUgIkNvdXJpZXIgTmV3IiwgY291cmllciwgbW9ub3NwYWNlOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjRkZGRkNDO30KI3NtZF9oZWxwIGNvZGUuYmxvY2sgeyBmb250LXdlaWdo dDpub3JtYWw7IGJvcmRlcjoxcHggZG90dGVkICM5OTk7IGJhY2tncm91bmQtY29sb3I6ICNm MGU2OGM7IGRpc3BsYXk6YmxvY2s7IG1hcmdpbjoxMHB4IDEwcHggMjBweDsgcGFkZGluZzox MHB4OyB9CiNzbWRfaGVscCBhOmxpbmssICNzbWRfaGVscCBhOnZpc2l0ZWQgeyBjb2xvcjog Ymx1ZTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBib3JkZXItYm90dG9tOiAxcHggc29saWQg Ymx1ZTsgcGFkZGluZy1ib3R0b206MXB4O30KI3NtZF9oZWxwIGE6aG92ZXIsICNzbWRfaGVs cCBhOmFjdGl2ZSB7IGNvbG9yOiBibHVlOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJvcmRl ci1ib3R0b206IDJweCBzb2xpZCBibHVlOyBwYWRkaW5nLWJvdHRvbToxcHg7fQojc21kX2hl bHAgaDEgeyBjb2xvcjogIzM2OTsgZm9udDogMjBweCBHZW9yZ2lhLCBzYW5zLXNlcmlmOyBt YXJnaW46IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgfQojc21kX2hlbHAgaDIgeyBib3JkZXIt Ym90dG9tOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6MTBweCAwIDA7IGNvbG9yOiAjMzY5 OyBmb250OiAxN3B4IEdlb3JnaWEsIHNhbnMtc2VyaWY7IH0KI3NtZF9oZWxwIGgzIHsgY29s b3I6ICM2OTM7IGZvbnQ6IGJvbGQgMTJweCBBcmlhbCwgc2Fucy1zZXJpZjsgbGV0dGVyLXNw YWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAgMDt0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNl O30KI3NtZF9oZWxwIGg0IHsgZm9udDogYm9sZCAxMXB4IEFyaWFsLCBzYW5zLXNlcmlmOyBs ZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46IDEwcHggMCAwIDt0ZXh0LXRyYW5zZm9ybTog dXBwZXJjYXNlOyB9CiNzbWRfaGVscCAuYXR0LW5hbWUgeyBmb250LXdlaWdodDpib2xkOyB9 CiNzbWRfaGVscCAubWFuZCB7IGJhY2tncm91bmQ6I2VlZTsgYm9yZGVyOjFweCBkb3R0ZWQg Izk5OTsgfQojc21kX2hlbHAgdGFibGUge3dpZHRoOjEwMCU7IHRleHQtYWxpZ246Y2VudGVy OyBwYWRkaW5nLWJvdHRvbToxZW07fQojc21kX2hlbHAgdGQsICNzbWRfaGVscCB0aCB7Ym9y ZGVyOjFweCBzb2xpZCAjOTk5OyBwYWRkaW5nOi41ZW0gMDt9Cjwvc3R5bGU+CjwhLS0gLS0t IEVORCBQTFVHSU4gQ1NTIC0tLSAtLT4KIjtzOjM6Im1kNSI7czozMjoiZDU4YzE4N2VkYzVk NTc5NTdkMDgzY2ExNzYxMmE1OTciO30=