{
  "TypeId": "ScriptDemosaicingAlgorithm",
  "Version": 1,
  "Id": "1ce136df-a992-41b7-901d-b457d51eb42d",
  "DisplayName": "Bilinear - Python",
  "SupportedBayerPatterns": [
    "BGGR_2x2",
    "GBRG_2x2",
    "GRBG_2x2",
    "RGGB_2x2",
    "BGGR_4x4",
    "GBRG_4x4",
    "GRBG_4x4",
    "RGGB_4x4"
  ],
  "IsDedicatedOutputBufferNeeded": false,
  "DemosaicingScript": {
    "Language": "Python",
    "Source": "IyBwcmVwYXJlIHRoZSByZXN1bHQgdG8gcmVwb3J0LCBhbmQgZmFpbCBlYXJseSBpZiB0aGUgdHlwZSBpcyBub3QgYm91bmQKcmVzdWx0ID0gRGVtb3NhaWNpbmdSZXN1bHQuRGVmYXVsdAoKIyBjaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBidWZmZXJzLCB0aGlzIHNjcmlwdCByZWFkcyBhbmQgd3JpdGVzIDE2LWJpdCBjb2xvciBjaGFubmVscyBvbmx5CmlmIGNvbnRleHQuRm9ybWF0ICE9IEJpdG1hcEZvcm1hdC5CZ3JhNjQ6CiAgICByYWlzZSBFeGNlcHRpb24oIk9ubHkgNjQtYml0IEJHUkEgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LiIpCgojIGludGVycG9sYXRlIG9uZSBtb3NhaWMsIHdoaWNoIGlzIHRoZSBpbWFnZSBpdHNlbGYgd2hlbiBpdHMgcGF0dGVybiBpcyAyeDIgYW5kIG9uZSBvZiB0aGUgNCBwaGFzZXMgb2YgdGhlIGltYWdlIHdoZW4gaXQgaXMgNHg0CmRlZiBpbnRlcnBvbGF0ZV9tb3NhaWMobW9zYWljKToKCiAgICAjIGNvcHkgdGhlIGNvbG9yIHBhdHRlcm4gaW50byBwbGFpbiBsaXN0cywgdGhlIHZhbHVlIG9mIGVhY2ggY29tcG9uZW50IGlzIHRoZSBvZmZzZXQgb2YgaXRzIGNoYW5uZWwgaW4gYSBCR1JBIHBpeGVsCiAgICBjb2xvcl9wYXR0ZXJuID0gbW9zYWljLkNvbG9yUGF0dGVybgogICAgaWYgbGVuKGNvbG9yX3BhdHRlcm4pICE9IDIgb3IgbGVuKGNvbG9yX3BhdHRlcm5bMF0pICE9IDI6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJPbmx5IDJ4MiBwYXR0ZXJucyBvZiBCYXllciBGaWx0ZXIgYXJlIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4iKQogICAgcGF0dGVybiA9IFsKICAgICAgICBbIGludChjb2xvcl9wYXR0ZXJuWzBdWzBdKSwgaW50KGNvbG9yX3BhdHRlcm5bMF1bMV0pIF0sCiAgICAgICAgWyBpbnQoY29sb3JfcGF0dGVyblsxXVswXSksIGludChjb2xvcl9wYXR0ZXJuWzFdWzFdKSBdCiAgICBdCgogICAgIyBwcmVwYXJlIHRoZSBnZW9tZXRyeSBhbmQgdGhlIHN0cmVhbXMsIHdoaWNoIGJlbG9uZyB0byB0aGlzIG1vc2FpYyBhbmQgbm90IHRvIHRoZSBpbWFnZQogICAgd2lkdGggPSBtb3NhaWMuV2lkdGgKICAgIGhlaWdodCA9IG1vc2FpYy5IZWlnaHQKICAgIGxhc3RfeCA9IHdpZHRoIC0gMQogICAgbGFzdF95ID0gaGVpZ2h0IC0gMQogICAgY29tcG9uZW50X2NvdW50ID0gd2lkdGggKiA0CiAgICBpbnB1dF9zdHJlYW0gPSBtb3NhaWMuSW5wdXRTdHJlYW0KICAgIG91dHB1dF9zdHJlYW0gPSBtb3NhaWMuT3V0cHV0U3RyZWFtCiAgICBpbnB1dF9zdHJlYW0uUG9zaXRpb24gPSAwCiAgICBvdXRwdXRfc3RyZWFtLlBvc2l0aW9uID0gMAoKICAgICMgcHJlcGFyZSB0aGUgYnVmZmVycywgdGhlIGFycmF5cyBjcmVhdGVkIGJ5IHRoZSBjb250ZXh0IGFyZSBDTFIgYXJyYXlzIHdoaWNoIHRoZSBidWxrIGhlbHBlcnMgZmlsbCBhbmQgd3JpdGUgZGlyZWN0bHkKICAgIGlucHV0X2J1ZmZlciA9IGNvbnRleHQuQ3JlYXRlVUludDE2QXJyYXkoY29tcG9uZW50X2NvdW50KQogICAgb3V0cHV0X2J1ZmZlciA9IGNvbnRleHQuQ3JlYXRlVUludDE2QXJyYXkoY29tcG9uZW50X2NvdW50KQogICAgb3V0cHV0X3JvdyA9IFswXSAqIGNvbXBvbmVudF9jb3VudAogICAgb3V0cHV0X3Jvd1szOjo0XSA9IFs2NTUzNV0gKiB3aWR0aAoKICAgICMgcmVhZCBvbmUgcm93IG9mIHRoZSBtb3NhaWMgYW5kIGtlZXAgdGhlIHNpbmdsZSBkZWZpbmVkIGNvbG9yIGNoYW5uZWwgb2YgZWFjaCBvZiBpdHMgcGl4ZWxzCiAgICBkZWYgcmVhZF9tb3NhaWNfcm93KHkpOgogICAgICAgIFN0cmVhbUV4dGVuc2lvbnMuUmVhZFVJbnQxNkV4YWN0KGlucHV0X3N0cmVhbSwgaW5wdXRfYnVmZmVyLCAwLCBjb21wb25lbnRfY291bnQpCiAgICAgICAgdmFsdWVzID0gbGlzdChpbnB1dF9idWZmZXIpCiAgICAgICAgY29tcG9uZW50cyA9IHBhdHRlcm5beSAmIDFdCiAgICAgICAgc2FtcGxlcyA9IFswXSAqIHdpZHRoCiAgICAgICAgc2FtcGxlc1swOjoyXSA9IHZhbHVlc1tjb21wb25lbnRzWzBdOjo4XQogICAgICAgIHNhbXBsZXNbMTo6Ml0gPSB2YWx1ZXNbNCArIGNvbXBvbmVudHNbMV06OjhdCiAgICAgICAgcmV0dXJuIHNhbXBsZXMKCiAgICAjIHByaW1lIHRoZSB3aW5kb3cgd2l0aCB0aGUgZmlyc3Qgcm93LCB0aGUgcm93IGFib3ZlIGl0IGlzIHRoZSByb3cgaXRzZWxmCiAgICBjdXJyZW50ID0gcmVhZF9tb3NhaWNfcm93KDApCiAgICBhYm92ZSA9IGN1cnJlbnQKCiAgICAjIGludGVycG9sYXRlIHRoZSBtb3NhaWMgcm93IGJ5IHJvdywga2VlcGluZyBvbmx5IHRoZSAzIHJvd3Mgd2hpY2ggdGhlIDN4MyB3aW5kb3cgbmVlZHMKICAgIGZvciB5IGluIHJhbmdlKGhlaWdodCk6CgogICAgICAgICMgc3RvcCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpZiB0aGUgcmVuZGVyaW5nIGhhcyBiZWVuIGNhbmNlbGxlZAogICAgICAgIGlmIGlzX2NhbmNlbGxhdGlvbl9yZXF1ZXN0ZWQoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgcmVhZCB0aGUgcm93IGJlbG93LCBvciBleHRlbmQgdGhlIGJvdHRvbSBib3JkZXIgYnkgdGhlIGxhc3Qgcm93CiAgICAgICAgaWYgeSA8IGxhc3RfeToKICAgICAgICAgICAgYmVsb3cgPSByZWFkX21vc2FpY19yb3coeSArIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmVsb3cgPSBjdXJyZW50CgogICAgICAgICMgZXh0ZW5kIHRoZSBsZWZ0IGFuZCByaWdodCBib3JkZXJzIG9mIHRoZSAzIHJvd3Mgc28gdGhhdCBldmVyeSBwaXhlbCBoYXMgOCBuZWlnaGJvcnMKICAgICAgICBjdXJyZW50X2xlZnQgPSBbIGN1cnJlbnRbMF0gXSArIGN1cnJlbnRbMDpsYXN0X3hdCiAgICAgICAgY3VycmVudF9yaWdodCA9IGN1cnJlbnRbMTpdICsgWyBjdXJyZW50W2xhc3RfeF0gXQogICAgICAgIGFib3ZlX2xlZnQgPSBbIGFib3ZlWzBdIF0gKyBhYm92ZVswOmxhc3RfeF0KICAgICAgICBhYm92ZV9yaWdodCA9IGFib3ZlWzE6XSArIFsgYWJvdmVbbGFzdF94XSBdCiAgICAgICAgYmVsb3dfbGVmdCA9IFsgYmVsb3dbMF0gXSArIGJlbG93WzA6bGFzdF94XQogICAgICAgIGJlbG93X3JpZ2h0ID0gYmVsb3dbMTpdICsgWyBiZWxvd1tsYXN0X3hdIF0KCiAgICAgICAgIyBpbnRlcnBvbGF0ZSB0aGUgNCBhdmVyYWdlcyB3aGljaCB0aGUgM3gzIHdpbmRvdyBjYW4gcHJvdmlkZSwgZm9yIGV2ZXJ5IHBpeGVsIG9mIHRoZSByb3cgYXQgb25jZQogICAgICAgIGhvcml6b250YWwgPSBbIChhICsgYikgPj4gMSBmb3IgYSwgYiBpbiB6aXAoY3VycmVudF9sZWZ0LCBjdXJyZW50X3JpZ2h0KSBdCiAgICAgICAgdmVydGljYWwgPSBbIChhICsgYikgPj4gMSBmb3IgYSwgYiBpbiB6aXAoYWJvdmUsIGJlbG93KSBdCiAgICAgICAgZGlhZ29uYWwgPSBbIChhICsgYiArIGMgKyBkKSA\u002BPiAyIGZvciBhLCBiLCBjLCBkIGluIHppcChhYm92ZV9sZWZ0LCBhYm92ZV9yaWdodCwgYmVsb3dfbGVmdCwgYmVsb3dfcmlnaHQpIF0KICAgICAgICBvcnRob2dvbmFsID0gWyAoYSArIGIgKyBjICsgZCkgPj4gMiBmb3IgYSwgYiwgYywgZCBpbiB6aXAoY3VycmVudF9sZWZ0LCBjdXJyZW50X3JpZ2h0LCBhYm92ZSwgYmVsb3cpIF0KCiAgICAgICAgIyBwbGFjZSB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGl4ZWxzIG9mIGVhY2ggcGFyaXR5LCB0aGUgcGl4ZWxzIG9mIG9uZSBwYXJpdHkgYWxsIHByb3ZpZGUgdGhlIHNhbWUgY29tcG9uZW50CiAgICAgICAgcm93X2NvbXBvbmVudHMgPSBwYXR0ZXJuW3kgJiAxXQogICAgICAgIG5laWdoYm9yX2NvbXBvbmVudHMgPSBwYXR0ZXJuWyh5ICsgMSkgJiAxXQogICAgICAgIGZvciBwYXJpdHkgaW4gKDAsIDEpOgogICAgICAgICAgICBvZmZzZXQgPSBwYXJpdHkgKiA0CiAgICAgICAgICAgIG93bl9jb21wb25lbnQgPSByb3dfY29tcG9uZW50c1twYXJpdHldCiAgICAgICAgICAgIGhvcml6b250YWxfY29tcG9uZW50ID0gcm93X2NvbXBvbmVudHNbMSAtIHBhcml0eV0KICAgICAgICAgICAgdmVydGljYWxfY29tcG9uZW50ID0gbmVpZ2hib3JfY29tcG9uZW50c1twYXJpdHldCiAgICAgICAgICAgIGRpYWdvbmFsX2NvbXBvbmVudCA9IG5laWdoYm9yX2NvbXBvbmVudHNbMSAtIHBhcml0eV0KICAgICAgICAgICAgb3V0cHV0X3Jvd1tvZmZzZXQgKyBvd25fY29tcG9uZW50Ojo4XSA9IGN1cnJlbnRbcGFyaXR5OjoyXQogICAgICAgICAgICBpZiBob3Jpem9udGFsX2NvbXBvbmVudCA9PSB2ZXJ0aWNhbF9jb21wb25lbnQ6CiAgICAgICAgICAgICAgICAjIGEgcmVkIG9yIGJsdWUgcGl4ZWwsIGdyZWVuIGNvbWVzIGZyb20gdGhlIDQgcGl4ZWxzIGJlc2lkZSBpdCBhbmQgdGhlIHJlbWFpbmluZyBjb21wb25lbnQgZnJvbSB0aGUgNCBkaWFnb25hbCBvbmVzCiAgICAgICAgICAgICAgICBvdXRwdXRfcm93W29mZnNldCArIGhvcml6b250YWxfY29tcG9uZW50Ojo4XSA9IG9ydGhvZ29uYWxbcGFyaXR5OjoyXQogICAgICAgICAgICAgICAgb3V0cHV0X3Jvd1tvZmZzZXQgKyBkaWFnb25hbF9jb21wb25lbnQ6OjhdID0gZGlhZ29uYWxbcGFyaXR5OjoyXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBhIGdyZWVuIHBpeGVsLCB0aGUgMiByZW1haW5pbmcgY29tcG9uZW50cyBjb21lIGZyb20gdGhlIHBpeGVscyBiZXNpZGUgaXQgYW5kIGZyb20gdGhlIHBpeGVscyBhYm92ZSBhbmQgYmVsb3cgaXQKICAgICAgICAgICAgICAgIG91dHB1dF9yb3dbb2Zmc2V0ICsgaG9yaXpvbnRhbF9jb21wb25lbnQ6OjhdID0gaG9yaXpvbnRhbFtwYXJpdHk6OjJdCiAgICAgICAgICAgICAgICBvdXRwdXRfcm93W29mZnNldCArIHZlcnRpY2FsX2NvbXBvbmVudDo6OF0gPSB2ZXJ0aWNhbFtwYXJpdHk6OjJdCgogICAgICAgICMgY29weSB0aGUgaW50ZXJwb2xhdGVkIHJvdyBpbnRvIHRoZSBDTFIgYXJyYXksIHdyaXRlIGl0LCBhbmQgbW92ZSB0aGUgd2luZG93IGRvd24KICAgICAgICBvdXRwdXRfYnVmZmVyWzA6Y29tcG9uZW50X2NvdW50XSA9IG91dHB1dF9yb3cKICAgICAgICBTdHJlYW1FeHRlbnNpb25zLldyaXRlVUludDE2KG91dHB1dF9zdHJlYW0sIG91dHB1dF9idWZmZXIsIDAsIGNvbXBvbmVudF9jb3VudCkKICAgICAgICBhYm92ZSA9IGN1cnJlbnQKICAgICAgICBjdXJyZW50ID0gYmVsb3cKCiAgICAjIHJlcG9ydCB0aGF0IHRoZSB3aG9sZSBtb3NhaWMgaGFzIGJlZW4gaW50ZXJwb2xhdGVkCiAgICByZXR1cm4gVHJ1ZQoKIyBpbnRlcnBvbGF0ZSB0aGUgc3ViIG1vc2FpY3Mgb25lIGJ5IG9uZSwgYSAyeDIgbW9zYWljIGlzIGhhbmRlZCBvdXQgb25jZSBhcyB0aGUgb25seSBvbmUgYW5kIGEgNHg0IG1vc2FpYyBhcyB0aGUgNCAyeDIgbW9zYWljcyBpdHMgcGhhc2VzIGNhcnJ5CnN1Yl9tb3NhaWMgPSBjb250ZXh0LlNlbGVjdE5leHRTdWJNb3NhaWMoKQp3aGlsZSBzdWJfbW9zYWljIGlzIG5vdCBOb25lOgogICAgaWYgbm90IGludGVycG9sYXRlX21vc2FpYyhzdWJfbW9zYWljKToKICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBzdWJfbW9zYWljID0gY29udGV4dC5TZWxlY3ROZXh0U3ViTW9zYWljKCkKCnJldHVybiByZXN1bHQK"
  }
}