In the following, we examine the utility of using GPS distance between phones to predict physical proximity. If successful, this means we can estimate if partners are together or not at any moment in time. Alternatively, and to acquire even more precise estimation of proximity, we can implement logging of “nearby interaction” based on iPhone ultra wideband (radio) chip using the Apple Developer toolkit https://developer.apple.com/documentation/nearbyinteraction. This will give precise distance measures up to 100 meters.

The data we use is collected by students on a 4-day trip to New York. During the trip, the students participated in with various events together and also had free time to explore New York by them selves or in smaller groups (self-organized). More information about the data can be found here: https://rpubs.com/jych/audioexplorers2023
Thus, we will examine how well the GPS distance classify if the students are together and participating in an event or not.

To do this, we will assess:

Average distance between all students.

As GPS is noisy (especially around and inside buildings), we expect that the average distance will be a good group proximity measure.

Distance between selected pairs.

I.e., do the continuous distance between pairs predict togetherness throughout the day (during events + spare time)?

Pre-processing

Prior to computing the distance between GPS coordinates in meters, we remove erroneous GPS logs (values extreme compared to medians). Then, we aggregate data across 1 minute intervals (i.e., across 3 data points). Next, for each 1-min average, the mutual distance between all students are computed (using “geosphere” R package) and averaged.

Data visualizations

Noise and heart rarte

First, we inspect the logged mean noise floor and heart rate.

Group proximity

Next, we inspect the group proximity. That is, the average mutual distance (in meters) between all students. As seen, the distance between students rise and is highest for “Free time”, “Bus”, “Coney Island”, and “Walk”, which are all events where the students are scattered. At the same time, proximity is highest (lowest mutual distance) for “Dinner” and various presentations where all students were together.

Pair proximity

Finally, we focus on the distance between a selected pair of the students. Again, the distance measure seems to be a good proxy for proximity across the days.

LS0tDQp0aXRsZTogIkdQUyBhcyBwcm94aW1pdHkgZGV0ZWN0b3IiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0gDQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsZWNobyA9IEZBTFNFLGZpZy5hbGlnbiA9ICdjZW50ZXInKSANCmdldHdkKCkNCg0KYGBgDQoNCkluIHRoZSBmb2xsb3dpbmcsIHdlIGV4YW1pbmUgdGhlIHV0aWxpdHkgb2YgdXNpbmcgR1BTIGRpc3RhbmNlIGJldHdlZW4gcGhvbmVzIHRvIHByZWRpY3QgcGh5c2ljYWwgcHJveGltaXR5LiBJZiBzdWNjZXNzZnVsLCB0aGlzIG1lYW5zIHdlIGNhbiBlc3RpbWF0ZSBpZiBwYXJ0bmVycyBhcmUgdG9nZXRoZXIgb3Igbm90IGF0IGFueSBtb21lbnQgaW4gdGltZS4gQWx0ZXJuYXRpdmVseSwgYW5kIHRvIGFjcXVpcmUgZXZlbiBtb3JlIHByZWNpc2UgZXN0aW1hdGlvbiBvZiBwcm94aW1pdHksIHdlIGNhbiBpbXBsZW1lbnQgbG9nZ2luZyBvZiAibmVhcmJ5IGludGVyYWN0aW9uIiBiYXNlZCBvbiBpUGhvbmUgdWx0cmEgd2lkZWJhbmQgKHJhZGlvKSBjaGlwIHVzaW5nIHRoZSBBcHBsZSBEZXZlbG9wZXIgdG9vbGtpdCBbaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vbmVhcmJ5aW50ZXJhY3Rpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL25lYXJieWludGVyYWN0aW9uKXt0YXJnZXQ9Il9ibGFuayJ9LiBUaGlzIHdpbGwgZ2l2ZSBwcmVjaXNlIGRpc3RhbmNlIG1lYXN1cmVzIHVwIHRvIDEwMCBtZXRlcnMuPGJyPiAgIA0KVGhlIGRhdGEgd2UgdXNlIGlzIGNvbGxlY3RlZCBieSBzdHVkZW50cyBvbiBhIDQtZGF5IHRyaXAgdG8gTmV3IFlvcmsuIER1cmluZyB0aGUgdHJpcCwgdGhlIHN0dWRlbnRzIHBhcnRpY2lwYXRlZCBpbiB3aXRoIHZhcmlvdXMgZXZlbnRzIHRvZ2V0aGVyIGFuZCBhbHNvIGhhZCBmcmVlIHRpbWUgdG8gZXhwbG9yZSBOZXcgWW9yayBieSB0aGVtIHNlbHZlcyBvciBpbiBzbWFsbGVyIGdyb3VwcyAoc2VsZi1vcmdhbml6ZWQpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIGNhbiBiZSBmb3VuZCBoZXJlOiBbaHR0cHM6Ly9ycHVicy5jb20vanljaC9hdWRpb2V4cGxvcmVyczIwMjNdKGh0dHBzOi8vcnB1YnMuY29tL2p5Y2gvYXVkaW9leHBsb3JlcnMyMDIzKXt0YXJnZXQ9Il9ibGFuayJ9IA0KPGJyPg0KVGh1cywgd2Ugd2lsbCBleGFtaW5lIGhvdyB3ZWxsIHRoZSBHUFMgZGlzdGFuY2UgY2xhc3NpZnkgaWYgdGhlIHN0dWRlbnRzIGFyZSB0b2dldGhlciBhbmQgcGFydGljaXBhdGluZyBpbiBhbiBldmVudCBvciBub3QuICANCjxicj4NClRvIGRvIHRoaXMsIHdlIHdpbGwgYXNzZXNzOg0KDQojIyMjIEF2ZXJhZ2UgZGlzdGFuY2UgYmV0d2VlbiBhbGwgc3R1ZGVudHMuIA0KDQpBcyBHUFMgaXMgbm9pc3kgKGVzcGVjaWFsbHkgYXJvdW5kIGFuZCBpbnNpZGUgYnVpbGRpbmdzKSwgd2UgZXhwZWN0IHRoYXQgdGhlIGF2ZXJhZ2UgZGlzdGFuY2Ugd2lsbCBiZSBhIGdvb2QgZ3JvdXAgcHJveGltaXR5IG1lYXN1cmUuICANCg0KIyMjIyBEaXN0YW5jZSBiZXR3ZWVuIHNlbGVjdGVkIHBhaXJzLiANCg0KSS5lLiwgZG8gdGhlIGNvbnRpbnVvdXMgZGlzdGFuY2UgYmV0d2VlbiBwYWlycyBwcmVkaWN0IHRvZ2V0aGVybmVzcyB0aHJvdWdob3V0IHRoZSBkYXkgKGR1cmluZyBldmVudHMgKyBzcGFyZSB0aW1lKT8gDQoNCiMjIFByZS1wcm9jZXNzaW5nDQoNClByaW9yIHRvIGNvbXB1dGluZyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBHUFMgY29vcmRpbmF0ZXMgaW4gbWV0ZXJzLCB3ZSByZW1vdmUgZXJyb25lb3VzIEdQUyBsb2dzICh2YWx1ZXMgZXh0cmVtZSBjb21wYXJlZCB0byBtZWRpYW5zKS4gVGhlbiwgd2UgYWdncmVnYXRlIGRhdGEgYWNyb3NzIDEgbWludXRlIGludGVydmFscyAoaS5lLiwgYWNyb3NzIDMgZGF0YSBwb2ludHMpLiBOZXh0LCBmb3IgZWFjaCAxLW1pbiBhdmVyYWdlLCB0aGUgbXV0dWFsIGRpc3RhbmNlIGJldHdlZW4gYWxsIHN0dWRlbnRzIGFyZSBjb21wdXRlZCAodXNpbmcgImdlb3NwaGVyZSIgUiBwYWNrYWdlKSBhbmQgYXZlcmFnZWQuICANCg0KYGBge3IgZGF0YW1hbmdsaW5nfQ0Kc2V0d2QoJ0M6L1VzZXJzL2p5Y2gvRGVtYW50LytUZWFtIEF1ZGlvIEV4cGxvcmVyIDIwMjEgLSBkYXRhIGFuZCBjb21wZXRpdGlvbnMgLSBEb2N1bWVudHMvQ29kZS8nKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShtYXB2aWV3KQ0KbGlicmFyeShwbG90cml4KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZW1tZWFucykNCmxpYnJhcnkoZ2Vvc3BoZXJlKQ0KDQp0aGVtZV9zZXQodGhlbWVfcHVicigpKQ0KbG9hZCgnQzovVXNlcnMvanljaC9EZW1hbnQvK1RlYW0gQXVkaW8gRXhwbG9yZXIgMjAyMSAtIGRhdGEgYW5kIGNvbXBldGl0aW9ucyAtIERvY3VtZW50cy9EYXRhL0F1Z3VzdDIwMjMuUmRhdGEnKQ0KZGYuZ2FybWluJEhvdXIgPC0gaG91cihkZi5nYXJtaW4kVGltZXN0YW1wKQ0KZGYuZ2FybWluJERhdGUgPC0gZGF0ZShkZi5nYXJtaW4kVGltZXN0YW1wKQ0KZGYuZ2FybWluIDwtIGRmLmdhcm1pbltkZi5nYXJtaW4kSUQhPSdGcmFueicsXQ0KZGYuZ2FybWluJHJUaW1lIDwtIGNlaWxpbmdfZGF0ZShkZi5nYXJtaW4kVGltZXN0YW1wLCcxIG1pbnV0ZXMnKQ0KZGYuZ2FybWluJERheXMgPC0gZGF0ZShkZi5nYXJtaW4kclRpbWUpDQpjb2xzID0gYygnIzJkYjdjNScsJyNjNzAxN2YnKQ0KYGBgDQoNCg0KYGBge3IgdGltZXNlcmllcyBjb21wLGVjaG89RkFMU0V9DQpkYXRhdG1wIDwtIGRmLmdhcm1pbltkYXRlKGRmLmdhcm1pbiRyVGltZSk+JzIwMjMtMDgtMzAnICYNCiAgICAgICAgICAgICAgICAgICAgIGRhdGUoZGYuZ2FybWluJHJUaW1lKTwnMjAyMy0wOS0wNCcgJiANCiAgICAgICAgICAgICAgICAgICAgICAgZGYuZ2FybWluJEhvdXI+NyAmDQogICAgICAgICAgICAgICAgICAgICAgIGRmLmdhcm1pbiRJRCE9J1ZpbmNlbnQnLF0NCg0KZGYucGxvdC5uZiA8LSBhZ2dyZWdhdGUoTkYuZEJBfnJUaW1lK0V2ZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGF0bXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlVOPWZ1bmN0aW9uKHgpbWVkaWFuKHgsbmEucm09VCkpDQoNCmRmLnBsb3Quc3BsIDwtIGFnZ3JlZ2F0ZShTUEwuZEJBfnJUaW1lK0V2ZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGF0bXAsDQogICAgICAgICAgICAgICAgICAgICAgICAgRlVOPWZ1bmN0aW9uKHgpbWVkaWFuKHgsbmEucm09VCkpDQoNCmRmLnBsb3QuaHIgPC0gYWdncmVnYXRlKGJlYXRzUGVyTWludXRlfnJUaW1lK0V2ZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YXRtcCwNCiAgICAgICAgICAgICAgICAgICAgICAgIEZVTj1mdW5jdGlvbih4KW1lYW4oeCxuYS5ybT1UKSkNCg0KDQpkZi5wbG90Lm5mIDwtIGRmLnBsb3QubmYgJT4lDQogIG11dGF0ZSh4ID0gaG91cihyVGltZSkgKyBtaW51dGUoclRpbWUpLzYwICsgc2Vjb25kKHJUaW1lKS8zNjAwKQ0KZGYucGxvdC5ociA8LSBkZi5wbG90LmhyICU+JQ0KICBtdXRhdGUoeCA9IGhvdXIoclRpbWUpICsgbWludXRlKHJUaW1lKS82MCArIHNlY29uZChyVGltZSkvMzYwMCkNCg0KZGYucGxvdC5uZiRFdmVudHNOIDwtIGFzLmZhY3RvcihkZi5wbG90Lm5mJEV2ZW50cykNCmxldmVscyhkZi5wbG90Lm5mJEV2ZW50c04pIDwtIDE6bGVuZ3RoKGxldmVscyhkZi5wbG90Lm5mJEV2ZW50c04pKQ0KZGYucGxvdC5uZiRFdmVudHNOIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmLnBsb3QubmYkRXZlbnRzTikpDQoNCmRmLnBsb3QubmYkRXZlbnRzU2VsIDwtIDANCmRmLnBsb3QubmYkRXZlbnRzU2VsW3doaWNoKGRpZmYoYygwLGRmLnBsb3QubmYkRXZlbnRzTikpIT0wKSsxXSA8LSAxDQoNCg0KcDEgPC0gZ2dwbG90KCkrDQogIGdlb21fcG9pbnQoZGF0YT1kZi5wbG90Lm5mLGFlcyh4PXgseT1ORi5kQkEpLGFscGhhPTAuNSxjb2xvcj1jb2xzWzFdLHNpemU9MSkrDQogIGdlb21fcG9pbnQoZGF0YT1kZi5wbG90LmhyLGFlcyh4PXgseT1iZWF0c1Blck1pbnV0ZSksYWxwaGE9MC41LGNvbG9yPWNvbHNbMl0sc2l6ZT0xKSsNCiAgdGhlbWVfbGlnaHQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgICMgRmVhdHVyZXMgb2YgdGhlIGZpcnN0IGF4aXMNCiAgICBuYW1lID0gIk5vaXNlIGZsb29yIGxldmVsIChkQikiLGxpbWl0cyA9IGMoNTAsMTEwKSwNCiAgICAjIEFkZCBhIHNlY29uZCBheGlzIGFuZCBzcGVjaWZ5IGl0cyBmZWF0dXJlcw0KICAgIHNlYy5heGlzID0gc2VjX2F4aXMoIHRyYW5zPX4uLzEsIG5hbWU9IkhlYXJ0IHJhdGUgKGJwbSkiKQ0KICApKw0KICB0aGVtZShheGlzLnRpdGxlLnkucmlnaHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSBjb2xzWzJdKSkrDQogIHRoZW1lKGF4aXMudGl0bGUueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gY29sc1sxXSkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPSJsZWZ0IiwgDQogICAgICAgIGxlZ2VuZC5ib3guc3BhY2luZyA9IHVuaXQoMCwgInB0IiksDQogICAgICAgIGF4aXMudGlja3MueS5yaWdodCA9IGVsZW1lbnRfbGluZShjb2xvciA9IGNvbHNbMl0pLA0KICAgICAgICBheGlzLnRleHQueS5yaWdodCA9IGVsZW1lbnRfdGV4dChjb2xvciA9IGNvbHNbMl0pLA0KICAgICAgICBheGlzLnRpY2tzLnkubGVmdCAgPSBlbGVtZW50X2xpbmUoY29sb3IgPSBjb2xzWzFdKSwNCiAgICAgICAgYXhpcy50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChjb2xvciA9IGNvbHNbMV0pKSsNCiAgbGFicyh4PScnKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoOCwyNCksYnJlYWtzID0gc2VxKDgsMjQsMiksbGFiZWxzID0gcGFzdGUoc2VxKDgsMjQsMiksJzowMCcsc2VwID0gIiIpKSsNCiAgZ3JpZHMoJ3h5JykrDQogZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZi5wbG90Lm5mW2RmLnBsb3QubmYkRXZlbnRzU2VsPT0xJmRmLnBsb3QubmYkRXZlbnRzIT0nTm90IGtub3duJyxdLCBhZXMobGFiZWwgPSBFdmVudHMseD14LHk9TkYuZEJBLGNvbG9yPUV2ZW50cyksZm9udGZhY2UgPSAiYm9sZCIsbWF4Lm92ZXJsYXBzID0gODAsZm9yY2UgPSA4LG51ZGdlX3kgPSAtMTAsYWxwaGE9MSxzaXplPTMpKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBkZi5wbG90Lm5mW2RmLnBsb3QubmYkRXZlbnRzU2VsPT0xJmRmLnBsb3QubmYkRXZlbnRzIT0nTm90IGtub3duJyxdLCBhZXMoeGludGVyY2VwdD14LGNvbG9yPUV2ZW50cyksYWxwaGE9MSxsaW5ldHlwZT0nZGFzaGVkJykrDQogIGZhY2V0X3dyYXAofmRhdGUoclRpbWUpLHNjYWxlcz0nZnJlZV94JyxuY29sPTEpKw0KICBndWlkZXMoY29sb3I9J25vbmUnKQ0KDQoNCmBgYA0KDQpgYGB7ciBwcm94eSBkb3NlIGNvbXAsZWNobz1GQUxTRX0NCmRhdGF0bXAgPC0gZGYuZ2FybWluW2RhdGUoZGYuZ2FybWluJHJUaW1lKT4nMjAyMy0wOC0zMCcgJg0KICAgICAgICAgICAgICAgICAgICAgZGF0ZShkZi5nYXJtaW4kclRpbWUpPCcyMDIzLTA5LTA0JyAmIA0KICAgICAgICAgICAgICAgICAgICAgICBkZi5nYXJtaW4kSG91cj43ICYNCiAgICAgICAgICAgICAgICAgICAgICAgZGYuZ2FybWluJElEIT0nVmluY2VudCcsXQ0KDQojIGZpbHRlciBOQSBHUFMNCmRhdGF0bXAkbGF0aXR1ZGVbZGF0YXRtcCRsYXRpdHVkZTwzMF0gPC0gTkENCmRhdGF0bXAkbG9uZ2l0dWRlW2RhdGF0bXAkbG9uZ2l0dWRlPigtMTApXSA8LSBOQQ0KDQoNCmRmLmdwcyA8LSBhZ2dyZWdhdGUoLn5yVGltZStJRCtFdmVudHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhdG1wW2MoJ3JUaW1lJywnSUQnLCdsYXRpdHVkZScsJ2xvbmdpdHVkZScsJ0V2ZW50cycpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGVU49ZnVuY3Rpb24oeCltZWRpYW4oeCxuYS5ybT1UKSkNCg0KDQpkZi5ncHMkRG0gPC0gTkENCmRmLmdwcyRWbSA8LSBOQQ0KZm9yKGkgaW4gMTpkaW0oZGYuZ3BzKVsxXSl7DQogDQogdG1wIDwtIGRmLmdwc1tkZi5ncHMkclRpbWU9PWRmLmdwcyRyVGltZVtpXSxdIA0KIGxvbmdpdHVkZSA8LSBkZi5ncHMkbG9uZ2l0dWRlW2ldDQogbGF0aXR1ZGUgPC0gZGYuZ3BzJGxhdGl0dWRlW2ldDQogDQogZCA8LSBOVUxMDQogZm9yKGlpIGluIDE6ZGltKHRtcClbMV0pew0KICBsb25naXR1ZGUyIDwtIHRtcCRsb25naXR1ZGVbaWldDQogIGxhdGl0dWRlMiA8LSB0bXAkbGF0aXR1ZGVbaWldDQogIGQgPC0gYyhkLGRpc3RtKGMobG9uZ2l0dWRlLCBsYXRpdHVkZSksIGMobG9uZ2l0dWRlMiwgbGF0aXR1ZGUyKSwgZnVuID0gZGlzdEdlbykpDQogfQ0KIA0KIGRbZD4zMDAwMF0gPC0gTkENCiBkW2Q9PTBdIDwtIE5BDQogZGYuZ3BzJERtW2ldIDwtIG1lYW4oZCxuYS5ybT1UKQ0KDQp9DQoNCmRmLmdwcyA8LSBkZi5ncHMgJT4lDQogIG11dGF0ZSh4ID0gaG91cihyVGltZSkgKyBtaW51dGUoclRpbWUpLzYwICsgc2Vjb25kKHJUaW1lKS8zNjAwKQ0KDQpkZi5ncHMucGxvdCA8LSBhZ2dyZWdhdGUoRG1+clRpbWUrRXZlbnRzLEZVTj1mdW5jdGlvbih4KW1lZGlhbih4LG5hLnJtPVQpLGRhdGE9ZGYuZ3BzWyxjKCdyVGltZScsJ0RtJywnRXZlbnRzJyldKQ0KZGYuZ3BzLnBsb3QkU0UgPC0gYWdncmVnYXRlKERtfnJUaW1lK0V2ZW50cyxGVU49ZnVuY3Rpb24oeClzdGQuZXJyb3IoeCxuYS5ybT1UKSxkYXRhPWRmLmdwc1ssYygnclRpbWUnLCdEbScsJ0V2ZW50cycpXSkkRG0NCg0KZGYuZ3BzLnBsb3QgPC0gZGYuZ3BzLnBsb3QgJT4lDQogIG11dGF0ZSh4ID0gaG91cihyVGltZSkgKyBtaW51dGUoclRpbWUpLzYwICsgc2Vjb25kKHJUaW1lKS8zNjAwKQ0KDQpkZi5ncHMucGxvdCRFdmVudHNOIDwtIGFzLmZhY3RvcihkZi5ncHMucGxvdCRFdmVudHMpDQpsZXZlbHMoZGYuZ3BzLnBsb3QkRXZlbnRzTikgPC0gMTpsZW5ndGgobGV2ZWxzKGRmLmdwcy5wbG90JEV2ZW50c04pKQ0KZGYuZ3BzLnBsb3QkRXZlbnRzTiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZi5ncHMucGxvdCRFdmVudHNOKSkNCmRmLmdwcy5wbG90JEV2ZW50c1NlbCA8LSAwDQpkZi5ncHMucGxvdCRFdmVudHNTZWxbd2hpY2goZGlmZihjKDAsZGYuZ3BzLnBsb3QkRXZlbnRzTikpIT0wKSsxXSA8LSAxDQoNCg0KcDIgPC0gZ2dwbG90KCkrDQogIGdlb21fY29sKGRhdGE9ZGYuZ3BzLnBsb3QsYWVzKHg9eCx5PURtKSxmaWxsPSdncmV5NjAnLGFscGhhPTAuOCkrDQogIGdlb21fY29sKGRhdGE9ZGYuZ3BzLnBsb3QsYWVzKHg9eCx5PShEbStTRSkpLGZpbGw9J2dyZXk2MCcsYWxwaGE9MC4yKSsNCiAgdGhlbWVfbGlnaHQoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55LmxlZnQgPSBlbGVtZW50X3RleHQoKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIiwNCiAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249ImxlZnQiLCANCiAgICAgICAgbGVnZW5kLmJveC5zcGFjaW5nID0gdW5pdCgwLCAicHQiKSkrDQogIGxhYnMoeD0nJyx5PSdHcm91cCBwcm94aW1pdHkgKG11dHVhbCBkaXN0YW5jZSwgbWV0ZXJzKScpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyg4LDI0KSxicmVha3MgPSBzZXEoOCwyNCwyKSxsYWJlbHMgPSBwYXN0ZShzZXEoOCwyNCwyKSwnOjAwJyxzZXAgPSAiIikpKw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmLmdwcy5wbG90W2RmLmdwcy5wbG90JEV2ZW50c1NlbD09MSxdLCBhZXMobGFiZWwgPSBFdmVudHMseD14LHk9RG0sY29sb3I9RXZlbnRzKSxmb250ZmFjZSA9ICJib2xkIixtYXgub3ZlcmxhcHMgPSA4MCxmb3JjZSA9IDgsbnVkZ2VfeSA9IDkwMDAsYWxwaGE9MSxzaXplPTMpKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBkZi5ncHMucGxvdFtkZi5ncHMucGxvdCRFdmVudHNTZWw9PTEsXSwgYWVzKHhpbnRlcmNlcHQ9eCxjb2xvcj1FdmVudHMpLGFscGhhPTEsbGluZXR5cGU9J2Rhc2hlZCcpKw0KICBncmlkcygneHknKSsNCiAgZmFjZXRfd3JhcCh+ZGF0ZShyVGltZSksc2NhbGVzPSdmcmVlX3gnLG5jb2w9MSkrDQogIGd1aWRlcyhjb2xvcj0nbm9uZScsZmlsbD0nbm9uZScpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCxtYXgoZGYuZ3BzLnBsb3QkRG0pKSkNCg0KYGBgDQoNCmBgYHtyIHByb3h5IGRvc2UgMiBjb21wLGVjaG89RkFMU0V9DQpkZi5nYXJtaW4kclRpbWUgPC0gcm91bmRfZGF0ZShkZi5nYXJtaW4kVGltZXN0YW1wLCcxIG1pbnV0ZXMnKQ0KZGF0YXRtcCA8LSBkZi5nYXJtaW5bZGF0ZShkZi5nYXJtaW4kclRpbWUpPicyMDIzLTA4LTMwJyAmDQogICAgICAgICAgICAgICAgICAgICBkYXRlKGRmLmdhcm1pbiRyVGltZSk8JzIwMjMtMDktMDQnICYgDQogICAgICAgICAgICAgICAgICAgICBkZi5nYXJtaW4kSG91cj43ICYgDQogICAgICAgICAgICAgICAgICAgICAoZGYuZ2FybWluJElEPT0nR2VvcmdlJyB8DQogICAgICAgICAgICAgICAgICAgICBkZi5nYXJtaW4kSUQ9PSdFbWlsJyksXQ0KDQojIGZpbHRlciBOQSBHUFMNCmRhdGF0bXAkbGF0aXR1ZGVbZGF0YXRtcCRsYXRpdHVkZTwzMF0gPC0gTkENCmRhdGF0bXAkbG9uZ2l0dWRlW2RhdGF0bXAkbG9uZ2l0dWRlPigtMTApXSA8LSBOQQ0KDQoNCmRmLmdwcyA8LSBhZ2dyZWdhdGUoLn5yVGltZStJRCtFdmVudHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhdG1wW2MoJ3JUaW1lJywnSUQnLCdsYXRpdHVkZScsJ2xvbmdpdHVkZScsJ0V2ZW50cycpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGVU49ZnVuY3Rpb24oeCltZWRpYW4oeCxuYS5ybT1UKSkNCg0KZGYuZ3BzJERtIDwtIE5BDQpkZi5ncHMkVm0gPC0gTkENCmZvcihpIGluIDE6ZGltKGRmLmdwcylbMV0pew0KIA0KIHRtcCA8LSBkZi5ncHNbZGYuZ3BzJHJUaW1lPT1kZi5ncHMkclRpbWVbaV0sXSANCiBsb25naXR1ZGUgPC0gZGYuZ3BzJGxvbmdpdHVkZVtpXQ0KIGxhdGl0dWRlIDwtIGRmLmdwcyRsYXRpdHVkZVtpXQ0KIA0KIGQgPC0gTlVMTA0KIGZvcihpaSBpbiAxOmRpbSh0bXApWzFdKXsNCiAgbG9uZ2l0dWRlMiA8LSB0bXAkbG9uZ2l0dWRlW2lpXQ0KICBsYXRpdHVkZTIgPC0gdG1wJGxhdGl0dWRlW2lpXQ0KICBkIDwtIGMoZCxkaXN0bShjKGxvbmdpdHVkZSwgbGF0aXR1ZGUpLCBjKGxvbmdpdHVkZTIsIGxhdGl0dWRlMiksIGZ1biA9IGRpc3RHZW8pKQ0KIH0NCiANCiBkW2Q+MzAwMDBdIDwtIE5BDQogZFtkPT0wXSA8LSBOQQ0KIGRmLmdwcyREbVtpXSA8LSBtZWFuKGQsbmEucm09VCkNCg0KfQ0KDQpkZi5ncHMgPC0gZGYuZ3BzICU+JQ0KICBtdXRhdGUoeCA9IGhvdXIoclRpbWUpICsgbWludXRlKHJUaW1lKS82MCArIHNlY29uZChyVGltZSkvMzYwMCkNCg0KDQpkZi5ncHMkRXZlbnRzTiA8LSBhcy5mYWN0b3IoZGYuZ3BzJEV2ZW50cykNCmxldmVscyhkZi5ncHMkRXZlbnRzTikgPC0gMTpsZW5ndGgobGV2ZWxzKGRmLmdwcyRFdmVudHNOKSkNCmRmLmdwcyRFdmVudHNOIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmLmdwcyRFdmVudHNOKSkNCmRmLmdwcyRFdmVudHNTZWwgPC0gMA0KZGYuZ3BzJEV2ZW50c1NlbFt3aGljaChkaWZmKGMoMCxkZi5ncHMkRXZlbnRzTikpIT0wKSsxXSA8LSAxDQoNCg0KcDMgPC0gZ2dwbG90KCkrDQogIGdlb21fY29sKGRhdGE9ZGYuZ3BzLGFlcyh4PXgseT1EbSksZmlsbD0nZ3JleTYwJyxhbHBoYT0wLjgpKw0KICB0aGVtZV9saWdodCgpKw0KICB0aGVtZShheGlzLnRpdGxlLnkubGVmdCA9IGVsZW1lbnRfdGV4dCgpKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj0ibGVmdCIsIA0KICAgICAgICBsZWdlbmQuYm94LnNwYWNpbmcgPSB1bml0KDAsICJwdCIpKSsNCiAgbGFicyh4PScnLHk9J1BhaXIgcHJveGltaXR5IChtdXR1YWwgZGlzdGFuY2UsIG1ldGVycyknKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoOCwyNCksYnJlYWtzID0gc2VxKDgsMjQsMiksbGFiZWxzID0gcGFzdGUoc2VxKDgsMjQsMiksJzowMCcsc2VwID0gIiIpKSsNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZi5ncHNbZGYuZ3BzJEV2ZW50c1NlbD09MSZkZi5ncHMkRXZlbnRzIT0nTm90IGtub3duJyxdLCBhZXMobGFiZWwgPSBFdmVudHMseD14LHk9RG0sY29sb3I9RXZlbnRzKSxmb250ZmFjZSA9ICJib2xkIixtYXgub3ZlcmxhcHMgPSA4MCxmb3JjZSA9IDgsbnVkZ2VfeSA9IDEwMDAwLGFscGhhPTEsc2l6ZT0zKSsNCiAgZ2VvbV92bGluZShkYXRhID0gZGYuZ3BzW2RmLmdwcyRFdmVudHNTZWw9PTEmZGYuZ3BzJEV2ZW50cyE9J05vdCBrbm93bicsXSwgYWVzKHhpbnRlcmNlcHQ9eCxjb2xvcj1FdmVudHMpLGFscGhhPTEsbGluZXR5cGU9J2Rhc2hlZCcpKw0KICBncmlkcygneHknKSsNCiAgZmFjZXRfd3JhcCh+ZGF0ZShyVGltZSksc2NhbGVzPSdmcmVlX3gnLG5jb2w9MSkrDQogIGd1aWRlcyhjb2xvcj0nbm9uZScsZmlsbD0nbm9uZScpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxNTAwMCkpDQoNCmBgYA0KDQpgYGB7ciBwbG90IGFsaWduLGVjaG89RkFMU0V9DQpwIDwtIGFsaWduX3BhdGNoZXMocDEscDIscDMpDQpgYGANCg0KIyMgRGF0YSB2aXN1YWxpemF0aW9ucw0KDQojIyMgTm9pc2UgYW5kIGhlYXJ0IHJhcnRlDQoNCkZpcnN0LCB3ZSBpbnNwZWN0IHRoZSBsb2dnZWQgbWVhbiBub2lzZSBmbG9vciBhbmQgaGVhcnQgcmF0ZS4gIA0KDQpgYGB7ciBwbG90IDEsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEwLGRwaT0xMjAwfQ0KcGxvdChwW1sxXV0pDQpgYGANCg0KIyMjIEdyb3VwIHByb3hpbWl0eQ0KDQpOZXh0LCB3ZSBpbnNwZWN0IHRoZSBncm91cCBwcm94aW1pdHkuIFRoYXQgaXMsIHRoZSBhdmVyYWdlIG11dHVhbCBkaXN0YW5jZSAoaW4gbWV0ZXJzKSBiZXR3ZWVuIGFsbCBzdHVkZW50cy4gQXMgc2VlbiwgdGhlIGRpc3RhbmNlIGJldHdlZW4gc3R1ZGVudHMgcmlzZSBhbmQgaXMgaGlnaGVzdCBmb3IgIkZyZWUgdGltZSIsICJCdXMiLCAiQ29uZXkgSXNsYW5kIiwgYW5kICJXYWxrIiwgd2hpY2ggYXJlIGFsbCBldmVudHMgd2hlcmUgdGhlIHN0dWRlbnRzIGFyZSBzY2F0dGVyZWQuIEF0IHRoZSBzYW1lIHRpbWUsIHByb3hpbWl0eSBpcyBoaWdoZXN0IChsb3dlc3QgbXV0dWFsIGRpc3RhbmNlKSBmb3IgIkRpbm5lciIgYW5kIHZhcmlvdXMgcHJlc2VudGF0aW9ucyB3aGVyZSBhbGwgc3R1ZGVudHMgd2VyZSB0b2dldGhlci4gIA0KDQpgYGB7ciBwbG90IDIsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEwLGRwaT0xMjAwfQ0KcGxvdChwW1syXV0pDQpgYGANCg0KIyMjIFBhaXIgcHJveGltaXR5DQoNCkZpbmFsbHksIHdlIGZvY3VzIG9uIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGEgc2VsZWN0ZWQgcGFpciBvZiB0aGUgc3R1ZGVudHMuIEFnYWluLCB0aGUgZGlzdGFuY2UgbWVhc3VyZSBzZWVtcyB0byBiZSBhIGdvb2QgcHJveHkgZm9yIHByb3hpbWl0eSBhY3Jvc3MgdGhlIGRheXMuIA0KDQpgYGB7ciBwbG90IDMsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEwLGRwaT0xMjAwfQ0KcGxvdChwW1szXV0pDQpgYGANCg==