I read an existing blog on Ford GoBike and given the fact that their data was freely available online i decided to try my hand to replicate and learn on exploring the data and drive some insights. The insights could be same as the blog i read but its a learning experience to work with huge data.

Lets put some few questions,assumptions and see how the data relates with them.

  1. Which start_station_name get most rides?
  2. Which end_station_name ends most rides?
  3. Are start and end stations the same?
  4. Whats the average duration of the rental?
  5. Which hours get peak rentals?
  6. Any relation of hours with start_station_name?
  7. What type of users hire ebikes?
  8. What are the ages of the users?
  9. What is the relation of bike rentals with gender?
  10. Are there specific hours that have peak rentals?
  11. How to peak hours and start_station_name related?
  12. Is there any relation of gender with peak hours?

There are 519700 rows in the data set with following columns.

 [1] "duration_sec"            "start_time"              "end_time"                "start_station_id"        "start_station_name"     
 [6] "start_station_latitude"  "start_station_longitude" "end_station_id"          "end_station_name"        "end_station_latitude"   
[11] "end_station_longitude"   "bike_id"                 "user_type"               "member_birth_year"       "member_gender"          
## lets get the day/week/month/year/hh for start time and end time
df_2017<-df_2017%>%
  mutate(start_date=ymd_hms(start_time), end_date=ymd_hms(end_time), duration_min = duration_sec / 60)

  1. Which start_station_name get most rides?

Comment:

We see that the “touristy”" places have more rentals along with the Caltrain/BART stations. This is expected since SF is always filled with tourists and what better way to see SF!


  1. Which end_station_name ends most rides?

Comment:

It looks like rentals are ending near train stations and folks are exiting the city either on trains or could be using their parking garages as well. So, what does this mean? Are folks coming into SF via trains , walking a bit to Embarcadero/Powell before renting their bikes and returning it back to the train stations before riding out? That does not look correct since the Ford ebikes rentals is $2 for 30 minutes with $3 for each additional 15 minutes.

Lets plot both charts side by side and view.


  1. Are start and end stations the same?

Comment: So 96% of the time we have rentals starting BUT not ending at the starting station!! This either could be folks taking a rental from train station and ending at their workplace OR tourists taking from point A to point B.


  1. Whats the average duration of the rental?

Comment: Most of the rides are less than 10 mins so likely office commuters.


  1. Which hours get peak rentals?

Comment:

The rentals look to be in favor of working commute with 7-8AM, 4-5PM having the highest peak.


  1. Any relation of hours with start_station_name?

In order to work on this we will categorize the hours into the following brackets 0-6, 7-11 ,12-16 ,17-23

Comment:

As expected all train stations have the high rentals during commute hours. Powell and Market surprisingly do not have any starts during commute except the evenings. These could be folks working outside SF and are returning back via BART and using the rentals to go home.


LS0tCnRpdGxlOiAiRm9yZCBlLWJpa2VzIGFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpJIHJlYWQgYW4gZXhpc3RpbmcgW2Jsb2ddKGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL2V4cGxvcmluZy1zYW4tZnJhbmNpc2NvLWJheS1hcmVhcy1iaWtlLXNoYXJlLXN5c3RlbS8pIG9uIEZvcmQgR29CaWtlIGFuZCBnaXZlbiB0aGUgZmFjdCB0aGF0IHRoZWlyIGRhdGEgd2FzIGZyZWVseSBhdmFpbGFibGUgb25saW5lIGkgZGVjaWRlZCB0byB0cnkgbXkgaGFuZCB0byByZXBsaWNhdGUgYW5kIGxlYXJuIG9uIGV4cGxvcmluZyB0aGUgZGF0YSBhbmQgZHJpdmUgc29tZSBpbnNpZ2h0cy4KVGhlIGluc2lnaHRzIGNvdWxkIGJlIHNhbWUgYXMgdGhlIGJsb2cgaSByZWFkIGJ1dCBpdHMgYSBsZWFybmluZyBleHBlcmllbmNlIHRvIHdvcmsgd2l0aCBodWdlIGRhdGEuCgpMZXRzIHB1dCBzb21lIGZldyBxdWVzdGlvbnMsYXNzdW1wdGlvbnMgYW5kIHNlZSBob3cgdGhlIGRhdGEgcmVsYXRlcyB3aXRoIHRoZW0uCgoxLiBXaGljaCBzdGFydF9zdGF0aW9uX25hbWUgZ2V0IG1vc3QgcmlkZXM/CjIuIFdoaWNoIGVuZF9zdGF0aW9uX25hbWUgZW5kcyBtb3N0IHJpZGVzPwozLiBBcmUgc3RhcnQgYW5kIGVuZCBzdGF0aW9ucyB0aGUgc2FtZT8KNC4gV2hhdHMgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgdGhlIHJlbnRhbD8KNS4gV2hpY2ggaG91cnMgZ2V0IHBlYWsgcmVudGFscz8KNi4gQW55IHJlbGF0aW9uIG9mIGhvdXJzIHdpdGggc3RhcnRfc3RhdGlvbl9uYW1lPwo3LiBXaGF0IHR5cGUgb2YgdXNlcnMgaGlyZSBlYmlrZXM/CjguIFdoYXQgYXJlIHRoZSBhZ2VzIG9mIHRoZSB1c2Vycz8KOS4gV2hhdCBpcyB0aGUgcmVsYXRpb24gb2YgYmlrZSByZW50YWxzIHdpdGggZ2VuZGVyPwoxMC4gQXJlIHRoZXJlIHNwZWNpZmljIGhvdXJzIHRoYXQgaGF2ZSBwZWFrIHJlbnRhbHM/CjExLiBIb3cgdG8gcGVhayBob3VycyBhbmQgc3RhcnRfc3RhdGlvbl9uYW1lIHJlbGF0ZWQ/CjEyLiBJcyB0aGVyZSBhbnkgcmVsYXRpb24gb2YgZ2VuZGVyIHdpdGggcGVhayBob3Vycz8KCgpgYGB7ciBlY2hvPUYsIGluY2x1ZGU9Rn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KHNjYWxlcykKCmRmXzIwMTc8LWZyZWFkKCIvVXNlcnMvdmljaHVyaS9WSU5BWS9EQVRBX1NFVFMvZm9yZGdvYmlrZS1kYXRhLzIwMTctZm9yZGdvYmlrZS10cmlwZGF0YS5jc3YiLHNlcD0iLCIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGLGhlYWRlciA9IFQpCgpzdGFydF9lbmRfbWF0Y2hlczwtZGZfMjAxNyU+JQogIGZpbHRlcihzdGFydF9zdGF0aW9uX2lkPT1lbmRfc3RhdGlvbl9pZCklPiUKICBucm93KCkKCnN0YXJ0X2VuZF9ub19tYXRjaGVzPC1kZl8yMDE3JT4lCiAgZmlsdGVyKHN0YXJ0X3N0YXRpb25faWQhPWVuZF9zdGF0aW9uX2lkKSU+JQogIG5yb3coKQoKCmBgYAoKKioqKgoKCiMjIyMgVGhlcmUgYXJlIGByIGRmXzIwMTclPiVucm93KCkgYCByb3dzIGluIHRoZSBkYXRhIHNldCB3aXRoIGZvbGxvd2luZyBjb2x1bW5zLgoKYGBge3IgZWNobz1GfQoKbmFtZXMoZGZfMjAxNykKCgpgYGAKCmBgYHtyfQojIyBsZXRzIGdldCB0aGUgZGF5L3dlZWsvbW9udGgveWVhci9oaCBmb3Igc3RhcnQgdGltZSBhbmQgZW5kIHRpbWUKZGZfMjAxNzwtZGZfMjAxNyU+JQogIG11dGF0ZShzdGFydF9kYXRlPXltZF9obXMoc3RhcnRfdGltZSksIGVuZF9kYXRlPXltZF9obXMoZW5kX3RpbWUpLCBkdXJhdGlvbl9taW4gPSBkdXJhdGlvbl9zZWMgLyA2MCkKCmBgYAoKKioqKgoKMS4gV2hpY2ggc3RhcnRfc3RhdGlvbl9uYW1lIGdldCBtb3N0IHJpZGVzPwoKCmBgYHtyIGVjaG89RiwgZmlnLndpZHRoPTV9CnRlbXBfZGY8LWRmXzIwMTclPiUKICBjb3VudChzdGFydF9zdGF0aW9uX25hbWUsc29ydD1UKSU+JQogIGhlYWQoMjApCgpwMTwtZ2dwbG90KHRlbXBfZGYsYWVzKHJlb3JkZXIoc3RhcnRfc3RhdGlvbl9uYW1lLG4pLG4pKSsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKwogIGxhYnModGl0bGU9InN0YXJ0X3N0YXRpb25fbmFtZSwgd2l0aCBoaWdoZXN0IHJpZGVzICIsIHN1YnRpdGxlPSJUb3AgMjAiLCB4PSJTdGFydCBzdGF0aW9ucyIseT0iVG90YWwgcmlkZXMiKSsKICBjb29yZF9mbGlwKCkKCnAxCmBgYAoqKkNvbW1lbnQ6KioKCldlIHNlZSB0aGF0IHRoZSAidG91cmlzdHkiIiBwbGFjZXMgaGF2ZSBtb3JlIHJlbnRhbHMgYWxvbmcgd2l0aCB0aGUgQ2FsdHJhaW4vQkFSVCBzdGF0aW9ucy4gVGhpcyBpcyBleHBlY3RlZCBzaW5jZSBTRiBpcyBhbHdheXMgZmlsbGVkIHdpdGggdG91cmlzdHMgYW5kIHdoYXQgYmV0dGVyIHdheSB0byBzZWUgU0YhCgoqKioqCjIuIFdoaWNoIGVuZF9zdGF0aW9uX25hbWUgZW5kcyBtb3N0IHJpZGVzPwoKYGBge3IgZWNobz1GLGZpZy53aWR0aD01fQp0ZW1wX2RmPC1kZl8yMDE3JT4lCiAgY291bnQoZW5kX3N0YXRpb25fbmFtZSxzb3J0PVQpJT4lCiAgaGVhZCgyMCkKCnAyPC1nZ3Bsb3QodGVtcF9kZixhZXMocmVvcmRlcihlbmRfc3RhdGlvbl9uYW1lLG4pLG4pKSsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKwogIGxhYnModGl0bGU9ImVuZF9zdGF0aW9uX25hbWUsIHdpdGggZW5kaW5nIHJpZGVzICIsIHN1YnRpdGxlPSJUb3AgMjAiLCB4PSJFbmQgc3RhdGlvbnMiLHk9IlRvdGFsIHJpZGVzIikrCiAgY29vcmRfZmxpcCgpCnAyCmBgYAoKKipDb21tZW50OioqCgpJdCBsb29rcyBsaWtlIHJlbnRhbHMgYXJlIGVuZGluZyBuZWFyIHRyYWluIHN0YXRpb25zIGFuZCBmb2xrcyBhcmUgZXhpdGluZyB0aGUgY2l0eSBlaXRoZXIgb24gdHJhaW5zIG9yIGNvdWxkIGJlIHVzaW5nIHRoZWlyIHBhcmtpbmcgZ2FyYWdlcyBhcyB3ZWxsLgpTbywgd2hhdCBkb2VzIHRoaXMgbWVhbj8KQXJlIGZvbGtzIGNvbWluZyBpbnRvIFNGIHZpYSB0cmFpbnMgLCB3YWxraW5nIGEgYml0IHRvIEVtYmFyY2FkZXJvL1Bvd2VsbCBiZWZvcmUgcmVudGluZyB0aGVpciBiaWtlcyBhbmQgcmV0dXJuaW5nIGl0IGJhY2sgdG8gdGhlIHRyYWluIHN0YXRpb25zIGJlZm9yZSByaWRpbmcgb3V0PwpUaGF0IGRvZXMgbm90IGxvb2sgY29ycmVjdCBzaW5jZSB0aGUgRm9yZCBlYmlrZXMgcmVudGFscyBpcyAkMiBmb3IgMzAgbWludXRlcyB3aXRoICQzIGZvciBlYWNoIGFkZGl0aW9uYWwgMTUgbWludXRlcy4KCkxldHMgcGxvdCBib3RoIGNoYXJ0cyBzaWRlIGJ5IHNpZGUgYW5kIHZpZXcuCgpgYGB7ciBlY2hvPUYsZmlnLndpZHRoPTV9CmdyaWQuYXJyYW5nZShwMSxwMixuY29sPTEpCmBgYAoKKioqKgozLiBBcmUgc3RhcnQgYW5kIGVuZCBzdGF0aW9ucyB0aGUgc2FtZT8KCmBgYHtyIGVjaG89Rn0KCgp0ZW1wX2RmPC1hcy5kYXRhLmZyYW1lKHJiaW5kKHN0YXJ0X2VuZF9tYXRjaGVzLHN0YXJ0X2VuZF9ub19tYXRjaGVzKSkKdGVtcF9kZiRjYXRnPXJvd25hbWVzKHRlbXBfZGYpCnRlbXBfZGYlPiUKICBtdXRhdGUocGVyYz1WMS9zdW0oVjEpKS0+dGVtcF9kZgoKcHJpbnQodGVtcF9kZiU+JXNlbGVjdChjYXRnLHBlcmMpKQoKYGBgCgoqKkNvbW1lbnQ6KioKU28gOTYlIG9mIHRoZSB0aW1lIHdlIGhhdmUgcmVudGFscyBzdGFydGluZyBCVVQgbm90IGVuZGluZyBhdCB0aGUgc3RhcnRpbmcgc3RhdGlvbiEhClRoaXMgZWl0aGVyIGNvdWxkIGJlIGZvbGtzIHRha2luZyBhIHJlbnRhbCBmcm9tIHRyYWluIHN0YXRpb24gYW5kIGVuZGluZyBhdCB0aGVpciB3b3JrcGxhY2UgT1IgdG91cmlzdHMgdGFraW5nIGZyb20gcG9pbnQgQSB0byBwb2ludCBCLgoKKioqKgoKNC4gV2hhdHMgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgdGhlIHJlbnRhbD8KCmBgYHtyIGVjaG89Riwgd2FybmluZz1GLCBmaWcud2lkdGg9NX0KZGZfMjAxNyU+JQogIGZpbHRlcihkdXJhdGlvbl9taW4gPjAgJiAhaXMubmEoZHVyYXRpb25fbWluKSklPiUKICBnZ3Bsb3QoYWVzKGR1cmF0aW9uX21pbikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGFscGhhID0gMC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSwgYnJlYWtzID0gc2VxKDAsIDEwMCwgYnkgPSAyKSkgKwogIGxhYnModGl0bGU9IkR1cmF0aW9uIG9mIFJpZGVzIix4PSJEdXJhdGlvbiIseT0iTnVtYmVyIG9mIHJpZGVzIikKCiAgCmBgYAoKKipDb21tZW50OioqCk1vc3Qgb2YgdGhlIHJpZGVzIGFyZSBsZXNzIHRoYW4gMTAgbWlucyBzbyBsaWtlbHkgb2ZmaWNlIGNvbW11dGVycy4KCioqKioKCjUuIFdoaWNoIGhvdXJzIGdldCBwZWFrIHJlbnRhbHM/CmBgYHtyIGVjaG89RiwgZmlnLndpZHRoPTR9CiMgbGV0cyBnZXQgYSBkZiB3aXRoIHN1bW1hcnkgb2YgaG91cnMuCnRlbXBfZGY8LWRmXzIwMTclPiUKICBtdXRhdGUoc3RhcnRfaG91cj1ob3VyKHN0YXJ0X2RhdGUpKSU+JQogIGNvdW50KHN0YXJ0X2hvdXIpCgoKIyBQbG90IGxpbmUgZ3JhcGgKZ2dwbG90KHRlbXBfZGYsIGFlcyh4ID0gYXMuZmFjdG9yKHN0YXJ0X2hvdXIpLCB5ID0gbiwgZ3JvdXAgPSAxKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJibGFjayIpICsKICB4bGFiKCJUaW1lIGluIEhvdXJzIikgKyAKICB5bGFiKCJOdW1iZXIgb2YgUmlkZXMiKSArCiAgIyBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpCiAgZ2d0aXRsZSgiVG90YWwgUmlkZXMgYnkgSG91ciIpCgpgYGAKCioqQ29tbWVudDoqKgoKVGhlIHJlbnRhbHMgbG9vayB0byBiZSBpbiBmYXZvciBvZiB3b3JraW5nIGNvbW11dGUgd2l0aCA3LThBTSwgNC01UE0gaGF2aW5nIHRoZSBoaWdoZXN0IHBlYWsuCgoKKioqKgo2LiBBbnkgcmVsYXRpb24gb2YgaG91cnMgd2l0aCBzdGFydF9zdGF0aW9uX25hbWU/CgpJbiBvcmRlciB0byB3b3JrIG9uIHRoaXMgd2Ugd2lsbCBjYXRlZ29yaXplIHRoZSBob3VycyBpbnRvIHRoZSBmb2xsb3dpbmcgYnJhY2tldHMKMC02LCA3LTExICwxMi0xNiAsMTctMjMKCgpgYGB7ciBlY2hvPUYsZmlnLndpZHRoPTV9CiMgbGV0cyBnZXQgYSBkZiB3aXRoIHN1bW1hcnkgb2YgaG91cnMgJiBzdGFydF9zdGF0aW9uX25hbWUuCnRlbXBfZGY8LWRmXzIwMTclPiUKICBtdXRhdGUoc3RhcnRfaG91cj1ob3VyKHN0YXJ0X2RhdGUpKSU+JQogIGNvdW50KHN0YXJ0X2hvdXIsc3RhcnRfc3RhdGlvbl9uYW1lKQoKZ2V0X2hvdXJfY2F0ZzwtIGZ1bmN0aW9uKGluX2hvdXIpewogIHRlbXBfc3RyPSJUQkQiCiAgaWYoaW5faG91cj49MCAmIGluX2hvdXI8PTYpewogICAgdGVtcF9zdHI9IjAtNiIKICB9ZWxzZSBpZihpbl9ob3VyPj03ICYgaW5faG91cjw9MTEpewogICAgdGVtcF9zdHI9IjctMTEiCiAgfWVsc2UgaWYoaW5faG91cj49MTIgJiBpbl9ob3VyPD0xNil7CiAgICB0ZW1wX3N0cj0iMTItMTYiCiAgfWVsc2UgaWYoaW5faG91cj49MTcgJiBpbl9ob3VyPD0yMyl7CiAgICB0ZW1wX3N0cj0iMTctMjMiCiAgfQp9CnRlbXBfZGYlPiUKICBtdXRhdGUoaG91cl9jYXRnPXNhcHBseShzdGFydF9ob3VyLGdldF9ob3VyX2NhdGcpKS0+dGVtcF9kZgoKIyMgc2V0IHRoZSBob3VyX2NhdGcgYXMgZmFjdG9yCiMwLTYsIDctMTEgLDEyLTE2ICwxNy0yMwp0ZW1wX2RmJGhvdXJfY2F0ZyA9IGZhY3Rvcih0ZW1wX2RmJGhvdXJfY2F0ZywgbGV2ZWxzPWMoIjAtNiIsICI3LTExIiAsIjEyLTE2IiAsIjE3LTIzIikpCgoKIyB0ZW1wX2RmJT4lCiMgICBncm91cF9ieShob3VyX2NhdGcsc3RhcnRfc3RhdGlvbl9uYW1lKSU+JQojICAgc3VtbWFyaXplKHRvdF9yaWRlcz1zdW0obikpJT4lCiMgICBhcnJhbmdlKGhvdXJfY2F0ZyxkZXNjKHRvdF9yaWRlcyksc3RhcnRfc3RhdGlvbl9uYW1lKSU+JQojICAgdG9wX24oNSx0b3RfcmlkZXMpJT4lCiMgICBnZ3Bsb3QoYWVzKHN0YXJ0X3N0YXRpb25fbmFtZSx0b3RfcmlkZXMpKSsKIyAgIGdlb21fcG9pbnQoc3RhdD0iaWRlbnRpdHkiKSsKIyAgIGdlb21fc2VnbWVudChhZXMoeD1zdGFydF9zdGF0aW9uX25hbWUsIHhlbmQ9c3RhcnRfc3RhdGlvbl9uYW1lLHk9MCx5ZW5kPXRvdF9yaWRlcykpICsKIyAgIGZhY2V0X2dyaWQofmhvdXJfY2F0ZyxzY2FsZXMgPSAiZnJlZV94IikrCiMgICBjb29yZF9mbGlwKCkKCnAxPC10ZW1wX2RmJT4lCiAgZ3JvdXBfYnkoaG91cl9jYXRnLHN0YXJ0X3N0YXRpb25fbmFtZSklPiUKICBzdW1tYXJpemUodG90X3JpZGVzPXN1bShuKSklPiUKICBhcnJhbmdlKGhvdXJfY2F0ZyxkZXNjKHRvdF9yaWRlcyksc3RhcnRfc3RhdGlvbl9uYW1lKSU+JQogIHRvcF9uKDUsdG90X3JpZGVzKSU+JQogIGdncGxvdChhZXMoc3RhcnRfc3RhdGlvbl9uYW1lLHRvdF9yaWRlcykpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrCiAgZmFjZXRfZ3JpZCh+aG91cl9jYXRnLHNjYWxlcyA9ICJmcmVlX3giKSsKICBsYWJzKHRpdGxlPSJTdW1tYXJ5IG9mIHN0YXJ0IHN0YXRpb25zIGFuZCB0aGVpciBob3VybHkgcmVudGFscyIsc3VidGl0bGU9IlRvcCA1IHN0YXRpb25zIiwgeD0iIix5PSJUb3RhbCBSaWRlcyIpKwogIGNvb3JkX2ZsaXAoKQoKIyAjIG5vdyBsZXRzIGFsc28gcGxvdCB0aGUgdHJlbmQgb3ZlciB0aGUgeWVhcnMvbW9udGhzL3dlZWtkYXkKIyAKIyAjeWVhcgojIHAyPC1kZl8yMDE3JT4lCiMgICBtdXRhdGUoeXl5eW1tPXBhc3RlKHllYXIoc3RhcnRfZGF0ZSksc3RyX3BhZChtb250aChzdGFydF9kYXRlKSx3aWR0aD0yLHNpZGU9ImxlZnQiLHBhZD0iMCIpLHNlcD0iIikpJT4lCiMgICBjb3VudCh5eXl5bW0pJT4lCiMgICBnZ3Bsb3QoYWVzKHl5eXltbSxuKSkrCiMgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKwojICAgbGFicyh0aXRsZT0iVHJlbmQgYnkgeWVhci9tb250aCIsc3VidGl0bGU9IiIsIHg9IiIseT0iVG90YWwgUmlkZXMiKQoKcDEKYGBgCgoqKkNvbW1lbnQ6KioKCkFzIGV4cGVjdGVkIGFsbCB0cmFpbiBzdGF0aW9ucyBoYXZlIHRoZSBoaWdoIHJlbnRhbHMgZHVyaW5nIGNvbW11dGUgaG91cnMuClBvd2VsbCBhbmQgTWFya2V0IHN1cnByaXNpbmdseSBkbyBub3QgaGF2ZSBhbnkgc3RhcnRzIGR1cmluZyBjb21tdXRlIGV4Y2VwdCB0aGUgZXZlbmluZ3MuIFRoZXNlIGNvdWxkIGJlIGZvbGtzIHdvcmtpbmcgb3V0c2lkZSBTRiBhbmQgYXJlIHJldHVybmluZyBiYWNrIHZpYSBCQVJUIGFuZCB1c2luZyB0aGUgcmVudGFscyB0byBnbyBob21lLgoKCioqKioKCgo=