LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBpMmMtZWxla3Rvci5jIGkyYy1odyBhY2Nlc3MgZm9yIFBDRjg1ODQgc3R5bGUgaXNhIGJ1cyBhZGFwdGVzICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAogICAgICAgICAgICAgICAgICAgMTk5OC05OSBIYW5zIEJlcmdsdW5kCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCiAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KCi8qIFBhcnRpYWx5IHJld3JpdGVuIGJ5IE9sZWcgSS4gVmRvdmlraW4gZm9yIG1tYXBwZWQgc3VwcG9ydCBvZiAKICAgZm9yIEFscGhhIFByb2Nlc3NvciBJbmMuIFVQLTIwMDAoKykgYm9hcmRzICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjZi5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgoKI2luY2x1ZGUgIi4uL2FsZ29zL2kyYy1hbGdvLXBjZi5oIgoKI2RlZmluZSBERUZBVUxUX0JBU0UgMHgzMzAKCnN0YXRpYyBpbnQgYmFzZTsKc3RhdGljIGludCBpcnE7CnN0YXRpYyBpbnQgY2xvY2sgID0gMHgxYzsKc3RhdGljIGludCBvd24gICAgPSAweDU1OwpzdGF0aWMgaW50IG1tYXBwZWQ7CgovKiB2ZG92aWtpbjogcmVtb3ZlZCBzdGF0aWMgc3RydWN0IGkyY19wY2ZfaXNhIGdwaTsgY29kZSAtIAogIHRoaXMgbW9kdWxlIGluIHJlYWwgc3VwcG9ydHMgb25seSBvbmUgZGV2aWNlLCBkdWUgdG8gbWlzc2luZyBhcmd1bWVudHMKICBpbiBzb21lIGZ1bmN0aW9ucywgY2FsbGVkIGZyb20gdGhlIGFsZ28tcGNmIG1vZHVsZS4gU29tZXRpbWVzIGl0J3MKICBuZWVkIHRvIGJlIHJld3JpdGVuIC0gYnV0IGZvciBub3cganVzdCByZW1vdmUgdGhpcyBmb3Igc2ltcGxlciByZWFkaW5nICovCgpzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcGNmX3dhaXQ7CnN0YXRpYyBpbnQgcGNmX3BlbmRpbmc7CnN0YXRpYyBzcGlubG9ja190IGxvY2s7CgovKiAtLS0tLSBsb2NhbCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwoKc3RhdGljIHZvaWQgcGNmX2lzYV9zZXRieXRlKHZvaWQgKmRhdGEsIGludCBjdGwsIGludCB2YWwpCnsKCWludCBhZGRyZXNzID0gY3RsID8gKGJhc2UgKyAxKSA6IGJhc2U7CgoJLyogZW5hYmxlIGlycSBpZiBhbnkgc3BlY2lmaWVkIGZvciBzZXJpYWwgb3BlcmF0aW9uICovCglpZiAoY3RsICYmIGlycSAmJiAodmFsICYgSTJDX1BDRl9FU08pKSB7CgkJdmFsIHw9IEkyQ19QQ0ZfRU5JOwoJfQoKCXByX2RlYnVnKCJpMmMtZWxla3RvcjogV3JpdGUgMHglWCAweCUwMlhcbiIsIGFkZHJlc3MsIHZhbCAmIDI1NSk7CgoJc3dpdGNoIChtbWFwcGVkKSB7CgljYXNlIDA6IC8qIHJlZ3VsYXIgSS9PICovCgkJb3V0Yih2YWwsIGFkZHJlc3MpOwoJCWJyZWFrOwoJY2FzZSAyOiAvKiBkb3VibGUgbWFwcGVkIEkvTyBuZWVkZWQgZm9yIFVQMjAwMCBib2FyZCwKICAgICAgICAgICAgICAgICAgIEkgZG9uJ3Qga25vdyB3aHkgdGhpcy4uLiAqLwoJCXdyaXRlYih2YWwsICh2b2lkICopYWRkcmVzcyk7CgkJLyogZmFsbCAqLwoJY2FzZSAxOiAvKiBtZW1vcnkgbWFwcGVkIEkvTyAqLwoJCXdyaXRlYih2YWwsICh2b2lkICopYWRkcmVzcyk7CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyBpbnQgcGNmX2lzYV9nZXRieXRlKHZvaWQgKmRhdGEsIGludCBjdGwpCnsKCWludCBhZGRyZXNzID0gY3RsID8gKGJhc2UgKyAxKSA6IGJhc2U7CglpbnQgdmFsID0gbW1hcHBlZCA/IHJlYWRiKCh2b2lkICopYWRkcmVzcykgOiBpbmIoYWRkcmVzcyk7CgoJcHJfZGVidWcoImkyYy1lbGVrdG9yOiBSZWFkIDB4JVggMHglMDJYXG4iLCBhZGRyZXNzLCB2YWwpOwoKCXJldHVybiAodmFsKTsKfQoKc3RhdGljIGludCBwY2ZfaXNhX2dldG93bih2b2lkICpkYXRhKQp7CglyZXR1cm4gKG93bik7Cn0KCgpzdGF0aWMgaW50IHBjZl9pc2FfZ2V0Y2xvY2sodm9pZCAqZGF0YSkKewoJcmV0dXJuIChjbG9jayk7Cn0KCnN0YXRpYyB2b2lkIHBjZl9pc2Ffd2FpdGZvcnBpbih2b2lkKSB7CglERUZJTkVfV0FJVCh3YWl0KTsKCWludCB0aW1lb3V0ID0gMjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaWYgKGlycSA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJCWlmIChwY2ZfcGVuZGluZyA9PSAwKSB7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCQkJcHJlcGFyZV90b193YWl0KCZwY2Zfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJCWlmIChzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQqSFopKSB7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJCQkJaWYgKHBjZl9wZW5kaW5nID09IDEpIHsKCQkJCQlwY2ZfcGVuZGluZyA9IDA7CgkJCQl9CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJCX0KCQkJZmluaXNoX3dhaXQoJnBjZl93YWl0LCAmd2FpdCk7CgkJfSBlbHNlIHsKCQkJcGNmX3BlbmRpbmcgPSAwOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJfQoJfSBlbHNlIHsKCQl1ZGVsYXkoMTAwKTsKCX0KfQoKCnN0YXRpYyBpcnFyZXR1cm5fdCBwY2ZfaXNhX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSB7CglzcGluX2xvY2soJmxvY2spOwoJcGNmX3BlbmRpbmcgPSAxOwoJc3Bpbl91bmxvY2soJmxvY2spOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwY2Zfd2FpdCk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgpzdGF0aWMgaW50IHBjZl9pc2FfaW5pdCh2b2lkKQp7CglzcGluX2xvY2tfaW5pdCgmbG9jayk7CglpZiAoIW1tYXBwZWQpIHsKCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDIsICJpMmMgKGlzYSBidXMgYWRhcHRlcikiKSkgewoJCQlwcmludGsoS0VSTl9FUlIKCQkJICAgICAgICJpMmMtZWxla3RvcjogcmVxdWVzdGVkIEkvTyByZWdpb24gKDB4JVg6MikgIgoJCQkgICAgICAgImlzIGluIHVzZS5cbiIsIGJhc2UpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9Cgl9CglpZiAoaXJxID4gMCkgewoJCWlmIChyZXF1ZXN0X2lycShpcnEsIHBjZl9pc2FfaGFuZGxlciwgMCwgIlBDRjg1ODQiLCBOVUxMKSA8IDApIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtZWxla3RvcjogUmVxdWVzdCBpcnElZCBmYWlsZWRcbiIsIGlycSk7CgkJCWlycSA9IDA7CgkJfSBlbHNlCgkJCWVuYWJsZV9pcnEoaXJxKTsKCX0KCXJldHVybiAwOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRW5jYXBzdWxhdGUgdGhlIGFib3ZlIGZ1bmN0aW9ucyBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb25zIHN0cnVjdHVyZS4KICogVGhpcyBpcyBvbmx5IGRvbmUgd2hlbiBtb3JlIHRoYW4gb25lIGhhcmR3YXJlIGFkYXB0ZXIgaXMgc3VwcG9ydGVkLgogKi8Kc3RhdGljIHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSBwY2ZfaXNhX2RhdGEgPSB7Cgkuc2V0cGNmCSAgICA9IHBjZl9pc2Ffc2V0Ynl0ZSwKCS5nZXRwY2YJICAgID0gcGNmX2lzYV9nZXRieXRlLAoJLmdldG93bgkgICAgPSBwY2ZfaXNhX2dldG93biwKCS5nZXRjbG9jayAgID0gcGNmX2lzYV9nZXRjbG9jaywKCS53YWl0Zm9ycGluID0gcGNmX2lzYV93YWl0Zm9ycGluLAoJLnVkZWxheQkgICAgPSAxMCwKCS5tZGVsYXkJICAgID0gMTAsCgkudGltZW91dCAgICA9IDEwMCwKfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGNmX2lzYV9vcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAoJLmlkCQk9IEkyQ19IV19QX0VMRUssCgkuYWxnb19kYXRhCT0gJnBjZl9pc2FfZGF0YSwKCS5uYW1lCQk9ICJQQ0Y4NTg0IElTQSBhZGFwdGVyIiwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGkyY19wY2Zpc2FfaW5pdCh2b2lkKSAKewojaWZkZWYgX19hbHBoYV9fCgkvKiBjaGVjayB0byBzZWUgd2UgaGF2ZSBtZW1vcnkgbWFwcGVkIFBDRjg1ODQgY29ubmVjdGVkIHRvIHRoZSAKCUN5cHJlc3MgY3k4MmM2OTMgUENJLUlTQSBicmlkZ2UgYXMgb24gVVAyMDAwIGJvYXJkICovCglpZiAoYmFzZSA9PSAwKSB7CgkJc3RydWN0IHBjaV9kZXYgKmN5NjkzX2RldjsKCQkKCQljeTY5M19kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NPTlRBUSwgCgkJCQkJICAgUENJX0RFVklDRV9JRF9DT05UQVFfODJDNjkzLCBOVUxMKTsKCQlpZiAoY3k2OTNfZGV2KSB7CgkJCWNoYXIgY29uZmlnOwoJCQkvKiB5ZWFwLCB3ZSd2ZSBmb3VuZCBjeXByZXNzLCBsZXQncyBjaGVjayBjb25maWcgKi8KCQkJaWYgKCFwY2lfcmVhZF9jb25maWdfYnl0ZShjeTY5M19kZXYsIDB4NDcsICZjb25maWcpKSB7CgkJCQkKCQkJCXByX2RlYnVnKCJpMmMtZWxla3RvcjogZm91bmQgY3k4MmM2OTMsIGNvbmZpZyByZWdpc3RlciAweDQ3ID0gMHglMDJ4LlxuIiwgY29uZmlnKTsKCgkJCQkvKiBVUDIwMDAgYm9hcmQgaGFzIHRoaXMgcmVnaXN0ZXIgc2V0IHRvIDB4ZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBhcyBzZWVtcyBjYW4gYmUgCgkJCQkgICByZXNldCBkdXJpbmcgdGhlIHByb3BlciBpbml0aWFsaXNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGlmIGd1eXMgZnJvbSBBUEkgZGVjaWRlcyB0byBkbyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvLCB3ZSBjYW4gZXZlbiBlbmFibGUgVHN1bmFtaSBQY2hpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBmb3IgdGhlIHVwcGVyIDEgR2IpICovCgoJCQkJLyogc28ganVzdCBjaGVjayBmb3IgUk9NQ1MgYXQgMHhlMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST01DUyBlbmFibGVkIGZvciB3cml0ZXMKCQkJCSAgIGFuZCBleHRlcm5hbCBYRCBCdXMgYnVmZmVyIGluIHVzZS4gKi8KCQkJCWlmICgoY29uZmlnICYgMHg3ZikgPT0gMHg2MSkgewoJCQkJCS8qIHNlZW1zIHRvIGJlIFVQMjAwMCBsaWtlIGJvYXJkICovCgkJCQkJYmFzZSA9IDB4ZTAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJIGRvbid0IGtub3cgd2h5IHdlIG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHR3aWNlICovCgkJCQkJbW1hcHBlZCA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVUDIwMDAgZHJpdmVzIElTQSB3aXRoCgkJCQkJICAgOC4yNSBNSHogKFBDSS80KSBjbG9jawoJCQkJCSAgICh0aGlzIGNhbiBiZSByZWFkIGZyb20gY3lwcmVzcykgKi8KCQkJCQljbG9jayA9IEkyQ19QQ0ZfQ0xLIHwgSTJDX1BDRl9UUk5TOTA7CgkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLWVsZWt0b3I6IGZvdW5kIEFQSSBVUDIwMDAgbGlrZSBib2FyZCwgd2lsbCBwcm9iZSBQQ0Y4NTg0IGxhdGVyLlxuIik7CgkJCQl9CgkJCX0KCQkJcGNpX2Rldl9wdXQoY3k2OTNfZGV2KTsKCQl9Cgl9CiNlbmRpZgoKCS8qIHNhbml0eSBjaGVja3MgZm9yIG1tYXBwZWQgSS9PICovCglpZiAobW1hcHBlZCAmJiBiYXNlIDwgMHhjODAwMCkgewoJCXByaW50ayhLRVJOX0VSUiAiaTJjLWVsZWt0b3I6IGluY29ycmVjdCBiYXNlIGFkZHJlc3MgKDB4JTBYKSBzcGVjaWZpZWQgZm9yIG1tYXBwZWQgSS9PLlxuIiwgYmFzZSk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLWVsZWt0b3I6IGkyYyBwY2Y4NTg0LWlzYSBhZGFwdGVyIGRyaXZlclxuIik7CgoJaWYgKGJhc2UgPT0gMCkgewoJCWJhc2UgPSBERUZBVUxUX0JBU0U7Cgl9CgoJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNmX3dhaXQpOwoJaWYgKHBjZl9pc2FfaW5pdCgpKQoJCXJldHVybiAtRU5PREVWOwoJaWYgKGkyY19wY2ZfYWRkX2J1cygmcGNmX2lzYV9vcHMpIDwgMCkKCQlnb3RvIGZhaWw7CgkKCXByaW50ayhLRVJOX0VSUiAiaTJjLWVsZWt0b3I6IGZvdW5kIGRldmljZSBhdCAlI3guXG4iLCBiYXNlKTsKCglyZXR1cm4gMDsKCiBmYWlsOgoJaWYgKGlycSA+IDApIHsKCQlkaXNhYmxlX2lycShpcnEpOwoJCWZyZWVfaXJxKGlycSwgTlVMTCk7Cgl9CgoJaWYgKCFtbWFwcGVkKQoJCXJlbGVhc2VfcmVnaW9uKGJhc2UgLCAyKTsKCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgdm9pZCBpMmNfcGNmaXNhX2V4aXQodm9pZCkKewoJaTJjX3BjZl9kZWxfYnVzKCZwY2ZfaXNhX29wcyk7CgoJaWYgKGlycSA+IDApIHsKCQlkaXNhYmxlX2lycShpcnEpOwoJCWZyZWVfaXJxKGlycSwgTlVMTCk7Cgl9CgoJaWYgKCFtbWFwcGVkKQoJCXJlbGVhc2VfcmVnaW9uKGJhc2UgLCAyKTsKfQoKTU9EVUxFX0FVVEhPUigiSGFucyBCZXJnbHVuZCA8aGJAc3BhY2V0ZWMubm8+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIHJvdXRpbmVzIGZvciBQQ0Y4NTg0IElTQSBidXMgYWRhcHRlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW0oYmFzZSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGNsb2NrLCBpbnQsIDApOwptb2R1bGVfcGFyYW0ob3duLCBpbnQsIDApOwptb2R1bGVfcGFyYW0obW1hcHBlZCwgaW50LCAwKTsKCm1vZHVsZV9pbml0KGkyY19wY2Zpc2FfaW5pdCk7Cm1vZHVsZV9leGl0KGkyY19wY2Zpc2FfZXhpdCk7Cg==