Ly8gLSotIEMrKyAtKi0KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJhdGlvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2lmbmRlZiBfTElCQ1BQX1JBVElPCiNkZWZpbmUgX0xJQkNQUF9SQVRJTwoKLyoKICAgIHJhdGlvIHN5bm9wc2lzCgpuYW1lc3BhY2Ugc3RkCnsKCnRlbXBsYXRlIDxpbnRtYXhfdCBOLCBpbnRtYXhfdCBEID0gMT4KY2xhc3MgcmF0aW8KewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbnVtOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IGRlbjsKfTsKCi8vIHJhdGlvIGFyaXRobWV0aWMKdGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX2FkZDsKdGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX3N1YnRyYWN0Owp0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBzdHJ1Y3QgcmF0aW9fbXVsdGlwbHk7CnRlbXBsYXRlIDxjbGFzcyBSMSwgY2xhc3MgUjI+IHN0cnVjdCByYXRpb19kaXZpZGU7CgovLyByYXRpbyBjb21wYXJpc29uCnRlbXBsYXRlIDxjbGFzcyBSMSwgY2xhc3MgUjI+IHN0cnVjdCByYXRpb19lcXVhbDsKdGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX25vdF9lcXVhbDsKdGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX2xlc3M7CnRlbXBsYXRlIDxjbGFzcyBSMSwgY2xhc3MgUjI+IHN0cnVjdCByYXRpb19sZXNzX2VxdWFsOwp0ZW1wbGF0ZSA8Y2xhc3MgUjEsIGNsYXNzIFIyPiBzdHJ1Y3QgcmF0aW9fZ3JlYXRlcjsKdGVtcGxhdGUgPGNsYXNzIFIxLCBjbGFzcyBSMj4gc3RydWN0IHJhdGlvX2dyZWF0ZXJfZXF1YWw7CgovLyBjb252ZW5pZW5jZSBTSSB0eXBlZGVmcwp0eXBlZGVmIHJhdGlvPDEsIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA+IHlvY3RvOyAgLy8gbm90IHN1cHBvcnRlZAp0eXBlZGVmIHJhdGlvPDEsICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDA+IHplcHRvOyAgLy8gbm90IHN1cHBvcnRlZAp0eXBlZGVmIHJhdGlvPDEsICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDA+IGF0dG87CnR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMD4gZmVtdG87CnR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMD4gcGljbzsKdHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAgICAxMDAwMDAwMDAwPiBuYW5vOwp0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgIDEwMDAwMDA+IG1pY3JvOwp0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgIDEwMDA+IG1pbGxpOwp0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgICAxMDA+IGNlbnRpOwp0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgICAgICAgICAgMTA+IGRlY2k7CnR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAgICAgICAxMCwgMT4gZGVjYTsKdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAgMTAwLCAxPiBoZWN0bzsKdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAxMDAwLCAxPiBraWxvOwp0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgIDEwMDAwMDAsIDE+IG1lZ2E7CnR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgMTAwMDAwMDAwMCwgMT4gZ2lnYTsKdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAxMDAwMDAwMDAwMDAwLCAxPiB0ZXJhOwp0eXBlZGVmIHJhdGlvPCAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAsIDE+IHBldGE7CnR5cGVkZWYgcmF0aW88ICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMCwgMT4gZXhhOwp0eXBlZGVmIHJhdGlvPCAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIDE+IHpldHRhOyAgLy8gbm90IHN1cHBvcnRlZAp0eXBlZGVmIHJhdGlvPDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIDE+IHlvdHRhOyAgLy8gbm90IHN1cHBvcnRlZAoKfQoqLwoKI2luY2x1ZGUgPF9fY29uZmlnPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCiNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKCl9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAoKLy8gX19zdGF0aWNfZ2NkCgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CnN0cnVjdCBfX3N0YXRpY19nY2QKewogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX19zdGF0aWNfZ2NkPF9ZcCwgX1hwICUgX1lwPjo6dmFsdWU7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwPgpzdHJ1Y3QgX19zdGF0aWNfZ2NkPF9YcCwgMD4KewogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1hwOwp9OwoKLy8gX19zdGF0aWNfbGNtCgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CnN0cnVjdCBfX3N0YXRpY19sY20KewogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1hwIC8gX19zdGF0aWNfZ2NkPF9YcCwgX1lwPjo6dmFsdWUgKiBfWXA7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwPgpzdHJ1Y3QgX19zdGF0aWNfYWJzCnsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCA8IDAgPyAtX1hwIDogX1hwOwp9OwoKdGVtcGxhdGUgPGludG1heF90IF9YcD4Kc3RydWN0IF9fc3RhdGljX3NpZ24KewogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1hwID09IDAgPyAwIDogKF9YcCA8IDAgPyAtMSA6IDEpOwp9OwoKdGVtcGxhdGUgPGludG1heF90IF9YcCwgaW50bWF4X3QgX1lwLCBpbnRtYXhfdCA9IF9fc3RhdGljX3NpZ248X1lwPjo6dmFsdWU+CmNsYXNzIF9fbGxfYWRkOwoKdGVtcGxhdGUgPGludG1heF90IF9YcCwgaW50bWF4X3QgX1lwPgpjbGFzcyBfX2xsX2FkZDxfWHAsIF9ZcCwgMT4KewogICAgc3RhdGljIGNvbnN0IGludG1heF90IG1pbiA9ICgxTEwgPDwgKHNpemVvZihpbnRtYXhfdCkgKiBDSEFSX0JJVCAtIDEpKSArIDE7CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbWF4ID0gLW1pbjsKCiAgICBzdGF0aWNfYXNzZXJ0KF9YcCA8PSBtYXggLSBfWXAsICJvdmVyZmxvdyBpbiBfX2xsX2FkZCIpOwpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHAgKyBfWXA7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CmNsYXNzIF9fbGxfYWRkPF9YcCwgX1lwLCAwPgp7CnB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcDsKfTsKCnRlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KY2xhc3MgX19sbF9hZGQ8X1hwLCBfWXAsIC0xPgp7CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbWluID0gKDFMTCA8PCAoc2l6ZW9mKGludG1heF90KSAqIENIQVJfQklUIC0gMSkpICsgMTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtYXggPSAtbWluOwoKICAgIHN0YXRpY19hc3NlcnQobWluIC0gX1lwIDw9IF9YcCwgIm92ZXJmbG93IGluIF9fbGxfYWRkIik7CnB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9YcCArIF9ZcDsKfTsKCnRlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcCwgaW50bWF4X3QgPSBfX3N0YXRpY19zaWduPF9ZcD46OnZhbHVlPgpjbGFzcyBfX2xsX3N1YjsKCnRlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KY2xhc3MgX19sbF9zdWI8X1hwLCBfWXAsIDE+CnsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtaW4gPSAoMUxMIDw8IChzaXplb2YoaW50bWF4X3QpICogQ0hBUl9CSVQgLSAxKSkgKyAxOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IG1heCA9IC1taW47CgogICAgc3RhdGljX2Fzc2VydChtaW4gKyBfWXAgPD0gX1hwLCAib3ZlcmZsb3cgaW4gX19sbF9zdWIiKTsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1hwIC0gX1lwOwp9OwoKdGVtcGxhdGUgPGludG1heF90IF9YcCwgaW50bWF4X3QgX1lwPgpjbGFzcyBfX2xsX3N1YjxfWHAsIF9ZcCwgMD4KewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHA7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CmNsYXNzIF9fbGxfc3ViPF9YcCwgX1lwLCAtMT4KewogICAgc3RhdGljIGNvbnN0IGludG1heF90IG1pbiA9ICgxTEwgPDwgKHNpemVvZihpbnRtYXhfdCkgKiBDSEFSX0JJVCAtIDEpKSArIDE7CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbWF4ID0gLW1pbjsKCiAgICBzdGF0aWNfYXNzZXJ0KF9YcCA8PSBtYXggKyBfWXAsICJvdmVyZmxvdyBpbiBfX2xsX3N1YiIpOwpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHAgLSBfWXA7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwLCBpbnRtYXhfdCBfWXA+CmNsYXNzIF9fbGxfbXVsCnsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBuYW4gPSAoMUxMIDw8IChzaXplb2YoaW50bWF4X3QpICogQ0hBUl9CSVQgLSAxKSk7CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgbWluID0gbmFuICsgMTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtYXggPSAtbWluOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fYV94ID0gX19zdGF0aWNfYWJzPF9YcD46OnZhbHVlOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fYV95ID0gX19zdGF0aWNfYWJzPF9ZcD46OnZhbHVlOwoKICAgIHN0YXRpY19hc3NlcnQoX1hwICE9IG5hbiAmJiBfWXAgIT0gbmFuICYmIF9fYV94IDw9IG1heCAvIF9fYV95LCAib3ZlcmZsb3cgaW4gX19sbF9tdWwiKTsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1hwICogX1lwOwp9OwoKdGVtcGxhdGUgPGludG1heF90IF9ZcD4KY2xhc3MgX19sbF9tdWw8MCwgX1lwPgp7CnB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IDA7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX1hwPgpjbGFzcyBfX2xsX211bDxfWHAsIDA+CnsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gMDsKfTsKCnRlbXBsYXRlIDw+CmNsYXNzIF9fbGxfbXVsPDAsIDA+CnsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gMDsKfTsKCi8vIE5vdCBhY3R1YWxseSB1c2VkIGJ1dCBsZWZ0IGhlcmUgaW4gY2FzZSBuZWVkZWQgaW4gZnV0dXJlIG1haW50ZW5hbmNlCnRlbXBsYXRlIDxpbnRtYXhfdCBfWHAsIGludG1heF90IF9ZcD4KY2xhc3MgX19sbF9kaXYKewogICAgc3RhdGljIGNvbnN0IGludG1heF90IG5hbiA9ICgxTEwgPDwgKHNpemVvZihpbnRtYXhfdCkgKiBDSEFSX0JJVCAtIDEpKTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBtaW4gPSBuYW4gKyAxOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IG1heCA9IC1taW47CgogICAgc3RhdGljX2Fzc2VydChfWHAgIT0gbmFuICYmIF9ZcCAhPSBuYW4gJiYgX1lwICE9IDAsICJvdmVyZmxvdyBpbiBfX2xsX2RpdiIpOwpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgdmFsdWUgPSBfWHAgLyBfWXA7Cn07Cgp0ZW1wbGF0ZSA8aW50bWF4X3QgX051bSwgaW50bWF4X3QgX0RlbiA9IDE+CmNsYXNzIHJhdGlvCnsKICAgIHN0YXRpY19hc3NlcnQoX19zdGF0aWNfYWJzPF9OdW0+Ojp2YWx1ZSA+PSAwLCAicmF0aW8gbnVtZXJhdG9yIGlzIG91dCBvZiByYW5nZSIpOwogICAgc3RhdGljX2Fzc2VydChfRGVuICE9IDAsICJyYXRpbyBkaXZpZGUgYnkgMCIpOwogICAgc3RhdGljX2Fzc2VydChfX3N0YXRpY19hYnM8X0Rlbj46OnZhbHVlID4gIDAsICJyYXRpbyBkZW5vbWluYXRvciBpcyBvdXQgb2YgcmFuZ2UiKTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX25hID0gX19zdGF0aWNfYWJzPF9OdW0+Ojp2YWx1ZTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2RhID0gX19zdGF0aWNfYWJzPF9EZW4+Ojp2YWx1ZTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX3MgPSBfX3N0YXRpY19zaWduPF9OdW0+Ojp2YWx1ZSAqIF9fc3RhdGljX3NpZ248X0Rlbj46OnZhbHVlOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkID0gX19zdGF0aWNfZ2NkPF9fbmEsIF9fZGE+Ojp2YWx1ZTsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IG51bSA9IF9fcyAqIF9fbmEgLyBfX2djZDsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBkZW4gPSBfX2RhIC8gX19nY2Q7CgogICAgdHlwZWRlZiByYXRpbzxudW0sIGRlbj4gdHlwZTsKfTsKCnRlbXBsYXRlIDxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuPiBjb25zdCBpbnRtYXhfdCByYXRpbzxfTnVtLCBfRGVuPjo6bnVtOwp0ZW1wbGF0ZSA8aW50bWF4X3QgX051bSwgaW50bWF4X3QgX0Rlbj4gY29uc3QgaW50bWF4X3QgcmF0aW88X051bSwgX0Rlbj46OmRlbjsKCnRlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX19pc19yYXRpbyAgICAgICAgICAgICAgICAgICAgIDogZmFsc2VfdHlwZSB7fTsKdGVtcGxhdGUgPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4+IHN0cnVjdCBfX2lzX3JhdGlvPHJhdGlvPF9OdW0sIF9EZW4+ID4gOiB0cnVlX3R5cGUgIHt9OwoKdHlwZWRlZiByYXRpbzwxTEwsIDEwMDAwMDAwMDAwMDAwMDAwMDBMTD4gYXR0bzsKdHlwZWRlZiByYXRpbzwxTEwsICAgIDEwMDAwMDAwMDAwMDAwMDBMTD4gZmVtdG87CnR5cGVkZWYgcmF0aW88MUxMLCAgICAgICAxMDAwMDAwMDAwMDAwTEw+IHBpY287CnR5cGVkZWYgcmF0aW88MUxMLCAgICAgICAgICAxMDAwMDAwMDAwTEw+IG5hbm87CnR5cGVkZWYgcmF0aW88MUxMLCAgICAgICAgICAgICAxMDAwMDAwTEw+IG1pY3JvOwp0eXBlZGVmIHJhdGlvPDFMTCwgICAgICAgICAgICAgICAgMTAwMExMPiBtaWxsaTsKdHlwZWRlZiByYXRpbzwxTEwsICAgICAgICAgICAgICAgICAxMDBMTD4gY2VudGk7CnR5cGVkZWYgcmF0aW88MUxMLCAgICAgICAgICAgICAgICAgIDEwTEw+IGRlY2k7CnR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAxMExMLCAxTEw+IGRlY2E7CnR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgIDEwMExMLCAxTEw+IGhlY3RvOwp0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgIDEwMDBMTCwgMUxMPiBraWxvOwp0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgIDEwMDAwMDBMTCwgMUxMPiBtZWdhOwp0eXBlZGVmIHJhdGlvPCAgICAgICAgIDEwMDAwMDAwMDBMTCwgMUxMPiBnaWdhOwp0eXBlZGVmIHJhdGlvPCAgICAgIDEwMDAwMDAwMDAwMDBMTCwgMUxMPiB0ZXJhOwp0eXBlZGVmIHJhdGlvPCAgIDEwMDAwMDAwMDAwMDAwMDBMTCwgMUxMPiBwZXRhOwp0eXBlZGVmIHJhdGlvPDEwMDAwMDAwMDAwMDAwMDAwMDBMTCwgMUxMPiBleGE7Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CnN0cnVjdCByYXRpb19tdWx0aXBseQp7CnByaXZhdGU6CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgX19nY2RfbjFfZDIgPSBfX3N0YXRpY19nY2Q8X1IxOjpudW0sIF9SMjo6ZGVuPjo6dmFsdWU7CiAgICBzdGF0aWMgY29uc3QgaW50bWF4X3QgX19nY2RfZDFfbjIgPSBfX3N0YXRpY19nY2Q8X1IxOjpkZW4sIF9SMjo6bnVtPjo6dmFsdWU7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgcmF0aW8KICAgICAgICA8CiAgICAgICAgICAgIF9fbGxfbXVsPF9SMTo6bnVtIC8gX19nY2RfbjFfZDIsIF9SMjo6bnVtIC8gX19nY2RfZDFfbjI+Ojp2YWx1ZSwKICAgICAgICAgICAgX19sbF9tdWw8X1IyOjpkZW4gLyBfX2djZF9uMV9kMiwgX1IxOjpkZW4gLyBfX2djZF9kMV9uMj46OnZhbHVlCiAgICAgICAgPjo6dHlwZSB0eXBlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgpzdHJ1Y3QgcmF0aW9fZGl2aWRlCnsKcHJpdmF0ZToKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9uMV9uMiA9IF9fc3RhdGljX2djZDxfUjE6Om51bSwgX1IyOjpudW0+Ojp2YWx1ZTsKICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZF9kMV9kMiA9IF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZTsKcHVibGljOgogICAgdHlwZWRlZiB0eXBlbmFtZSByYXRpbwogICAgICAgIDwKICAgICAgICAgICAgX19sbF9tdWw8X1IxOjpudW0gLyBfX2djZF9uMV9uMiwgX1IyOjpkZW4gLyBfX2djZF9kMV9kMj46OnZhbHVlLAogICAgICAgICAgICBfX2xsX211bDxfUjI6Om51bSAvIF9fZ2NkX24xX24yLCBfUjE6OmRlbiAvIF9fZ2NkX2QxX2QyPjo6dmFsdWUKICAgICAgICA+Ojp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CnN0cnVjdCByYXRpb19hZGQKewpwcml2YXRlOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX24xX24yID0gX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6Om51bT46OnZhbHVlOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX2QxX2QyID0gX19zdGF0aWNfZ2NkPF9SMTo6ZGVuLCBfUjI6OmRlbj46OnZhbHVlOwpwdWJsaWM6CiAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvX211bHRpcGx5CiAgICAgICAgPAogICAgICAgICAgICByYXRpbzxfX2djZF9uMV9uMiwgX1IxOjpkZW4gLyBfX2djZF9kMV9kMj4sCiAgICAgICAgICAgIHJhdGlvCiAgICAgICAgICAgIDwKICAgICAgICAgICAgICAgIF9fbGxfYWRkCiAgICAgICAgICAgICAgICA8CiAgICAgICAgICAgICAgICAgICAgX19sbF9tdWw8X1IxOjpudW0gLyBfX2djZF9uMV9uMiwgX1IyOjpkZW4gLyBfX2djZF9kMV9kMj46OnZhbHVlLAogICAgICAgICAgICAgICAgICAgIF9fbGxfbXVsPF9SMjo6bnVtIC8gX19nY2RfbjFfbjIsIF9SMTo6ZGVuIC8gX19nY2RfZDFfZDI+Ojp2YWx1ZQogICAgICAgICAgICAgICAgPjo6dmFsdWUsCiAgICAgICAgICAgICAgICBfUjI6OmRlbgogICAgICAgICAgICA+CiAgICAgICAgPjo6dHlwZSB0eXBlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgpzdHJ1Y3QgcmF0aW9fc3VidHJhY3QKewpwcml2YXRlOgogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX24xX24yID0gX19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6Om51bT46OnZhbHVlOwogICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkX2QxX2QyID0gX19zdGF0aWNfZ2NkPF9SMTo6ZGVuLCBfUjI6OmRlbj46OnZhbHVlOwpwdWJsaWM6CiAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvX211bHRpcGx5CiAgICAgICAgPAogICAgICAgICAgICByYXRpbzxfX2djZF9uMV9uMiwgX1IxOjpkZW4gLyBfX2djZF9kMV9kMj4sCiAgICAgICAgICAgIHJhdGlvCiAgICAgICAgICAgIDwKICAgICAgICAgICAgICAgIF9fbGxfc3ViCiAgICAgICAgICAgICAgICA8CiAgICAgICAgICAgICAgICAgICAgX19sbF9tdWw8X1IxOjpudW0gLyBfX2djZF9uMV9uMiwgX1IyOjpkZW4gLyBfX2djZF9kMV9kMj46OnZhbHVlLAogICAgICAgICAgICAgICAgICAgIF9fbGxfbXVsPF9SMjo6bnVtIC8gX19nY2RfbjFfbjIsIF9SMTo6ZGVuIC8gX19nY2RfZDFfZDI+Ojp2YWx1ZQogICAgICAgICAgICAgICAgPjo6dmFsdWUsCiAgICAgICAgICAgICAgICBfUjI6OmRlbgogICAgICAgICAgICA+CiAgICAgICAgPjo6dHlwZSB0eXBlOwp9OwoKLy8gcmF0aW9fZXF1YWwKCnRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMj4Kc3RydWN0IHJhdGlvX2VxdWFsCiAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfUjE6Om51bSA9PSBfUjI6Om51bSAmJiBfUjE6OmRlbiA9PSBfUjI6OmRlbj4ge307IAoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgpzdHJ1Y3QgcmF0aW9fbm90X2VxdWFsCiAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhcmF0aW9fZXF1YWw8X1IxLCBfUjI+Ojp2YWx1ZT4ge307IAoKLy8gcmF0aW9fbGVzcwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyLCBib29sIF9PZGQgPSBmYWxzZSwKICAgICAgICAgIGludG1heF90IF9RMSA9IF9SMTo6bnVtIC8gX1IxOjpkZW4sIGludG1heF90IF9NMSA9IF9SMTo6bnVtICUgX1IxOjpkZW4sCiAgICAgICAgICBpbnRtYXhfdCBfUTIgPSBfUjI6Om51bSAvIF9SMjo6ZGVuLCBpbnRtYXhfdCBfTTIgPSBfUjI6Om51bSAlIF9SMjo6ZGVuPgpzdHJ1Y3QgX19yYXRpb19sZXNzMQp7CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9PZGQgPyBfUTIgPCBfUTEgOiBfUTEgPCBfUTI7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjIsIGJvb2wgX09kZCwgaW50bWF4X3QgX1E+CnN0cnVjdCBfX3JhdGlvX2xlc3MxPF9SMSwgX1IyLCBfT2RkLCBfUSwgMCwgX1EsIDA+CnsKICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjIsIGJvb2wgX09kZCwgaW50bWF4X3QgX1EsIGludG1heF90IF9NMj4Kc3RydWN0IF9fcmF0aW9fbGVzczE8X1IxLCBfUjIsIF9PZGQsIF9RLCAwLCBfUSwgX00yPgp7CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9ICFfT2RkOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyLCBib29sIF9PZGQsIGludG1heF90IF9RLCBpbnRtYXhfdCBfTTE+CnN0cnVjdCBfX3JhdGlvX2xlc3MxPF9SMSwgX1IyLCBfT2RkLCBfUSwgX00xLCBfUSwgMD4KewogICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfT2RkOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyLCBib29sIF9PZGQsIGludG1heF90IF9RLCBpbnRtYXhfdCBfTTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50bWF4X3QgX00yPgpzdHJ1Y3QgX19yYXRpb19sZXNzMTxfUjEsIF9SMiwgX09kZCwgX1EsIF9NMSwgX1EsIF9NMj4KewogICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX3JhdGlvX2xlc3MxPHJhdGlvPF9SMTo6ZGVuLCBfTTE+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvPF9SMjo6ZGVuLCBfTTI+LCAhX09kZD46OnZhbHVlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyLCBpbnRtYXhfdCBfUzEgPSBfX3N0YXRpY19zaWduPF9SMTo6bnVtPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50bWF4X3QgX1MyID0gX19zdGF0aWNfc2lnbjxfUjI6Om51bT46OnZhbHVlPgpzdHJ1Y3QgX19yYXRpb19sZXNzCnsKICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX1MxIDwgX1MyOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SMSwgY2xhc3MgX1IyPgpzdHJ1Y3QgX19yYXRpb19sZXNzPF9SMSwgX1IyLCAxTEwsIDFMTD4KewogICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX3JhdGlvX2xlc3MxPF9SMSwgX1IyPjo6dmFsdWU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CnN0cnVjdCBfX3JhdGlvX2xlc3M8X1IxLCBfUjIsIC0xTEwsIC0xTEw+CnsKICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX19yYXRpb19sZXNzMTxyYXRpbzwtX1IyOjpudW0sIF9SMjo6ZGVuPiwgcmF0aW88LV9SMTo6bnVtLCBfUjE6OmRlbj4gPjo6dmFsdWU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CnN0cnVjdCByYXRpb19sZXNzCiAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX3JhdGlvX2xlc3M8X1IxLCBfUjI+Ojp2YWx1ZT4ge307Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CnN0cnVjdCByYXRpb19sZXNzX2VxdWFsCiAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhcmF0aW9fbGVzczxfUjIsIF9SMT46OnZhbHVlPiB7fTsKCnRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMj4Kc3RydWN0IHJhdGlvX2dyZWF0ZXIKICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHJhdGlvX2xlc3M8X1IyLCBfUjE+Ojp2YWx1ZT4ge307Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1IxLCBjbGFzcyBfUjI+CnN0cnVjdCByYXRpb19ncmVhdGVyX2VxdWFsCiAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAhcmF0aW9fbGVzczxfUjEsIF9SMj46OnZhbHVlPiB7fTsKCnRlbXBsYXRlIDxjbGFzcyBfUjEsIGNsYXNzIF9SMj4Kc3RydWN0IF9fcmF0aW9fZ2NkCnsKICAgIHR5cGVkZWYgcmF0aW88X19zdGF0aWNfZ2NkPF9SMTo6bnVtLCBfUjI6Om51bT46OnZhbHVlLAogICAgICAgICAgICAgICAgICBfX3N0YXRpY19sY208X1IxOjpkZW4sIF9SMjo6ZGVuPjo6dmFsdWU+IHR5cGU7Cn07CgpfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECgojZW5kaWYgIC8vIF9MSUJDUFBfUkFUSU8K