JCEKJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TLgokIQokISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiQhIHRvIGV4ZWN1dGUgaXQuCiQhCiQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKJCEgUmV3cml0dGVuIGJ5IFRyaXN0YW4gR2luZ29sZCAoZ2luZ29sZEBhZGFjb3JlLmNvbSkKJCEKJCEgICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KJCEKJCEgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJCEgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKJCEgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKJCEgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KJCEKJCEgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiQhIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiQhIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKJCEgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KJCEKJCEgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKJCEgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKJCEgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgokIQokIGFyY2g9RiRHRVRTWUkoIkFSQ0hfTkFNRSIpCiQgYXJjaD1GJEVESVQoYXJjaCwiTE9XRVJDQVNFIikKJGlmIGFyY2ggLmVxcy4gImFscGhhIiB0aGVuIHRhcmdldCA9ICJhbHBoYSIKJGlmIGFyY2ggLmVxcy4gImlhNjQiIHRoZW4gdGFyZ2V0ID0gImlhNjQiCiQhCiRpZiAoYXJjaCAuZXFzLiAiYWxwaGEiKSAub3IuIChhcmNoIC5lcXMuICJpYTY0IikKJHRoZW4KJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBCRkQgZm9yICcndGFyZ2V0JyB0YXJnZXQiCiQhCiQhCiQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKJCEKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF9kZWZhdWx0X3RhcmdldF9zaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX0xPTkdfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCcxJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ19faW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ3Vuc2lnbmVkIF9faW50NjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUUFRSX1RAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgndW5zaWduZWQgX19pbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX2ZpbGVfcHRyQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2JmZF9zaWduZWRfdm1hJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ3Vuc2lnbmVkIEBiZmRfZmlsZV9wdHJAIHVmaWxlX3B0cicsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJ2JmZF92bWEgdWZpbGVfcHRyJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BzdXBwb3J0c19wbHVnaW5zQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiQKJGVsc2UKJAokIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgokIHRhcmdldCA9ICJ2YXgiCiQhCiQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGJmZC5oJyBmcm9tIGBiZmQtaW4yLmgnLiIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMzInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnX19ERUNDJyk7CiAgICAgIFNQTElUX0xJTkU7CiAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7CiAgIEVORElGOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokZW5kaWYKJAokIQokISBjcmVhdGUgYmZkdmVyLmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgYmZkdmVyLmgnIGZyb20gJ3ZlcnNpb24uaCcgYW5kIGBjb25maWd1cmUuaW4nLiIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW112ZXJzaW9uLmggL291dHB1dD1bXWJmZHZlci5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKICAgdmZpbGUgOj0gQ1JFQVRFX0JVRkZFUigidmZpbGUiLCAiY29uZmlndXJlLmluIik7CiAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FDX0lOSVQoW2JmZF0sIFsnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgdmVycyA6PSBDVVJSRU5UX0xJTkUtIl0pIjsKICAgRUxTRTsKICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKICAgRU5ESUY7CiAgIHZlcnNudW0gOj0gdmVycyAtICIuIiAtICIuIjsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3ZlcnNpb25AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzbnVtKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF92ZXJzaW9uX3N0cmluZ0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciJyk7CiAgICAgIENPUFlfVEVYVCh2ZXJzKTsKICAgICAgQ09QWV9URVhUKCciJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfdmVyc2lvbl9wYWNrYWdlQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJyIoR05VIEJpbnV0aWxzKSAiJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0ByZXBvcnRfYnVnc190b0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciPGh0dHA6Ly93d3cuc291cmNld2FyZS5vcmcvYnVnemlsbGEvPiInKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiQhCiQhCiQhIGNyZWF0ZSBiZmRfc3RkaW50LmgKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBgYmZkX3N0ZGludC5oJyIKJCBjcmVhdGUgW11iZmRfc3RkaW50LmgKI2luY2x1ZGUgPGludHR5cGVzLmg+CiQhCiQhCiQhIGNyZWF0ZSB0YXJnbWF0Y2guaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGB0YXJnbWF0Y2guaCciCiQgb3Blbi93cml0ZSB0ZmlsZSBbXXRhcmdtYXRjaC5oCiQgd3JpdGUgdGZpbGUgInsgIiIiICsgdGFyZ2V0ICsgIi0qLSp2bXMqIiIiICsgIiwiCiQgd3JpdGUgdGZpbGUgIiNpZiBkZWZpbmVkIChTRUxFQ1RfVkVDUykiCiQgd3JpdGUgdGZpbGUgIlNFTEVDVF9WRUNTIgokIHdyaXRlIHRmaWxlICIjZWxzZSIKJCB3cml0ZSB0ZmlsZSAiVU5TVVBQT1JURURfVEFSR0VUIgokIHdyaXRlIHRmaWxlICIjZW5kaWYiCiQgd3JpdGUgdGZpbGUgIn0sIgokIGNsb3NlIHRmaWxlCiQhCiQhCiQhIGNyZWF0ZSBjb25maWcuaAokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGBjb25maWcuaCciCiQgY3JlYXRlIFtdY29uZmlnLmgKLyogY29uZmlnLmgtdm1zLiAgR2VuZXJhdGVkIGJ5IGhhbmQgYnkgS2xhdXMgS+RtcGYsIGtrYWVtcGZAZGlkeW11cy5ybWkuZGUuICAqLwovKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLyogV2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwovKiAjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgKi8KLyogV2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRSAqLwovKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi8qICNkZWZpbmUgSEFWRV9NTUFQIDEgKi8KLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi8qICN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOICovCi8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAgKi8KLyogI3VuZGVmIFRSQURfSEVBREVSICovCi8qIERlZmluZSBvbmx5IGlmIDxzeXMvcHJvY2ZzLmg+IGlzIGF2YWlsYWJsZSAqYW5kKiBpdCBkZWZpbmVzIHByc3RhdHVzX3QuICAqLwovKiAjdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0ggKi8KLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gdXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICAqLwovKiAjdW5kZWYgVVNFX01NQVAgKi8KLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9GQ05UTCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfTUFEVklTRSAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwojZGVmaW5lIEhBVkVfTVBST1RFQ1QgMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NURERFRl9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9USU1FX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfVU5JU1REX0ggMQovKiBEaXNhYmxlIE5MUyAgKi8KI3VuZGVmIEVOQUJMRV9OTFMKLyogTmFtZSBvZiBwYWNrYWdlICovCiNkZWZpbmUgUEFDS0FHRSAiYmZkIgovKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiIgovKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCiNkZWZpbmUgUEFDS0FHRV9OQU1FICJiZmQiCi8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX1NUUklORyAiYmZkIgovKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCiNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJiZmQiCi8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCiNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIihwYWNrYWdlIHZlcnNpb24pIgokIQokIHdyaXRlIHN5cyRvdXRwdXQgIkNvcHkgc3lzZGVwLmgiCiQgY29weSBbLmhvc3RzXWFscGhhdm1zLmggc3lzZGVwLmgKJAokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGJ1aWxkLmNvbSIKJCEKJCBpZiBBUkNILmVxcy4iYWxwaGEiCiQgdGhlbgokICAgY3JlYXRlIGJ1aWxkLmNvbQokREVDSwokIERFRlM9IiIiU0VMRUNUX1ZFQ1M9JmFscGhhX3Ztc192ZWMiIiwiKy0KICAiIiJTRUxFQ1RfQVJDSElURUNUVVJFUz0mYmZkX2FscGhhX2FyY2giIiIKJCBGSUxFUz0iY3B1LWFscGhhLHZtcyx2bXMtaGRyLHZtcy1nc2Qsdm1zLXRpcix2bXMtbWlzYywiCiRFT0QKJCBlbmRpZgokIGlmIEFSQ0guZXFzLiJpYTY0IgokIHRoZW4KJCAgIGNyZWF0ZSBidWlsZC5jb20KJERFQ0sKJCBERUZTPSIiIlNFTEVDVF9WRUNTPSZpYTY0X2VsZjY0X3Ztc192ZWMiIiwiKy0KICAiIiJTRUxFQ1RfQVJDSElURUNUVVJFUz0mYmZkX2lhNjRfYXJjaCIiIgokIEZJTEVTPSJjcHUtaWE2NCxlbGY2NC1pYTY0LGVsZi1zdHJ0YWIsY29yZWZpbGUsc3RhYnMsbWVyZ2UsZWxmLWVoLWZyYW1lLCIrLQogICJlbGZsaW5rLGVsZi1hdHRycyxkd2FyZjEsZWxmNjQsIgokRU9ECiQgY3JlYXRlIHN1YnN0eHgudHB1CiRERUNLCiAgIHNldCAoc3VjY2VzcyxvZmYpOwogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIGZvdW5kX3JhbmdlIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEJFR0lOTklOR19PRihmaWxlKSk7CgogICBMT09QCiAgICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UgKEVORF9PRihmb3VuZF9yYW5nZSksRU5EX09GKGZpbGUpKTsKICAgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ05OJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICAgIEVYSVRJRiBtYXRjaF9wb3MgPSAwOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ETE9PUDsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZSBlbGY2NC10YXJnZXQuaCBmcm9tIGVsZnh4LXRhcmdldC5oIgokIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3Vic3R4eC50cHUgLQogICAgICAgIFtdZWxmWFgtdGFyZ2V0LmggL291dHB1dD1bXWVsZjY0LXRhcmdldC5oCiQgZGVsIHN1YnN0eHgudHB1OyoKJCBlbmRpZgokIGFwcGVuZCBzeXMkaW5wdXQgYnVpbGQuY29tCiRERUNLCiQgREVGUz1ERUZTICsgIiwiInVubGluaz1yZW1vdmUiIiwiIkRFQlVHRElSPSIiIiJHTlUkREVCVUdESVI6IiIiIiIiIgokIE9QVD0iL25vb3B0L2RlYnVnIgokIENGTEFHUz0iL25hbWU9KGFzX2lzLHNob3J0ZW5lZCkiICsgLQogICIvaW5jbHVkZT0oW10sIiIuLi8iIiwiIi4uL2luY2x1ZGUiIikiICsgLQogICIvZGVmaW5lPSgiICsgREVGUyArICIpIiArIE9QVAokIEZJTEVTPUZJTEVTICsgImFyY2hpdmUsYXJjaGl2ZTY0LGFyY2h1cmVzLGJmZCxiZmRpbyxiaW5hcnksY2FjaGUsY29mZmdlbiwiKy0KICAiY29tcHJlc3MsY29yZWZpbGUsZHdhcmYyLGVsZixmb3JtYXQsaGFzaCxpaGV4LGluaXQsbGliYmZkLGxpbmtlciwiKy0KICAib3BuY2xzLHJlbG9jLHNlY3Rpb24sc2ltcGxlLHNyZWMsc3RhYi1zeW1zLHN5bXMsdGFyZ2V0cyx0ZWtoZXgsdmVyaWxvZyIKJCB3cml0ZSBzeXMkb3V0cHV0ICJDRkxBR1M9IixDRkxBR1MKJCBjZmxhZ3NfbGliYmZkPSIvd2FybmluZz0oZGlzYWJsZT1taXNzaW5ncmV0dXJuKSIKJCBjZmxhZ3NfbmlsPSIiCiQgTlVNID0gMAokIE9CSlM9IiIKJCBMT09QOgokICAgRiA9IEYkRUxFTUVOVChOVU0sIiwiLEZJTEVTKQokICAgSUYgRi5FUVMuIiwiIFRIRU4gR09UTyBFTkQKJCAgIGVmbGFnc19uYW1lPSJjZmxhZ3NfJydmJyIKJCAgIG5hbWVfbGVuPWYkbGVuZ3RoKGVmbGFnc19uYW1lKQokICAgZGFzaF9wb3M9ZiRsb2NhdGUoIi0iLGVmbGFnc19uYW1lKQokICAgaWYgZGFzaF9wb3MubmUubmFtZV9sZW4KJCAgIHRoZW4KJCAgICAgZWZsYWdzX25hbWVbJ2Rhc2hfcG9zLDFdOj0iXyIKJCAgICAgZGFzaF9wb3M9ZiRsb2NhdGUoIi0iLGVmbGFnc19uYW1lKQokICAgICBpZiBkYXNoX3Bvcy5uZS5uYW1lX2xlbiB0aGVuIGVmbGFnc19uYW1lWydkYXNoX3BvcywxXTo9Il8iCiQgICBlbmRpZgokICAgaWYgZiR0eXBlKCdlZmxhZ3NfbmFtZSkuZXFzLiIiIHRoZW4gZWZsYWdzX25hbWU9ImNmbGFnc19uaWwiCiQgICBlZmxhZ3M9J2VmbGFnc19uYW1lCiQgICB3cml0ZSBzeXMkb3V0cHV0ICJDb21waWxpbmcgIiwgRiwgIi5jIiwgZWZsYWdzCiQgICBjYyAnQ0ZMQUdTICdlZmxhZ3MgJ0YuYwokICAgSUYgT0JKUy5ORVMuIiIgVEhFTiBPQkpTPU9CSlMgKyAiLCIKJCAgIE9CSlM9T0JKUyArIEYgKyAiLm9iaiIKJCAgIE5VTSA9IE5VTSArIDEKJCAgIEdPVE8gTE9PUAokIEVORDoKJCBwdXJnZQokIGxpYi9jcmVhdGUgbGliYmZkICdPQkpTCiRFT0QK