Hello everyone,
I'm encountering a strange behavior regarding inquiry results. I'm
working on a C program, which has a method called 'scanner_start'. This
method performs an inquiry and reports the corresponding addresses and
RSSI values of all results.
When I just call this method and do nothing else, it works as intended.
However, if I do anything prior to that, I only get 'normal' inquiry
results without RSSI.
As example, this works:
/* do nothing here */
scanner_start();
/* do something here */
whereas this fails:
/* do nothing here */
int i;
scanner_start();
/* do something here */
Below is the complete source code needed to reproduce this behavior.
I cannot really imagine, how an unused declaration can have an impact on
the inquiry results. Does anybody have a clue, how this could be?
Thank you,
Ulrich
--
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <sys/ioctl.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
static void print_result(bdaddr_t *bdaddr, char has_rssi, int rssi)
{
char addr[18];
ba2str(bdaddr, addr);
printf("%17s", addr);
if(has_rssi)
printf(" RSSI:%d", rssi);
else
printf(" RSSI:n/a");
printf("\n");
fflush(NULL);
}
static void scanner_start()
{
int dev_id, sock = 0;
struct hci_filter flt;
inquiry_cp cp;
unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr;
hci_event_hdr *hdr;
char canceled = 0;
inquiry_info_with_rssi *info_rssi;
inquiry_info *info;
int results, i, len;
struct pollfd p;
dev_id = hci_get_route(NULL);
sock = hci_open_dev( dev_id );
if (dev_id < 0 || sock < 0) {
perror("Can't open socket");
return;
}
hci_filter_clear(&flt);
hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
hci_filter_set_event(EVT_INQUIRY_RESULT, &flt);
hci_filter_set_event(EVT_INQUIRY_RESULT_WITH_RSSI, &flt);
hci_filter_set_event(EVT_INQUIRY_COMPLETE, &flt);
if (setsockopt(sock, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
perror("Can't set HCI filter");
return;
}
if (hci_send_cmd(sock, OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE,
WRITE_INQUIRY_MODE_RP_SIZE, &cp) < 0) {
perror("Can't set inquiry mode");
return;
}
memset (&cp, 0, sizeof(cp));
cp.lap[2] = 0x9e;
cp.lap[1] = 0x8b;
cp.lap[0] = 0x33;
cp.num_rsp = 0;
cp.length = 0x30;
printf("Starting inquiry with RSSI...\n");
if (hci_send_cmd (sock, OGF_LINK_CTL, OCF_INQUIRY, INQUIRY_CP_SIZE,
&cp) < 0) {
perror("Can't start inquiry");
return;
}
p.fd = sock;
p.events = POLLIN | POLLERR | POLLHUP;
while(!canceled) {
p.revents = 0;
/* poll the BT device for an event */
if (poll(&p, 1, -1) > 0) {
len = read(sock, buf, sizeof(buf));
if (len < 0)
continue;
else if (len == 0)
break;
hdr = (void *) (buf + 1);
ptr = buf + (1 + HCI_EVENT_HDR_SIZE);
results = ptr[0];
switch (hdr->evt) {
case EVT_INQUIRY_RESULT:
for (i = 0; i < results; i++) {
info = (void *)ptr + (sizeof(*info) * i) + 1;
print_result(&info->bdaddr, 0, 0);
}
break;
case EVT_INQUIRY_RESULT_WITH_RSSI:
for (i = 0; i < results; i++) {
info_rssi = (void *)ptr + (sizeof(*info_rssi) * i) + 1;
print_result(&info_rssi->bdaddr, 1, info_rssi->rssi);
}
break;
case EVT_INQUIRY_COMPLETE:
canceled = 1;
break;
}
}
}
close(sock);
}
int main(int argc, char **argv)
{
//int i; /* causes inq. result to have no rssi value */
scanner_start();
return 0;
}
Hi Vinicius,
>> if (hci_send_cmd(sock, OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE,
>> WRITE_INQUIRY_MODE_RP_SIZE,&cp)< 0) {
>
> Taking a look at your code, a few things look out of place: you are
> using cp uninitialized, it is expecting a write_inquiry_mode_cp, not a
> inquiry_cp and the plen parameter seems wrong.
Silly me! How could I have missed this?
Well, now I use write_inquiry_mode_cp with a mode set to 0x01 and the
proper plen.
Everything works as expected!
Thank you very much for the quick help!
Ulrich
SGkgVWxyaWNoLAoKT24gVGh1LCBKYW4gMjAsIDIwMTEgYXQgMTI6NDQgUE0sIFVscmljaCBCw7xy
Z2kgPGJ1ZXJnaUBpYW0udW5pYmUuY2g+IHdyb3RlOgo+IEhlbGxvIGV2ZXJ5b25lLAo+Cj4gSSdt
IGVuY291bnRlcmluZyBhIHN0cmFuZ2UgYmVoYXZpb3IgcmVnYXJkaW5nIGlucXVpcnkgcmVzdWx0
cy4gSSdtIHdvcmtpbmcKPiBvbiBhIEMgcHJvZ3JhbSwgd2hpY2ggaGFzIGEgbWV0aG9kIGNhbGxl
ZCAnc2Nhbm5lcl9zdGFydCcuIFRoaXMgbWV0aG9kCj4gcGVyZm9ybXMgYW4gaW5xdWlyeSBhbmQg
cmVwb3J0cyB0aGUgY29ycmVzcG9uZGluZyBhZGRyZXNzZXMgYW5kIFJTU0kgdmFsdWVzCj4gb2Yg
YWxsIHJlc3VsdHMuCj4gV2hlbiBJIGp1c3QgY2FsbCB0aGlzIG1ldGhvZCBhbmQgZG8gbm90aGlu
ZyBlbHNlLCBpdCB3b3JrcyBhcyBpbnRlbmRlZC4KPiBIb3dldmVyLCBpZiBJIGRvIGFueXRoaW5n
IHByaW9yIHRvIHRoYXQsIEkgb25seSBnZXQgJ25vcm1hbCcgaW5xdWlyeSByZXN1bHRzCj4gd2l0
aG91dCBSU1NJLgo+Cj4gQXMgZXhhbXBsZSwgdGhpcyB3b3JrczoKPiAvKiBkbyBub3RoaW5nIGhl
cmUgKi8KPiBzY2FubmVyX3N0YXJ0KCk7Cj4gLyogZG8gc29tZXRoaW5nIGhlcmUgKi8KPgo+IHdo
ZXJlYXMgdGhpcyBmYWlsczoKPiAvKiBkbyBub3RoaW5nIGhlcmUgKi8KPiBpbnQgaTsKPiBzY2Fu
bmVyX3N0YXJ0KCk7Cj4gLyogZG8gc29tZXRoaW5nIGhlcmUgKi8KPgo+IEJlbG93IGlzIHRoZSBj
b21wbGV0ZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gcmVwcm9kdWNlIHRoaXMgYmVoYXZpb3IuCj4K
PiBJIGNhbm5vdCByZWFsbHkgaW1hZ2luZSwgaG93IGFuIHVudXNlZCBkZWNsYXJhdGlvbiBjYW4g
aGF2ZSBhbiBpbXBhY3Qgb24gdGhlCj4gaW5xdWlyeSByZXN1bHRzLiBEb2VzIGFueWJvZHkgaGF2
ZSBhIGNsdWUsIGhvdyB0aGlzIGNvdWxkIGJlPwo+Cj4gVGhhbmsgeW91LAo+IFVscmljaAo+Cj4g
LS0KPgo+ICNpbmNsdWRlIDxzdGRpby5oPgo+ICNpbmNsdWRlIDxzdGRsaWIuaD4KPiAjaW5jbHVk
ZSA8dW5pc3RkLmg+Cj4gI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KPiAjaW5jbHVkZSA8c3lzL3Bv
bGwuaD4KPiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4gI2luY2x1ZGUgPGJsdWV0b290aC9ibHVl
dG9vdGguaD4KPiAjaW5jbHVkZSA8Ymx1ZXRvb3RoL2hjaS5oPgo+ICNpbmNsdWRlIDxibHVldG9v
dGgvaGNpX2xpYi5oPgo+Cj4gc3RhdGljIHZvaWQgcHJpbnRfcmVzdWx0KGJkYWRkcl90ICpiZGFk
ZHIsIGNoYXIgaGFzX3Jzc2ksIGludCByc3NpKQo+IHsKPiDCoCDCoCDCoCDCoGNoYXIgYWRkclsx
OF07Cj4KPiDCoCDCoCDCoCDCoGJhMnN0cihiZGFkZHIsIGFkZHIpOwo+Cj4gwqAgwqAgwqAgwqBw
cmludGYoIiUxN3MiLCBhZGRyKTsKPiDCoCDCoCDCoCDCoGlmKGhhc19yc3NpKQo+IMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgcHJpbnRmKCIgUlNTSTolZCIsIHJzc2kpOwo+IMKgIMKgIMKgIMKgZWxz
ZQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJpbnRmKCIgUlNTSTpuL2EiKTsKPiDCoCDCoCDC
oCDCoHByaW50ZigiXG4iKTsKPiDCoCDCoCDCoCDCoGZmbHVzaChOVUxMKTsKPiB9Cj4KPgo+IHN0
YXRpYyB2b2lkIHNjYW5uZXJfc3RhcnQoKQo+IHsKPiDCoCDCoCDCoCDCoGludCBkZXZfaWQsIHNv
Y2sgPSAwOwo+IMKgIMKgIMKgIMKgc3RydWN0IGhjaV9maWx0ZXIgZmx0Owo+IMKgIMKgIMKgIMKg
aW5xdWlyeV9jcCBjcDsKPiDCoCDCoCDCoCDCoHVuc2lnbmVkIGNoYXIgYnVmW0hDSV9NQVhfRVZF
TlRfU0laRV0sICpwdHI7Cj4gwqAgwqAgwqAgwqBoY2lfZXZlbnRfaGRyICpoZHI7Cj4gwqAgwqAg
wqAgwqBjaGFyIGNhbmNlbGVkID0gMDsKPiDCoCDCoCDCoCDCoGlucXVpcnlfaW5mb193aXRoX3Jz
c2kgKmluZm9fcnNzaTsKPiDCoCDCoCDCoCDCoGlucXVpcnlfaW5mbyAqaW5mbzsKPiDCoCDCoCDC
oCDCoGludCByZXN1bHRzLCBpLCBsZW47Cj4gwqAgwqAgwqAgwqBzdHJ1Y3QgcG9sbGZkIHA7Cj4K
PiDCoCDCoCDCoCDCoGRldl9pZCA9IGhjaV9nZXRfcm91dGUoTlVMTCk7Cj4gwqAgwqAgwqAgwqBz
b2NrID0gaGNpX29wZW5fZGV2KCBkZXZfaWQgKTsKPiDCoCDCoCDCoCDCoGlmIChkZXZfaWQgPCAw
IHx8IHNvY2sgPCAwKSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwZXJyb3IoIkNhbid0IG9w
ZW4gc29ja2V0Iik7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm47Cj4gwqAgwqAgwqAg
wqB9Cj4KPiDCoCDCoCDCoCDCoGhjaV9maWx0ZXJfY2xlYXIoJmZsdCk7Cj4gwqAgwqAgwqAgwqBo
Y2lfZmlsdGVyX3NldF9wdHlwZShIQ0lfRVZFTlRfUEtULCAmZmx0KTsKPiDCoCDCoCDCoCDCoGhj
aV9maWx0ZXJfc2V0X2V2ZW50KEVWVF9JTlFVSVJZX1JFU1VMVCwgJmZsdCk7Cj4gwqAgwqAgwqAg
wqBoY2lfZmlsdGVyX3NldF9ldmVudChFVlRfSU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJLCAmZmx0
KTsKPiDCoCDCoCDCoCDCoGhjaV9maWx0ZXJfc2V0X2V2ZW50KEVWVF9JTlFVSVJZX0NPTVBMRVRF
LCAmZmx0KTsKPiDCoCDCoCDCoCDCoGlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9IQ0ksIEhDSV9G
SUxURVIsICZmbHQsIHNpemVvZihmbHQpKSA8IDApIHsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oHBlcnJvcigiQ2FuJ3Qgc2V0IEhDSSBmaWx0ZXIiKTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oHJldHVybjsKPiDCoCDCoCDCoCDCoH0KPgo+IMKgIMKgIMKgIMKgaWYgKGhjaV9zZW5kX2NtZChz
b2NrLCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9JTlFVSVJZX01PREUsCj4gV1JJVEVfSU5RVUlS
WV9NT0RFX1JQX1NJWkUsICZjcCkgPCAwKSB7CgpUYWtpbmcgYSBsb29rIGF0IHlvdXIgY29kZSwg
YSBmZXcgdGhpbmdzIGxvb2sgb3V0IG9mIHBsYWNlOiB5b3UgYXJlCnVzaW5nIGNwIHVuaW5pdGlh
bGl6ZWQsIGl0IGlzIGV4cGVjdGluZyBhIHdyaXRlX2lucXVpcnlfbW9kZV9jcCwgbm90IGEKaW5x
dWlyeV9jcCBhbmQgdGhlIHBsZW4gcGFyYW1ldGVyIHNlZW1zIHdyb25nLgoKRGVjbGFyaW5nIChv
ciBub3QpIHRoZSB2YXJpYWJsZSBpIGlzIG1lc3Npbmcgd2l0aCB0aGUgc3RhY2sgc3RhdGUgYW5k
CmFmZmVjdGluZyB0aGUgdmFsdWUgdGhhdCBnb2VzIGludG8gY3AuCgo+IMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgcGVycm9yKCJDYW4ndCBzZXQgaW5xdWlyeSBtb2RlIik7Cj4gwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqByZXR1cm47Cj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDCoCDCoG1lbXNldCAo
JmNwLCAwLCBzaXplb2YoY3ApKTsKPiDCoCDCoCDCoCDCoGNwLmxhcFsyXSA9IDB4OWU7Cj4gwqAg
wqAgwqAgwqBjcC5sYXBbMV0gPSAweDhiOwo+IMKgIMKgIMKgIMKgY3AubGFwWzBdID0gMHgzMzsK
PiDCoCDCoCDCoCDCoGNwLm51bV9yc3AgPSAwOwo+IMKgIMKgIMKgIMKgY3AubGVuZ3RoID0gMHgz
MDsKPgo+IMKgIMKgIMKgIMKgcHJpbnRmKCJTdGFydGluZyBpbnF1aXJ5IHdpdGggUlNTSS4uLlxu
Iik7Cj4KPiDCoCDCoCDCoCDCoGlmIChoY2lfc2VuZF9jbWQgKHNvY2ssIE9HRl9MSU5LX0NUTCwg
T0NGX0lOUVVJUlksIElOUVVJUllfQ1BfU0laRSwKPiAmY3ApIDwgMCkgewo+IMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgcGVycm9yKCJDYW4ndCBzdGFydCBpbnF1aXJ5Iik7Cj4gwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqByZXR1cm47Cj4gwqAgwqAgwqAgwqB9Cj4KPiDCoCDCoCDCoCDCoHAuZmQgPSBz
b2NrOwo+IMKgIMKgIMKgIMKgcC5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSIHwgUE9MTEhVUDsK
Pgo+IMKgIMKgIMKgIMKgd2hpbGUoIWNhbmNlbGVkKSB7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqBwLnJldmVudHMgPSAwOwo+Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBwb2xsIHRoZSBC
VCBkZXZpY2UgZm9yIGFuIGV2ZW50ICovCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAocG9s
bCgmcCwgMSwgLTEpID4gMCkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
bGVuID0gcmVhZChzb2NrLCBidWYsIHNpemVvZihidWYpKTsKPgo+IMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgaWYgKGxlbiA8IDApCj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb250aW51ZTsKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoGVsc2UgaWYgKGxlbiA9PSAwKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlYWs7Cj4KPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoGhkciA9ICh2b2lkICopIChidWYgKyAxKTsKPiDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoHB0ciA9IGJ1ZiArICgxICsgSENJX0VWRU5UX0hEUl9TSVpFKTsK
Pgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmVzdWx0cyA9IHB0clswXTsK
Pgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3dpdGNoIChoZHItPmV2dCkg
ewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2FzZSBF
VlRfSU5RVUlSWV9SRVNVTFQ6Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmb3IgKGkgPSAwOyBpIDwgcmVzdWx0czsgaSsrKSB7Cj4g
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqBpbmZvID0gKHZvaWQgKilwdHIgKwo+IChzaXplb2YoKmluZm8pICogaSkg
KyAxOwo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJpbnRfcmVzdWx0KCZpbmZvLT5iZGFkZHIsCj4gMCwgMCk7
Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqB9Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqBicmVhazsKPgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgY2FzZSBFVlRfSU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJOgo+IMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZm9yIChp
ID0gMDsgaSA8IHJlc3VsdHM7IGkrKykgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaW5mb19yc3NpID0gKHZv
aWQgKilwdHIgKwo+IChzaXplb2YoKmluZm9fcnNzaSkgKiBpKSArIDE7Cj4KPiDCoHByaW50X3Jl
c3VsdCgmaW5mb19yc3NpLT5iZGFkZHIsIDEsIGluZm9fcnNzaS0+cnNzaSk7Cj4gwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9Cj4gwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBi
cmVhazsKPgo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
Y2FzZSBFVlRfSU5RVUlSWV9DT01QTEVURToKPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNhbmNlbGVkID0gMTsKPiDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOwo+
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgfQo+IMKgIMKgIMKgIMKgfQo+IMKgIMKgIMKgIMKgY2xvc2Uoc29jayk7Cj4gfQo+Cj4g
aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQo+IHsKPiDCoCDCoCDCoCDCoC8vaW50IGk7
IC8qIGNhdXNlcyBpbnEuIHJlc3VsdCB0byBoYXZlIG5vIHJzc2kgdmFsdWUgKi8KPiDCoCDCoCDC
oCDCoHNjYW5uZXJfc3RhcnQoKTsKPiDCoCDCoCDCoCDCoHJldHVybiAwOwo+IH0KPiAtLQo+IFRv
IHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBs
aW51eC1ibHVldG9vdGgiCj4gaW4KPiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21v
QHZnZXIua2VybmVsLm9yZwo+IE1vcmUgbWFqb3Jkb21vIGluZm8gYXQgwqBodHRwOi8vdmdlci5r
ZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKPgoKCkNoZWVycywKLS0gClZpbmljaXVzCg==