ICAgICAgKiBTdW1tYXJ5OiBQcm92aWRlIENhbm9uaWNhbCBYTUwgYW5kIEV4Y2x1c2l2ZSBYTUwgQ2Fub25pY2FsaXphdGlvbgogICAgICAqIERlc2NyaXB0aW9uOiB0aGUgYzE0biBtb2R1bGVzIHByb3ZpZGVzIGEKICAgICAgKgogICAgICAqICJDYW5vbmljYWwgWE1MIiBpbXBsZW1lbnRhdGlvbgogICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1jMTRuCiAgICAgICoKICAgICAgKiBhbmQgYW4KICAgICAgKgogICAgICAqICJFeGNsdXNpdmUgWE1MIENhbm9uaWNhbGl6YXRpb24iIGltcGxlbWVudGF0aW9uCiAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLWV4Yy1jMTRuCiAgICAgICoKICAgICAgKiBDb3B5OiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCiAgICAgICoKICAgICAgKiBBdXRob3I6IFBhdHJpY2sgTW9ubmVyYXQgPHBtQGRhdGFzcGhlcmUuY2g+LCBEQVRBU1BIRVJFIFMuQS4KCiAgICAgIC9pZiBub3QgZGVmaW5lZChYTUxfQzE0Tl9IX18pCiAgICAgIC9kZWZpbmUgWE1MX0MxNE5fSF9fCgogICAgICAvaW5jbHVkZSAibGlieG1scnBnL3htbHZlcnNpb24iCgogICAgICAvaWYgZGVmaW5lZChMSUJYTUxfQzE0Tl9FTkFCTEVEKQogICAgICAvaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCgogICAgICAvaW5jbHVkZSAibGlieG1scnBnL3RyZWUiCiAgICAgIC9pbmNsdWRlICJsaWJ4bWxycGcveHBhdGgiCgogICAgICAqIFhNTCBDYW5vbmljYXphdGlvbgogICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1jMTRuCiAgICAgICoKICAgICAgKiBFeGNsdXNpdmUgWE1MIENhbm9uaWNhemF0aW9uCiAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLWV4Yy1jMTRuCiAgICAgICoKICAgICAgKiBDYW5vbmljYWwgZm9ybSBvZiBhbiBYTUwgZG9jdW1lbnQgY291bGQgYmUgY3JlYXRlZCBpZiBhbmQgb25seSBpZgogICAgICAqICBhKSBkZWZhdWx0IGF0dHJpYnV0ZXMgKGlmIGFueSkgYXJlIGFkZGVkIHRvIGFsbCBub2RlcwogICAgICAqICBiKSBhbGwgY2hhcmFjdGVyIGFuZCBwYXJzZWQgZW50aXR5IHJlZmVyZW5jZXMgYXJlIHJlc29sdmVkCiAgICAgICogSW4gb3JkZXIgdG8gYWNoaXZlIHRoaXMgaW4gbGlieG1sMiB0aGUgZG9jdW1lbnQgTVVTVCBiZSBsb2FkZWQgd2l0aAogICAgICAqIGZvbGxvd2luZyBnbG9iYWwgc2V0aW5nczoKICAgICAgKgogICAgICAqICAgIHhtbExvYWRFeHREdGREZWZhdWx0VmFsdWUgPSBYTUxfREVURUNUX0lEUyDjIFhNTF9DT01QTEVURV9BVFRSUzsKICAgICAgKiAgICB4bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0KDEpOwogICAgICAqCiAgICAgICogb3IgY29ycmVzcG9uZGluZyBwYXJzZXIgY29udGV4dCBzZXR0aW5nOgogICAgICAqICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsKICAgICAgKgogICAgICAqICAgIC4uLgogICAgICAqICAgIGN0eHQtPmxvYWRzdWJzZXQgPSBYTUxfREVURUNUX0lEUyDjIFhNTF9DT01QTEVURV9BVFRSUzsKICAgICAgKiAgICBjdHh0LT5yZXBsYWNlRW50aXRpZXMgPSAxOwogICAgICAqICAgIC4uLgoKICAgICAgKiB4bWxDMTROTW9kZToKICAgICAgKgogICAgICAqIFByZWRlZmluZWQgdmFsdWVzIGZvciBDMTROIG1vZGVzCgogICAgIGQgeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZS4uLgogICAgIGQgeG1sQzE0Tk1vZGUgICAgIHMgICAgICAgICAgICAgMTBpIDAgYmFzZWQoIyMjIyMjdHlwZWRlZiMjIyMjIykgICAgICAgICAgIGVudW0KICAgICBkICBYTUxfQzE0Tl8xXzAgICBjICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbCBDMTROIDEuMAogICAgIGQgIFhNTF9DMTROX0VYQ0xVU0lWRV8xXzAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1c2l2ZSBDMTROIDEuMAogICAgIGQgICAgICAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgICAgMQogICAgIGQgIFhNTF9DMTROXzFfMSAgIGMgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMxNE4gMS4xIHNwZWMKCiAgICAgZCB4bWxDMTRORG9jU2F2ZVRvLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgcHIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCd4bWxDMTRORG9jU2F2ZVRvJykKICAgICBkICBkb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sRG9jUHRyKQogICAgIGQgIG5vZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh4bWxOb2RlU2V0UHRyKQogICAgIGQgIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUKICAgICBkICBpbmNsdXNpdmVfbnNfcHJlZml4ZXMuLi4KICAgICBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICooKikKICAgICBkICB3aXRoX2NvbW1lbnRzICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlCiAgICAgZCAgYnVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE91dHB1dEJ1ZmZlclB0cikKCiAgICAgZCB4bWxDMTRORG9jRHVtcE1lbW9yeS4uLgogICAgIGQgICAgICAgICAgICAgICAgIHByICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygneG1sQzE0TkRvY0R1bXBNZW1vcnknKQogICAgIGQgIGRvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh4bWxEb2NQdHIpCiAgICAgZCAgbm9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE5vZGVTZXRQdHIpCiAgICAgZCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZQogICAgIGQgIGluY2x1c2l2ZV9uc19wcmVmaXhlcy4uLgogICAgIGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbENoYXIgKigqKQogICAgIGQgIHdpdGhfY29tbWVudHMgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUKICAgICBkICBkb2NfdHh0X3B0ciAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICooKikKCiAgICAgZCB4bWxDMTRORG9jU2F2ZSAgcHIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCd4bWxDMTRORG9jU2F2ZScpCiAgICAgZCAgZG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbERvY1B0cikKICAgICBkICBub2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sTm9kZVNldFB0cikKICAgICBkICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlCiAgICAgZCAgaW5jbHVzaXZlX25zX3ByZWZpeGVzLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqKCopCiAgICAgZCAgd2l0aF9jb21tZW50cyAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZQogICAgIGQgIGZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgIGQgIGNvbXByZXNzaW9uICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUKCiAgICAgICogVGhpcyBpcyB0aGUgY29yZSBDMTROIGZ1bmN0aW9uCgogICAgICAqIHhtbEMxNE5Jc1Zpc2libGVDYWxsYmFjazoKICAgICAgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEKICAgICAgKiBAbm9kZTogdGhlIGN1cmVudCBub2RlCiAgICAgICogQHBhcmVudDogdGhlIHBhcmVudCBub2RlCiAgICAgICoKICAgICAgKiBTaWduYXR1cmUgZm9yIGEgQzE0TiBjYWxsYmFjayBvbiB2aXNpYmxlIG5vZGVzCiAgICAgICoKICAgICAgKiBSZXR1cm5zIDEgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGluY2x1ZGVkCgogICAgIGQgeG1sQzE0TklzVmlzaWJsZUNhbGxiYWNrLi4uCiAgICAgZCAgICAgICAgICAgICAgICAgcyAgICAgICAgICAgICAgICogICBiYXNlZCgjIyMjIyN0eXBlZGVmIyMjIyMjKQogICAgIGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY3B0cgoKICAgICBkIHhtbEMxNE5FeGVjdXRlICBwciAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ3htbEMxNE5FeGVjdXRlJykKICAgICBkICBkb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sRG9jUHRyKQogICAgIGQgIGlzX3Zpc2libGVfY2FsbGJhY2suLi4KICAgICBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoeG1sQzE0TklzVmlzaWJsZUNhbGxiYWNrKQogICAgIGQgIHVzZXJfZGF0YSAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKgogICAgIGQgIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUKICAgICBkICBpbmNsdXNpdmVfbnNfcHJlZml4ZXMuLi4KICAgICBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICooKikKICAgICBkICB3aXRoX2NvbW1lbnRzICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlCiAgICAgZCAgYnVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHhtbE91dHB1dEJ1ZmZlclB0cikKCiAgICAgIC9lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCWE1MX09VVFBVVF9FTkFCTEQKICAgICAgL2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJYTUxfQzE0Tl9FTkFCTEVECiAgICAgIC9lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0MxNE5fSF9fCg==