For this case study, I am taking on the fictional role as a Junior Data Analyst working on the marketing analyst team at Bellabeat, a high-tech manufacturer of health-focused products for women. Bellabeat is a successful small company, but they have the potential to become a larger player in the global smart device market.



This case study was provided as a project under the Google Data Analyst certification program, where the following process is used to approach data analysis, and how this notebook will be organized:


Ask
Prepare
Process
Analyze
Share
Act




LS0tDQp0aXRsZTogIkJlbGxhYmVhdCBDYXNlIHN0dWR5IENhcHN0b25lIFByb2plY3QiDQphdXRob3I6ICJUYXNoYSBHaWxsIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCltdeyN0b3AtbGlua30NCg0KIVtdKGh0dHBzOi8vbWswYmVsbGFiZWF0Y29taHFsaXAua2luc3RhY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMC8xMC9iYl8zMS5qcGcpDQoNCjxicj48YnI+PGJyPg0KRm9yIHRoaXMgY2FzZSBzdHVkeSwgSSBhbSB0YWtpbmcgb24gdGhlIGZpY3Rpb25hbCByb2xlIGFzIGEgSnVuaW9yIERhdGEgQW5hbHlzdCB3b3JraW5nIG9uIHRoZSBtYXJrZXRpbmcgYW5hbHlzdCB0ZWFtIGF0IEJlbGxhYmVhdCwgYSBoaWdoLXRlY2ggbWFudWZhY3R1cmVyIG9mIGhlYWx0aC1mb2N1c2VkIHByb2R1Y3RzIGZvciB3b21lbi4gQmVsbGFiZWF0IGlzIGEgc3VjY2Vzc2Z1bCBzbWFsbCBjb21wYW55LCBidXQgdGhleSBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gYmVjb21lIGEgbGFyZ2VyIHBsYXllciBpbiB0aGUgZ2xvYmFsIHNtYXJ0IGRldmljZSBtYXJrZXQuDQoNCjxicj48YnI+DQoNClRoaXMgY2FzZSBzdHVkeSB3YXMgcHJvdmlkZWQgYXMgYSBwcm9qZWN0IHVuZGVyIHRoZSBHb29nbGUgRGF0YSBBbmFseXN0IGNlcnRpZmljYXRpb24gcHJvZ3JhbSwgd2hlcmUgdGhlIGZvbGxvd2luZyBwcm9jZXNzIGlzIHVzZWQgdG8gYXBwcm9hY2ggZGF0YSBhbmFseXNpcywgYW5kIGhvdyB0aGlzIG5vdGVib29rIHdpbGwgYmUgb3JnYW5pemVkOg0KDQo8YnI+DQoNCjxqdXN0aWZpZWQ+DQoNCg0KW0Fza10oI2Fzay1saW5rKTxicj4NCltQcmVwYXJlXSgjcHJlcGFyZS1saW5rKTxicj4NCltQcm9jZXNzXSgjcHJvY2Vzcy1saW5rKTxicj4NCltBbmFseXplXSgjYW5hbHl6ZS1saW5rKTxicj4NCltTaGFyZV0oI3NoYXJlLWxpbmspPGJyPg0KW0FjdF0oI2FjdC1saW5rKSAgICANCg0KDQoNCjxicj48YnI+PGJyPiAgDQoNCg0KPHN0cm9uZz4gIA0KDQojIyMgQVNLICMjI3sjYXNrLWxpbmt9ICANCltUb3BdKCN0b3AtbGluaykgIFtCb3R0b21dKCNib3R0b20pPGJyPg0KDQoNCjwvc3Ryb25nPg0KDQoNCg0KSW4gdGhpcyBzY2VuYXJpbywgSSd2ZSBiZWVuIGFza2VkIHRvIGZvY3VzIG9uIG9uZSBvZiBCZWxsYWJlYXTigJlzIHByb2R1Y3RzIGFuZCBhbmFseXplIHNtYXJ0IGRldmljZSBkYXRhIHRvIGdhaW4gaW5zaWdodCBpbnRvIGhvdyBjb25zdW1lcnMgYXJlIHVzaW5nIHRoZWlyIHNtYXJ0IGRldmljZXMuIFRoZSBpbnNpZ2h0cyB3aWxsIHRoZW4gaGVscCBndWlkZSBtYXJrZXRpbmcgc3RyYXRlZ3kgZm9yIHRoZSBjb21wYW55LiBUaGlzIG5vdGVib29rIHdpbGwgYmUgYSByZWNvcmQgb2YgdGhpcyB3b3JrLCBhbGxvdyBtZSB0byBwcmVzZW50IG15IGFuYWx5c2lzIHRvIHRoZSBCZWxsYWJlYXQgZXhlY3V0aXZlIHRlYW0sIGFzIHdlbGwgYXMgcHJvdmlkZSBteSByZWNvbW1lbmRhdGlvbnMgZm9yIEJlbGxhYmVhdOKAmXMgbWFya2V0aW5nIHN0cmF0ZWd5Lg0KPGJyPjxicj48YnI+ICANCg0KDQoNCjxzdHJvbmc+ICANCg0KIyMjIFBSRVBBUkUgIyMjeyNwcmVwYXJlLWxpbmt9ICAgDQpbVG9wXSgjdG9wLWxpbmspICBbQm90dG9tXSgjYm90dG9tKTxicj4NCg0KDQo8L3N0cm9uZz4NCg0KDQogIFRoZSBkYXRhIEkgd2FzIGFza2VkIHRvIGFuYWx5emUgd2FzIGxvY2F0ZWQgYXQgW0thZ2dsZSdzIEZpdEJpdCBkYXRhIHNldF0oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9hcmFzaG5pYy9maXRiaXQpICANCiAgVGhpcyBLYWdnbGUgZGF0YSBzZXQgY29udGFpbnMgcGVyc29uYWwgZml0bmVzcyB0cmFja2VyIGRhdGEgZnJvbSB0aGlydHkgZml0Yml0IHVzZXJzLiBUaGlydHkgZWxpZ2libGUgRml0Yml0IHVzZXJzIGNvbnNlbnRlZCB0byB0aGUgc3VibWlzc2lvbiBvZiBwZXJzb25hbCB0cmFja2VyIGRhdGEsIGluY2x1ZGluZyBtaW51dGUtbGV2ZWwgb3V0cHV0IGZvciBwaHlzaWNhbCBhY3Rpdml0eSwgaGVhcnQgcmF0ZSwgYW5kIHNsZWVwIG1vbml0b3JpbmcuIEl0IGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IGRhaWx5IGFjdGl2aXR5LCBzdGVwcywgYW5kIGhlYXJ0IHJhdGUgdGhhdCBjYW4gYmUgdXNlZCB0byBleHBsb3JlIHVzZXJz4oCZIGhhYml0cy4gVGhpcyBhcmNoaXZlIGhhcyAxOCBkYXRhIHNldHMgd2l0aGluIGl0LiBCb3RoIHdpZGUgYW5kIGxvbmcgZm9ybWF0cyBhcmUgaW5jbHVkZWQgZm9yIHNvbWUgb2YgdGhlIGRhdGEgZmlsZXMuDQogIDxicj48YnI+DQogIA0KICANCiAgPGk+Rm9sbG93aW5nIHRoZSBST0NDQyBwcm9jZXNzIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IGNyZWRpYmlsaXR5IG9yIGJpYXMgaXNzdWVzIHdpdGggdGhlIGRhdGE6PC9pPiAgDQogIA0KICA8c3Ryb25nPlJlbGlhYmxlPC9zdHJvbmc+IC0geWVzLCBhcyB0aGUgaW5mb3JtYXRpb24gd2FzIGdlbmVyYXRlZCBieSB0aGUgc2Vuc29ycyBvZiB0aGUgZGV2aWNlcyBkaXJlY3RseSwgcmF0aGVyIHRoYW4gcmVzcG9uc2VzIGZyb20gaW5kaXZpZHVhbHMuDQogIDxicj4NCiAgPHN0cm9uZz5PcmlnaW5hbDwvc3Ryb25nPiAtIHllcywgY2FuIGxvY2F0ZSB0aGUgb3JpZ2luYWwgcHVibGljIGRhdGEgOiBodHRwczovL3plbm9kby5vcmcvcmVjb3JkLzUzODk0Iy5YOW9laDNVemFhbyA8YnI+IA0KICA8c3Ryb25nPkNvbXByZWhlbnNpdmU8L3N0cm9uZz4gLSB5ZXMsIGJvdGggbG9uZyBhbmQgd2lkZSBmb3JtYXRzIGhhdmUgbWF0Y2hpbmcgZGF0YSwgYW5kIG5vIG1pc3NpbmcgdmFsdWVzLjxicj4gDQogIDxzdHJvbmc+Q3VycmVudDwvc3Ryb25nPiAtIG5vLCB0aGlzIGlzIGEgaGlzdG9yaWNhbCBkYXRhIHNvdXJjZSAoMDQvMTIvMjAxNiAtIDA1LzEyLzIwMTYpICANCiAgPHN0cm9uZz5DaXRlZDwvc3Ryb25nPiAtIHllcyAgICA8YnI+DQogIDxicj4NCiAgQXMgZm9yIHRoZSBsaWNlbnNpbmcgb2YgdGhlIGRhdGEsIGl0IGlzIGxpc3RlZCB1bmRlciBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDQuMCBJbnRlcm5hdGlvbmFsLiAgIA0KICA8YnI+PGJyPg0KICBJdCBkb2VzIG5vdCBzZWVtIGxpa2UgdGhlcmUgYXJlIGFueSBwZXJzb25hbGx5IGlkZW50aWZ5aW5nIHZhbHVlcywgYXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZGF0YXNldCBkZXRhaWxzIHRoYXQgSW5kaXZpZHVhbCByZXBvcnRzIGNhbiBiZSBwYXJzZWQgYnkgZXhwb3J0IHNlc3Npb24gSUQsIHNvIHByaXZhY3kgb2YgdGhlIHVzZXJzIHNob3VsZCBiZSBtYWludGFpbmVkIGF0IGxlYXN0IGF0IHRoaXMgbGV2ZWwsIGFzIEkgaGF2ZSBubyB3YXkgb2YgZnVydGhlciBpZGVudGlmeWluZyB0aGVtLiBJIGRvIGhvd2V2ZXIsIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIGRhdGEgaXMgbm90IHJlcHJlc2VudGF0aXZlIG9mIGp1c3QgdGhlIGZlbWFsZSBwb3B1bGF0aW9uLCBhbmQgdGhhdCB0aGUgaW5zaWdodHMgZ2F0aGVyZWQgaGVyZSB3b3VsZCBhcHBseSBmb3IgYWxsIHVzZXJzIHJhdGhlciB0aGFuIGEgc3Vic2V0IG9mIHRob3NlIHdobyBCZWxsYWJlYXQgbWF5IGJlIG1hcmtldGluZyB0b3dhcmRzLiAgDQogIDxicj48YnI+PGJyPiANCiAgDQo8L3A+DQogIA0KICA8c3Ryb25nPiANCiAgDQojIyMgUFJPQ0VTUyAjIyN7I3Byb2Nlc3MtbGlua30gIA0KW1RvcF0oI3RvcC1saW5rKSAgW0JvdHRvbV0oI2JvdHRvbSk8YnI+IA0KDQo8L3N0cm9uZz4gDQogIA0KICBJbml0aWFsbHkgSSBoYWQgYXR0ZW1wdGVkIHRvIHVzZSBHb29nbGUgc2hlZXRzIHRvIHZpZXcgdGhlIGRhdGEgc2V0cywgYW5kIGZvdW5kIHRoYXQgdGhlIGhlYXJ0cmF0ZSBkYXRhIHNldCB3YXMgdG9vIGxvbmcgZm9yIHNoZWV0cyB0byBkaXNwbGF5LiBEdWUgdG8gdGhpcywgSSd2ZSBjaG9zZW4gUiBmb3IgaXQncyBhYmlsaXR5IHRvIGhhbmRsZSB0aGUgYW5hbHlzaXMgb2YgbG9uZyBkYXRhc2V0cywgdmlzdWFsaXphdGlvbnMsIGFuZCBwcmVzZW50YXRpb24uICAgIA0KICAgIDxicj4NCiAgICAgIA0KLUxvYWRlZCBhbGwgMTggY3N2IGZpbGVzIGludG8gcHJvamVjdCBmb3IgcmV2aWV3LiAgDQotTG9hZGVkICd0aWR5dmVyc2UnIGxpYnJhcnkgIA0KLWxvYWRlZCB0aGUgbHVicmlkYXRlIGxpYnJhcnk6DQoNCmBgYHtyfQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCg0KbGlicmFyeSgibHVicmlkYXRlIikNCmBgYA0KPGJyPjxicj4NCiAgDQogIEFzIG1vc3Qgb2YgdGhlIEJlbGxhYmVhdCBwcm9kdWN0cyB1c2Ugc21hcnQgdGVjaG5vbG9neSB0byB0cmFjayB1c2VyIGFjdGl2aXR5LCBzbGVlcCwgYW5kIHN0cmVzcywgSSB3aWxsIGJlIHJlZHVjaW5nIHRoZSBmaXRiaXQgZmlsZXMgZG93biB0byBkYXRhIHRoYXQgbWF0Y2hlcyB0aGlzIGZvciBjb21wYXJpc29uLiBUaGUgZml0Yml0IGRhdGEgZG9lcyBub3QgYWNjb3VudCBkaXJlY3RseSBmb3Igc3RyZXNzLCBzbyB3ZSBtYXkgbm90IGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIHRoZSBjb21wYXJpc29uLCBob3dldmVyIHRoZXkgZG8gaGF2ZSBxdWl0ZSBhIGJpdCBvZiBkYXRhIG9uIGRhaWx5LCBob3VybHksIGFuZCBtaW51dGUgYWN0aXZpdHkuIEkgd2lsbCBiZSByZWR1Y2luZyB0aGlzIGRvd24gZnVydGhlciB0byBwcm92aWRlIGEgZGFpbHkgb3ZlcnZpZXcgb2YgdGhlIGRhdGEgZm9yIHJldmlldy4gICANCiAgICANCiAgPHN0cm9uZz4NCiAgDQojIyMgQU5BTFlaRSAjIyN7I2FuYWx5emUtbGlua30gIA0KW1RvcF0oI3RvcC1saW5rKSAgW0JvdHRvbV0oI2JvdHRvbSk8YnI+DQogIA0KICA8L3N0cm9uZz4NCiAgICAgIA0KRmlsZXMgdG8gQW5hbHl6ZTogIA0KLWRhaWx5QWN0aXZpdHlfbWVyZ2VkICANCi1kYWlseUNhbG9yaWVzX21lcmdlZCAgDQotZGFpbHlJbnRlbnNpdGllc19tZXJnZWQgIA0KLWRhaWx5U3RlcHNfbWVyZ2VkICANCi1zbGVlcERheV9tZXJnZWQgIA0KLWhlYXJ0cmF0ZV9zZWNvbmRzX21lcmdlZCAgDQo8YnI+DQoNCkNoZWNrIGZpbGVzIGZvciBzdHJ1Y3R1cmU6ICANCg0KYGBge3IgZWNobz1UUlVFfQ0Kbl9kaXN0aW5jdChkYWlseUFjdGl2aXR5X21lcmdlZCRJZCkNCiMgWzFdIDMzDQpuX2Rpc3RpbmN0KGRhaWx5Q2Fsb3JpZXNfbWVyZ2VkJElkKQ0KIyBbMV0gMzMNCm5fZGlzdGluY3QoZGFpbHlJbnRlbnNpdGllc19tZXJnZWQkSWQpDQojIFsxXSAzMw0Kbl9kaXN0aW5jdChkYWlseVN0ZXBzX21lcmdlZCRJZCkNCiMgWzFdIDMzDQpuX2Rpc3RpbmN0KGhlYXJ0cmF0ZV9zZWNvbmRzX21lcmdlZCRJZCkNCiMgWzFdIDE0DQpuX2Rpc3RpbmN0KHNsZWVwRGF5X21lcmdlZCRJZCkNCiMgWzFdIDI0DQpgYGAgIA0KICANCiAgPGJyPjxicj4NCiAgDQpBbHRob3VnaCB0aGUgSGVhcnRyYXRlIGRhdGEgaXMgdGhlIGxvbmdlc3QsIGl0IGRvZXMgbG9vayBsaWtlIGl0J3MgZnJvbSB0aGUgc21hbGxlc3QgYW1vdW50IG9mIHVzZXJzLiBBbHNvLCBmZXdlciB1c2VycyBwYXJ0aWNpcGF0ZWQgd2l0aCBzbGVlcCBkYXRhIGNvbGxlY3Rpb24uIEFzc3VtcHRpb25zIGZvciBzbGVlcCBhbmQgc3RyZXNzIG1heSBuZWVkIHRvIGJlIG1hZGUgYXMgdGhlIGRhdGEgbWlnaHQgbm90IHJlZmxlY3QgYSBmdWxsIHBpY3R1cmUgb2YgdGhpcyBpbmZvcm1hdGlvbiwgYnV0IHdlIGNhbiBjZXJ0YWlubHkgd29yayB3aXRoIHRoZSBhY3Rpdml0eSBkYXRhIGFzIGEgcHJvcGVyIHNhbXBsZS4gIA0KPGJyPg0KQ29tcGFyaW5nIHRoZSBzdHJ1Y3R1cmVzIGZ1cnRoZXIsIHRvIGNvbmZpcm0gdGhlIGRhdGEgZnJhbWVzIGhhdmUgYW55IG90aGVyIGNvbW1vbiBjb2x1bW5zIHRoYXQgY2FuIGJlIG1lcmdlZDogIA0KZGFpbHlBY3Rpdml0eV9tZXJnZWQgbGlzdHMgdGhlIGRhdGUgdGhlIGluZm9ybWF0aW9uIHdhcyByZWNvcmRlZCBhcyAiQWN0aXZpdHlEYXRlIiwgZGFpbHlDYWxvcmllc19tZXJnZWQsIGRhaWx5SW50ZW5zaXRpZXNfbWVyZ2VkIGFuZCBkYWlseVN0ZXBzX21lcmdlZCBsaXN0cyB0aGlzIGFzICJBY3Rpdml0eURheSIuIGhlYXJ0cmF0ZV9zZWNvbmRzX21lcmdlZCBsaXN0cyB0aGlzIGFzICJUaW1lIiwgYW5kIHNsZWVwRGF5X21lcmdlZCBsaXN0cyB0aGlzIGFzICJTbGVlcERheSIuIFRoZXNlIGFyZSBhbHNvIGFsbCBDaGFyYWN0ZXIgdHlwZXMsIHJhdGhlciB0aGFuIGRhdGUvdGltZSB0eXBlcy4gIA0KPGJyPg0KQ2Fsb3JpZXMgYXJlIGZvdW5kIG9uIGJvdGggZGFpbHlBY3Rpdml0eV9tZXJnZWQgYW5kIGRhaWx5Q2Fsb3JpZXNfbWVyZ2VkLiAgICANCjxicj4NCkNvbXBhcmluZyBkYWlseVN0ZXBzX21lcmdlZCwgZGFpbHlfaW50ZW5zaXRpZXNfbWVyZ2VkLCBkYWlseUNhbG9yaWVzX21lcmdlZCwgYW5kIGRhaWx5QWN0aXZpdHlfbWVyZ2VkLCBmb3VuZCB0aGF0IGFsbCBkYXRhIGZyb20gZGFpbHlTdGVwc19tZXJnZWQsIGRhaWx5X2ludGVuc2l0aWVzX21lcmdlZCwgYW5kIGRhaWx5Q2Fsb3JpZXNfbWVyZ2VkIGFyZSBmb3VuZCBpbiBkYWlseUFjdGl2aXR5X21lcmdlZC4gUmVtb3ZpbmcgdGhlIHRocmVlIGZvcm1lciBkYXRhIHNldHMgYXMgd2VsbC4gICANCjxicj48YnI+DQoNCkZpbGVzIHRvIGtlZXA6DQotZGFpbHlBY3Rpdml0eV9tZXJnZWQNCi1oZWFydHJhdGVfc2Vjb25kc19tZXJnZWQNCi1zbGVlcERheQ0KDQpObyBmdXJ0aGVyIGNvbW1vbiBjb2x1bW5zIGFjcm9zcyB0aGUgcmVtYWluaW5nIDMgZGF0YSBzZXRzIGFyZSBmb3VuZC4gZm9ybWF0dGluZyBlYWNoIG9mIHRoZSBkYXRhIGZyYW1lcyB0byB1c2UgZGF0ZSB0aW1lOg0KDQpgYGB7ciBlY2hvPVRSVUV9DQphY3Rpdml0eSA8LSBkYWlseUFjdGl2aXR5X21lcmdlZA0KDQphY3Rpdml0eSRBY3Rpdml0eURhdGU9YXMuUE9TSVhjdChhY3Rpdml0eSRBY3Rpdml0eURhdGUsIGZvcm1hdD0iJW0vJWQvJVkiLCB0ej1TeXMudGltZXpvbmUoKSkNCmFjdGl2aXR5JGRhdGUgPC0gZm9ybWF0KGFjdGl2aXR5JEFjdGl2aXR5RGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyV5IikNCg0Kc2xlZXBEYXkgPC0gc2xlZXBEYXlfbWVyZ2VkDQoNCnNsZWVwRGF5JFNsZWVwRGF5PWFzLlBPU0lYY3Qoc2xlZXBEYXkkU2xlZXBEYXksIGZvcm1hdD0iJW0vJWQvJVkiLCB0ej1TeXMudGltZXpvbmUoKSkNCnNsZWVwRGF5JGRhdGUgPC0gZm9ybWF0KHNsZWVwRGF5JFNsZWVwRGF5LCBmb3JtYXQgPSAiJW0vJWQvJXkiKQ0KDQpoZWFydHJhdGUgPC0gaGVhcnRyYXRlX3NlY29uZHNfbWVyZ2VkDQoNCmhlYXJ0cmF0ZSRUaW1lPWFzLlBPU0lYY3QoaGVhcnRyYXRlJFRpbWUsIGZvcm1hdD0iJW0vJWQvJVkgJUk6JU06JVMgJXAiLCB0ej1TeXMudGltZXpvbmUoKSkNCmhlYXJ0cmF0ZSRob3VyIDwtIGZvcm1hdChoZWFydHJhdGUkVGltZSwgZm9ybWF0ID0gIiVIOiVNOiVTIikNCmhlYXJ0cmF0ZSRkYXRlIDwtIGZvcm1hdChoZWFydHJhdGUkVGltZSwgZm9ybWF0ID0gIiVtLyVkLyV5IikNCmBgYCAgDQo8YnI+PGJyPg0KU3VtbWFyaXppbmcgdGhlIGluZGl2aWR1YWwgZGF0YSBzZXRzIHRvIGdldCBhIGdvb2QgaWRlYSBvZiB3aGF0IHRoZSB0cmVuZHMgYXJlOiAgDQoNCmBgYHtyfQ0KYWN0aXZpdHkgJT4lDQogIHN1bW1hcnkoKQ0KYGBgICANCjxicj4NCmBgYHtyfQ0Kc2xlZXBEYXkgJT4lDQogIHN1bW1hcnkoKQ0KYGBgDQo8YnI+DQpgYGB7cn0NCmhlYXJ0cmF0ZSAlPiUNCiAgc3VtbWFyeSgpDQpgYGAgIA0KICAgIA0KIDxicj48YnI+PGJyPiAgICANCiAgICAgICANCiAgICAgICAgICANClZpc3VhbGl6aW5nIHRoZSBDYWxvcmllcyBieSBBY3Rpdml0eURhdGUgZm9yIGFjdGl2aXR5IHN1bW1hcnk6ICANCmBgYHtyfQ0KZ2dwbG90KGRhdGE9YWN0aXZpdHkpKw0KICBnZW9tX3Ntb290aChtYXBwaW5nPWFlcyhBY3Rpdml0eURhdGUsIENhbG9yaWVzKSkNCmBgYCAgDQo8YnI+DQoNCmxvb2tzIGxpa2UgcXVpdGUgYSBiaXQgb2YgdGhlIGNhbG9yaWVzIHdlcmUgYmVpbmcgd29ya2VkIG9mZiBiZWZvcmUgc3VtbWVydGltZSBhcnJpdmVkLCBhbmQgdGhlbiBlaXRoZXIgdGhlIHVzZXJzIGFjaGlldmVkIHRoZWlyIGdvYWxzLCBvciBzdG9wcGVkIHRyYWNraW5nIGl0IGFzIG11Y2guIE1heSBiZSBiZXN0IHRvIGtlZXAgaW4gbWluZCB0aGF0IG1hcmtldGluZyBmb3IgdGhlIGFjdGl2aXR5LWZvY3VzZWQgdXNlcnMgc2hvdWxkIGJlIHNvbWUgdGltZSBhcm91bmQgc3ByaW5nLCB3aGVyZSB0aGV5IG1heSBiZSBnZXR0aW5nIHJlYWR5IHRvIHdvcmsgb3V0IG1vcmUgYmVmb3JlIHN1bW1lci4gIA0KPGJyPjxicj4NClRoZSBkYXRhIHNldCBwcm92aWRlcyBkaWZmZXJlbnQgY2F0ZWdvcmllcyBmb3IgYWN0aXZpdHkuIFdoYXQgYXJlIHRoZSBhdmVyYWdlcyBmb3IgdGhpcyBhY3Rpdml0eSB0aGF0IHdhcyBsb2dnZWQ/ICANCkNyZWF0ZSBuZXcgZGF0YSB0YWJsZSB0aGF0IHNlbGVjdHMgdGhlIHRpbWUgc3BlbnQgaW4gdGhlIGNhdGVnb3JpZXM6ICANCjxicj4NCmBgYHtyfQ0KYWN0aXZpdHlfY2F0ZWdvcmllcyA8LSBhY3Rpdml0eSAlPiUNCiAgc2VsZWN0KFNlZGVudGFyeU1pbnV0ZXMsIExpZ2h0bHlBY3RpdmVNaW51dGVzLCBGYWlybHlBY3RpdmVNaW51dGVzLCBWZXJ5QWN0aXZlTWludXRlcykNCmBgYCAgDQo8YnI+DQpBdmVyYWdlcyBvZiB0aG9zZSBzZWxlY3RlZDogIA0KPGJyPg0KYGBge3J9DQphY3Rpdml0eV9hdmdzIDwtIGMoc2VkZW50YXJ5ID0gbWVhbihhY3Rpdml0eV9jYXRlZ29yaWVzJFNlZGVudGFyeU1pbnV0ZXMpLCBsaWdodGx5ID0gbWVhbihhY3Rpdml0eV9jYXRlZ29yaWVzJExpZ2h0bHlBY3RpdmVNaW51dGVzKSwgZmFpcmx5ID0gbWVhbihhY3Rpdml0eV9jYXRlZ29yaWVzJEZhaXJseUFjdGl2ZU1pbnV0ZXMpLCB2ZXJ5ID0gbWVhbihhY3Rpdml0eV9jYXRlZ29yaWVzJFZlcnlBY3RpdmVNaW51dGVzKSkNCmBgYCAgDQo8YnI+DQpJIHdvdWxkIGxpa2UgdG8gZGlzcGxheSB0aGUgYXZlcmFnZXMgYXMgY29sdW1ucyBkZXRhaWxpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2F0ZWdvcmllcy4gZ2VvbV9jb2xzIHJlcXVpcmVzIHggYW5kIHkgYXhpcyB0byBkbyB0aGlzLCBzbyBJJ20gY3JlYXRpbmcgbGFiZWxzIGZvciB0aGUgYXZlcmFnZXMsIGFuZCB0aGVuIGEgbmV3IGRhdGEgZnJhbWUgZm9yIHRoZSB2aXN1YWwgdG8gdXNlOiAgDQo8YnI+DQpgYGB7cn0NCmFjdGl2aXR5X2xhYmVscyA8LSBjKCJTZWRlbnRhcnkiLCJMaWdodGx5IiwiRmFpcmx5IiwgIlZlcnkgQWN0aXZlIikNCmFjdGl2aXR5X3Zpc19mcmFtZSA8LSBkYXRhLmZyYW1lKGFjdGl2aXR5X2F2Z3MsIGFjdGl2aXR5X2xhYmVscykNCmBgYCAgDQo8YnI+DQpWaXN1YWxpemluZyB0aGUgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgYWN0aXZpdHkgdnMgdGltZSBzcGVudCBpbiB0aG9zZSBjYXRlZ29yaWVzOiAgDQo8YnI+DQpgYGB7cn0NCmdncGxvdChhY3Rpdml0eV92aXNfZnJhbWUpKw0KICBnZW9tX2NvbChtYXBwaW5nPWFlcyh4PWFjdGl2aXR5X2F2Z3MsIHk9YWN0aXZpdHlfbGFiZWxzKSwgZmlsbD0iYmx1ZSIpDQpgYGAgIA0KPGJyPjxicj4NClRoaXMgcGxvdCBzaG93cyB0aGF0IHRoZSBmaXRiaXQgdXNlcnMgYXJlIG5vdCBwcmltYXJpbHkgYWN0aXZlIHdoZW4gdHJhY2tpbmcsIGFzIHRoZSBtYWpvcml0eSBvZiB0aG9zZSB0cmFja2luZyBhcmUgU2VkZW50YXJ5LiBQZXJoYXBzIHRoZXkgYXJlIHRyYWNraW5nIHRoZWlyIGN1cnJlbnQgYWN0aXZpdGllcyB0byBzZWUgd2hlcmUgdGhleSBjYW4gaW1wcm92ZSwgb3IgdGhleSBzcGVuZCB0aGUgbWFqb3JpdHkgb2YgdGhlaXIgZGF5IHdvcmtpbmcgYXQgYSBkZXNrLiBJcyB0aGlzIGFsc28gdGFraW5nIGludG8gYWNjb3VudCBzbGVlcD8gTW9yZSByZWZpbmVkIGRhdGEgd291bGQgYmUgbmVlZGVkIHRvIGNvbmZpcm0gaWYgdGhlIGRldmljZXMgd2VyZSB0cmFja2luZyBhY3Rpdml0eSBhdCB0aGUgc2FtZSB0aW1lIGFzIHNsZWVwLiAgIA0KPGJyPg0KVmlzdWFsaXppbmcgdGhlIFRvdGFsTWludXRlc0FzbGVlcCB2cy4gdGhlIFRvdGFsVGltZUluQmVkOiAgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9c2xlZXBEYXkpKw0KICBnZW9tX2NvdW50KG1hcHBpbmc9YWVzKFRvdGFsTWludXRlc0FzbGVlcCwgVG90YWxUaW1lSW5CZWQpKQ0KYGBgICANCg0KT3V0IG9mIHRob3NlIHdobyBhcmUgcmVwb3J0aW5nIHRoZWlyIHNsZWVwIGhhYml0cywgbW9zdCBhcmUgc2xlZXBpbmcgbmVhcmx5IGFzIG11Y2ggdGltZSBhcyB0aGV5IGFyZSBzcGVuZGluZyBpbiBiZWQsIHdpdGggZmV3IG91dGxpZXJzLiAgDQo8YnI+PGJyPg0KVmlzdWFsaXppbmcgdGhlIGhlYXJ0cmF0ZSB0aW1lIHZzIHZhbHVlOiAgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9aGVhcnRyYXRlKSsNCiAgZ2VvbV9zbW9vdGgobWFwcGluZz1hZXMoVGltZSwgVmFsdWUpKQ0KYGBgICANCg0KQSBsYXJnZSBwb3J0aW9uIG9mIHRoZSB2aXN1YWxpemF0aW9uIHNob3dzIHRoZSB2YWx1ZXMgd2VyZSBoaWdoIHRocm91Z2ggc3ByaW5nIHVwIHVudGlsIHRoZSBiZWdpbm5pbmcgb2YgbWF5LCB0aGVuIGFub3RoZXIgbGFyZ2Ugc3Bpa2Ugd2FzIGVudGVyZWQgZm9yIHRoZSBmaXJzdCB3ZWVrIG9mIG1heSwgcGVyaGFwcyB0aGUgbGFzdCBwdXNoIG9mIGFjdGl2aXR5IGJlZm9yZSBTdW1tZXIgYmVnYW4/ICANCjxicj48YnI+DQpNZXJnaW5nIGRhdGEgc2V0cyB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBmdXJ0aGVyIGNvbm5lY3Rpb25zIHRvIGJlIG1hZGU6ICANCg0KYGBge3J9DQpzdW1tYXJ5X21lcmdlZCA8LSBtZXJnZShhY3Rpdml0eSwgc2xlZXBEYXkpDQpgYGAgIA0KDQpTdW1tYXJpemUgdGhlIHR3byBtZXJnZWQgZGF0YSBzZXRzOiAgDQoNCmBgYHtyfQ0Kc3VtbWFyeV9tZXJnZWQgJT4lDQogIHN1bW1hcnkoKQ0KYGBgICANCjxicj48YnI+DQpJcyB0aGVyZSBhIGNvbm5lY3Rpb24gYmV0d2VlbiBob3cgbG9uZyBzb21lb25lIGxvZ3Mgc2xlZXAgYW5kIGhvdyBtYW55IGNhbG9yaWVzIHRoZXkgbG9nZ2VkIGFzIGV4cGVuZGVkPyAgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9c3VtbWFyeV9tZXJnZWQpKw0KICBnZW9tX3Ntb290aChtYXBwaW5nPWFlcyhDYWxvcmllcywgVG90YWxNaW51dGVzQXNsZWVwKSkNCmBgYCAgDQo8YnI+PGJyPg0KTG9va3MgbGlrZSBsb25nZXIgc2xlZXAgY2FuIGJlIGFjaGlldmVkIHdpdGggbW9yZSBjYWxvcmllIGV4cGVuZGl0dXJlLCB0aGlzIG1heSBiZSBhIHJlY29tbWVuZGF0aW9uIHRoYXQgY2FuIGJlIG1hZGUgZm9yIHN0cmVzcyBhbmQgc2xlZXAgdHJhY2tpbmcuDQogIA0KPGJyPjxpPjxzdHJvbmc+DQpXaGF0IHN1cnByaXNlcyBkaWQgeW91IGRpc2NvdmVyIGluIHRoZSBkYXRhPyAgDQo8L2k+PC9zdHJvbmc+DQoJVGhlIG1ham9yaXR5IG9mIHVzZXJzIGxvZyBtb3JlIHNlZGVudGFyeSB0aW1lIHRoYW4gdHJhY2sgYWN0aXZpdHksIGFuZCB0aG9zZSB3aG8gZG8gbG9nIGFjdGl2aXR5IGRvIHNvIGJlZm9yZSBNYXkgYWNjb3JkaW5nIHRvIHRoZSBkYXRhLiAgDQo8YnI+PGk+PHN0cm9uZz4NCldoYXQgdHJlbmRzIG9yIHJlbGF0aW9uc2hpcHMgZGlkIHlvdSBmaW5kIGluIHRoZSBkYXRhPyANCjxicj48L2k+PC9zdHJvbmc+DQoJVGhlIG1vcmUgb25lIGV4cGVuZHMgY2Fsb3JpZXMsIHRoZSBsb25nZXIgc2xlZXAgdGhleSBsb2cgYXMgd2VsbCwgd2hpY2ggbWF5IGhlbHAgd2l0aCBzdHJlc3MgYXMgbGVzcyBzbGVlcCBpcyBjb3JyZWxhdGVkIHdpdGggbW9yZSBzdHJlc3MgYW5kIGhlYWx0aCBpc3N1ZXMuIENpdGF0aW9uOg0KaHR0cHM6Ly93d3cuYXBhLm9yZy9uZXdzL3ByZXNzL3JlbGVhc2VzL3N0cmVzcy8yMDEzL3NsZWVwDQoNCjxicj48aT48c3Ryb25nPg0KIEhvdyB3aWxsIHRoZXNlIGluc2lnaHRzIGhlbHAgYW5zd2VyIHlvdXIgYnVzaW5lc3MgcXVlc3Rpb25zPw0KPGJyPjwvaT48L3N0cm9uZz4NCglUaGVzZSBpbnNpZ2h0cyB3aWxsIGhlbHAgd2l0aCBtYWtpbmcgc3VnZ2VzdGlvbnMgdG8gdGhlIG1hcmtldGluZyB0ZWFtIHJlZ2FyZGluZyB3aGVuIHRvIHRhcmdldCBhZHZlcnRpc2luZyBwZXJpb2RzIGZvciBCZWxsYWJlYXQsIGJhc2VkIG9uIHRoZSBmaXRiaXQgZGF0YSwgYW5kIGFwcCBjaGFuZ2Ugc3VnZ2VzdGlvbnMgdGhhdCBtYXkgdXNlIG1vcmUgZGF0YSB0byBtYWtlIHJlY29tbWVuZGF0aW9ucyB0byB1c2Vycy4gDQoNCg0KPHN0cm9uZz4NCg0KIyMjIFNIQVJFICMjIyB7I3NoYXJlLWxpbmt9ICANCltUb3BdKCN0b3AtbGluaykgIFtCb3R0b21dKCNib3R0b20pPGJyPg0KDQo8L3N0cm9uZz4NCg0KPHN0cm9uZz4gICAgDQogIEJlbGxhQmVhdCBjYW4gZW5oYW5jZSB0aGVpciBwcm9kdWN0IG9mZmVyaW5nIGJ5OiANCjwvc3Ryb25nPjxicj4NCiAgKiBFZHVjYXRpbmcgdGhlaXIgdXNlcnMgb24gdGhlIGJlbmVmaXRzIG9mIHJlZHVjaW5nIHNlZGVudGFyeSB0aW1lLCBleHBlbmRpbmcgbW9yZSBjYWxvcmllcywgYW5kIHRoZSB0cmVuZCBmb3IgdGhvc2UgYWN0aW9ucyB0byBsZWFkIHRvIGxvbmdlciBzbGVlcC4gPGJyPg0KICAqIEhvdyBsb25nZXIgc2xlZXAgbWF5IGhlbHAgYWxsZXZpYXRlIHN0cmVzczxicj4NCiAgKiBjaGFuZ2luZyB0aGUgYXBwIHRvIHByb3ZpZGUgcGVyaW9kaWMgYW5kIGFkanVzdGFibGUgbm90aWZpY2F0aW9ucyBvZiBzZWRlbnRhcnkgdGltZSwgYWN0aXZpdHkgdGltZSwgb3IgY2Fsb3JpZXMgZXhwZW5kZWQuICANCjxicj4NCjxpPjxzdHJvbmc+CQ0KSG93IGNvdWxkIHlvdXIgdGVhbSBhbmQgYnVzaW5lc3MgYXBwbHkgeW91ciBpbnNpZ2h0cz8NCjxicj48L2k+PC9zdHJvbmc+DQoJQmVnaW4gcGxhbnMgdG8gbWFrZSBhZGp1c3RtZW50cyB0byB0aGUgYXBwIGFuZCB0aGUgZGF0YSB0aGF0IGlzIGNvbGxlY3RlZCwgYWxvbmcgd2l0aCBtb3JlIG1hcmtldGluZyByZXNlYXJjaCBmb3IgYW4gYWR2ZXJ0aXNpbmcgY2FtcGFpZ24uICAJICANCjxicj48YnI+PGJyPg0KDQo8c3Ryb25nPg0KDQpJJ3ZlIGFsc28gY3JlYXRlZCBhIEdvb2dsZSBTbGlkZXMgcHJlc2VuYXRpb24gZm9yIHRoaXMgaW5mb3JtYXRpb246IDxicj4NCltCZWxsYWJlYXQgQ2FzZSBzdHVkeSBDYXBzdG9uZSBQcm9qZWN0XShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9wcmVzZW50YXRpb24vZC8xTkhnam9kNmpkM0Q3NjdjZzg5UmU5ak5tZVJKY0c0NWVWSl9CMlVJX0ExOC9lZGl0P3VzcD1zaGFyaW5nKTxicj4NCkFuZCBmaW5hbGx5LCBoZXJlIGFyZSB0aGUgbm90ZXMgdGhhdCBJIGhhZCB0YWtlbiB3aGlsZSBwcm9ncmVzc2luZyB0aHJvdWdoIHRoaXMgcHJvamVjdDo8YnI+DQpbQ2Fwc3RvbmUgUHJvamVjdCBOb3Rlc10oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xM1VQd3FjT2FFeFlmeEhEYkt4ZHZUUHRiNlBLUzMxdjJZN1J0V29fQzB4Zy9lZGl0P3VzcD1zaGFyaW5nKQ0KDQoNCiMjIyBBQ1QgIyMjeyNhY3QtbGlua30gIA0KW1RvcF0oI3RvcC1saW5rKSAgW0JvdHRvbV0oI2JvdHRvbSk8YnI+DQoNCjxpPgkNCldoYXQgbmV4dCBzdGVwcyB3b3VsZCB5b3Ugb3IgeW91ciBzdGFrZWhvbGRlcnMgdGFrZSBiYXNlZCBvbiB5b3VyIGZpbmRpbmdzPyANCjxicj48L2k+PC9zdHJvbmc+DQoNClRoZSBNYXJrZXRpbmcgdGVhbSBtYXkgbmVlZCB0byByZXNlYXJjaCB0aGUgYmVuZWZpdHMgb2YgbGVzcyBzZWRlbnRhcnkgdGltZSwgY2Fsb3JpZSBleHBlbmRpdHVyZSwgYW5kIGxvbmdlciBzbGVlcCB3aXRoIGFjY3JlZGl0ZWQgc291cmNlcywgYW5kIGVkaXQgdGhhdCBpbmZvcm1hdGlvbiB0byBwcm92aWRlIGRpZ2VzdGlibGUgYmx1cmJzIGluIHRoZSBhcHAsIHdpdGggbGlua3MgdG8gdGhlIHNvdXJjZXMgZm9yIHRoZSB1c2VycyB0byBsZWFybiBtb3JlLg0KV29yayB3aXRoIHRoZSBhcHAgZGV2ZWxvcG1lbnQgdGVhbSB0byBsZWFybiB3aGF0IGRhdGEgaXMgY3VycmVudGx5IGJlaW5nIHRyYWNrZWQsIGFuZCB3aGF0IHdvdWxkIG5lZWQgdG8gYmUgYWRkZWQgaW4gb3JkZXIgdG8gbWFrZSBjaGFuZ2VzIHRvIHdoYXQgaXMgdHJhY2tlZC4gVGhlIGFwcCBhbmQgZGF0YWJhc2UgdGVhbXMgbWF5IGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIGZlYXR1cmVzIG9mIHRoZSBhcHAgdG8gYWxsb3cgdGhlIHVzZXJzIHRvIG9wdCBpbnRvIG5vdGlmaWNhdGlvbnMgdGhhdCByZW1pbmQgdGhlIHVzZXIgYWJvdXQgdGhlIG5ld2x5IHRyYWNrZWQgZGF0YSwgZWl0aGVyIHRocm91Z2ggc2V0dGluZ3Mgb3IgdGhyb3VnaCB0aGUgZWR1Y2F0aW9uYWwgYmx1cmJzIHRoYXQgYXJlIG9mZmVyZWQgaW4gdGhlIGFwcC4gIA0KIFRoZSBkYXRhYmFzZSBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgZGF0YSwgYW5kIGxpbWl0cyBvciBhZ2dyZWdhdGVzIG1heSBuZWVkIHRvIGJlIHN0b3JlZCByYXRoZXIgdGhhbiB0aGUgZmluZXIgZGV0YWlscyBhZnRlciBhIHBlcmlvZCBvZiB0aW1lLCBzbyBpdOKAmXMgcmV0cmlldmFibGUsIGFuZCByZXZpZXdhYmxlIGZvciBzb21lIHRpbWUuICANCglUaGUgTWFya2V0aW5nIHRlYW0gbWF5IGFsc28gd2FudCB0byBhcnJhbmdlIGEgbGFyZ2UgYWR2ZXJ0aXNlbWVudCBjYW1wYWlnbiBmb3IgdGhlIHNwcmluZywgdG8gcHJvdmlkZSB0aGUgc21hcnQgZGV2aWNlcyBhcyBhIHByb2R1Y3Qgc29sdXRpb24gdG8gdGhvc2Ugd2hvIG1heSBiZSB3b3JraW5nIHRvd2FyZHMgYSBoZWFsdGhpZXIgYm9keSBmb3IgdGhlIHN1bW1lciBzZWFzb24uICAgICAgIA0KPGk+PHN0cm9uZz4JICAgIA0KSXMgdGhlcmUgYWRkaXRpb25hbCBkYXRhIHlvdSBjb3VsZCB1c2UgdG8gZXhwYW5kIG9uIHlvdXIgZmluZGluZ3M/IA0KPGJyPjwvaT48L3N0cm9uZz4NCglBbnkgYWRkaXRpb25hbCBkYXRhIHRoYXQgQmVsbGFCZWF0IGNvdWxkIHByb3ZpZGUgYXMgdG8gd2hhdCB0aGV5IGFyZSBjdXJyZW50bHkgdHJhY2tpbmcgYW5kIG9mZmVyaW5nIGluIHRoZSBhcHAgbWF5IGJlIGJlc3QgdG8gbWFrZSBhIHByb3BlciBjb21wYXJpc29uLiAgDQoJPGJyPg0KCTxicj4NCgk8YnI+DQoJPGJyPg0KCQ0KW1RvcF0oI3RvcC1saW5rKQ0KDQpbXXsjYm90dG9tfQ==