Want to know more about our gum disease treatments? Or why maintaining healthy gums is so important? Download our FREE guide here!
Your Guide to Gum Disease

PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiA8IVtDREFUQVsgKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLSBKQVZBU0NSSVBUIEhPT0sgRlVOQ1RJT05TIEZPUiBHUkFWSVRZIEZPUk1TIC0tLS0tLS0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoICEgZ2Zvcm0gKSB7Cglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5zY3JpcHRzTG9hZGVkID0gdHJ1ZTsgfSApOwoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgZnVuY3Rpb24oKSB7IGdmb3JtLnRoZW1lU2NyaXB0c0xvYWRlZCA9IHRydWU7IH0gKTsKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5kb21Mb2FkZWQgPSB0cnVlOyB9ICk7CgoJdmFyIGdmb3JtID0gewoJCWRvbUxvYWRlZDogZmFsc2UsCgkJc2NyaXB0c0xvYWRlZDogZmFsc2UsCgkJdGhlbWVTY3JpcHRzTG9hZGVkOiBmYWxzZSwKCQlpc0Zvcm1FZGl0b3I6ICgpID0+IHR5cGVvZiBJbml0aWFsaXplRWRpdG9yID09PSAnZnVuY3Rpb24nLAoKCQkvKioKCQkgKiBAZGVwcmVjYXRlZCAyLjkgdGhlIHVzZSBvZiBpbml0aWFsaXplT25Mb2FkZWQgaW4gdGhlIGZvcm0gZWRpdG9yIGNvbnRleHQgaXMgZGVwcmVjYXRlZC4KCQkgKiBAcmVtb3ZlLWluIDMuMSB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoZWNrIGZvciBnZm9ybS5pc0Zvcm1FZGl0b3IoKS4KCQkgKi8KCQljYWxsSWZMb2FkZWQ6IGZ1bmN0aW9uICggZm4gKSB7CgkJCWlmICggZ2Zvcm0uZG9tTG9hZGVkICYmIGdmb3JtLnNjcmlwdHNMb2FkZWQgJiYgKCBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgfHwgZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSApIHsKCQkJCWlmICggZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSB7CgkJCQkJY29uc29sZS53YXJuKCAnVGhlIHVzZSBvZiBnZm9ybS5pbml0aWFsaXplT25Mb2FkZWQoKSBpcyBkZXByZWNhdGVkIGluIHRoZSBmb3JtIGVkaXRvciBjb250ZXh0IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3Jhdml0eSBGb3JtcyAzLjEuJyApOwoJCQkJfQoJCQkJZm4oKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvKioKCQkgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcGFyYW0gZnVuY3Rpb24gZm4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcmV0dXJucyB2b2lkCgkJICovCgkJaW5pdGlhbGl6ZU9uTG9hZGVkOiBmdW5jdGlvbiggZm4gKSB7CgkJCWlmICggISBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICkgKSB7CgkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsICgpID0+IHsgZ2Zvcm0uc2NyaXB0c0xvYWRlZCA9IHRydWU7IGdmb3JtLmNhbGxJZkxvYWRlZCggZm4gKTsgfSApOwoJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgKCkgPT4geyBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgPSB0cnVlOyBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICk7IH0gKTsKCQkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgZ2Zvcm0uZG9tTG9hZGVkID0gdHJ1ZTsgZ2Zvcm0uY2FsbElmTG9hZGVkKCBmbiApOyB9ICk7CgkJCX0KCQl9LAoKCQlob29rczogeyBhY3Rpb246IHt9LCBmaWx0ZXI6IHt9IH0sCgkJYWRkQWN0aW9uOiBmdW5jdGlvbiggYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJZ2Zvcm0uYWRkSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEZpbHRlcjogZnVuY3Rpb24oIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLmFkZEhvb2soICdmaWx0ZXInLCBhY3Rpb24sIGNhbGxhYmxlLCBwcmlvcml0eSwgdGFnICk7CgkJfSwKCQlkb0FjdGlvbjogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJZ2Zvcm0uZG9Ib29rKCAnYWN0aW9uJywgYWN0aW9uLCBhcmd1bWVudHMgKTsKCQl9LAoJCWFwcGx5RmlsdGVyczogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJcmV0dXJuIGdmb3JtLmRvSG9vayggJ2ZpbHRlcicsIGFjdGlvbiwgYXJndW1lbnRzICk7CgkJfSwKCQlyZW1vdmVBY3Rpb246IGZ1bmN0aW9uKCBhY3Rpb24sIHRhZyApIHsKCQkJZ2Zvcm0ucmVtb3ZlSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgdGFnICk7CgkJfSwKCQlyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uKCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLnJlbW92ZUhvb2soICdmaWx0ZXInLCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEhvb2s6IGZ1bmN0aW9uKCBob29rVHlwZSwgYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgPT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQlnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXSA9IFtdOwoJCQl9CgkJCXZhciBob29rcyA9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dOwoJCQlpZiAoIHVuZGVmaW5lZCA9PSB0YWcgKSB7CgkJCQl0YWcgPSBhY3Rpb24gKyAnXycgKyBob29rcy5sZW5ndGg7CgkJCX0KCQkJaWYoIHByaW9yaXR5ID09IHVuZGVmaW5lZCApewoJCQkJcHJpb3JpdHkgPSAxMDsKCQkJfQoKCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0ucHVzaCggeyB0YWc6dGFnLCBjYWxsYWJsZTpjYWxsYWJsZSwgcHJpb3JpdHk6cHJpb3JpdHkgfSApOwoJCX0sCgkJZG9Ib29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgYXJncyApIHsKCgkJCS8vIHNwbGljZSBhcmdzIGZyb20gb2JqZWN0IGludG8gYXJyYXkgYW5kIHJlbW92ZSBmaXJzdCBpbmRleCB3aGljaCBpcyB0aGUgaG9vayBuYW1lCgkJCWFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKTsKCgkJCWlmICggdW5kZWZpbmVkICE9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dICkgewoJCQkJdmFyIGhvb2tzID0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0sIGhvb2s7CgkJCQkvL3NvcnQgYnkgcHJpb3JpdHkKCQkJCWhvb2tzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsicHJpb3JpdHkiXS1iWyJwcmlvcml0eSJdfSk7CgoJCQkJaG9va3MuZm9yRWFjaCggZnVuY3Rpb24oIGhvb2tJdGVtICkgewoJCQkJCWhvb2sgPSBob29rSXRlbS5jYWxsYWJsZTsKCgkJCQkJaWYodHlwZW9mIGhvb2sgIT0gJ2Z1bmN0aW9uJykKCQkJCQkJaG9vayA9IHdpbmRvd1tob29rXTsKCQkJCQlpZiAoICdhY3Rpb24nID09IGhvb2tUeXBlICkgewoJCQkJCQlob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFyZ3NbMF0gPSBob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0KCQkJCX0gKTsKCQkJfQoJCQlpZiAoICdmaWx0ZXInPT1ob29rVHlwZSApIHsKCQkJCXJldHVybiBhcmdzWzBdOwoJCQl9CgkJfSwKCQlyZW1vdmVIb29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgIT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQl2YXIgaG9va3MgPSBnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXTsKCQkJCWhvb2tzID0gaG9va3MuZmlsdGVyKCBmdW5jdGlvbihob29rLCBpbmRleCwgYXJyKSB7CgkJCQkJdmFyIHJlbW92ZUhvb2sgPSAodW5kZWZpbmVkPT10YWd8fHRhZz09aG9vay50YWcpICYmICh1bmRlZmluZWQ9PXByaW9yaXR5fHxwcmlvcml0eT09aG9vay5wcmlvcml0eSk7CgkJCQkJcmV0dXJuICFyZW1vdmVIb29rOwoJCQkJfSApOwoJCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gPSBob29rczsKCQkJfQoJCX0KCX07Cn0KCi8qIF1dPiAqLwo8L3NjcmlwdD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdnZl9icm93c2VyX2dlY2tvIGdmb3JtX3dyYXBwZXIgZ2Zvcm1fbGVnYWN5X21hcmt1cF93cmFwcGVyIGdmb3JtLXRoZW1lLS1uby1mcmFtZXdvcmsgY29udGFjdC1mb3Jtc193cmFwcGVyIGdwbGFjZWhvbGRlcl93cmFwcGVyJyBkYXRhLWZvcm0tdGhlbWU9J2xlZ2FjeScgZGF0YS1mb3JtLWluZGV4PScwJyBpZD0nZ2Zvcm1fd3JhcHBlcl8xMScgPjxkaXYgaWQ9J2dmXzExJyBjbGFzcz0nZ2Zvcm1fYW5jaG9yJyB0YWJpbmRleD0nLTEnPjwvZGl2Pjxmb3JtIG1ldGhvZD0ncG9zdCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YScgdGFyZ2V0PSdnZm9ybV9hamF4X2ZyYW1lXzExJyBpZD0nZ2Zvcm1fMTEnIGNsYXNzPSdjb250YWN0LWZvcm1zIGdwbGFjZWhvbGRlcicgYWN0aW9uPScvd2h5LWNob29zZS11cy8jZ2ZfMTEnIGRhdGEtZm9ybWlkPScxMScgbm92YWxpZGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZ2Zvcm0tYm9keSBnZm9ybV9ib2R5Jz48dWwgaWQ9J2dmb3JtX2ZpZWxkc18xMScgY2xhc3M9J2dmb3JtX2ZpZWxkcyB0b3BfbGFiZWwgZm9ybV9zdWJsYWJlbF9iZWxvdyBkZXNjcmlwdGlvbl9iZWxvdyB2YWxpZGF0aW9uX2JlbG93Jz48bGkgaWQ9ImZpZWxkXzExXzEwIiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS10ZXh0IGdmaWVsZF9jb250YWluc19yZXF1aXJlZCBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGhpZGRlbl9sYWJlbCBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMTAiID48bGFiZWwgY2xhc3M9J2dmaWVsZF9sYWJlbCBnZm9ybS1maWVsZC1sYWJlbCcgZm9yPSdpbnB1dF8xMV8xMCc+WW91ciBOYW1lPHNwYW4gY2xhc3M9ImdmaWVsZF9yZXF1aXJlZCI+PHNwYW4gY2xhc3M9ImdmaWVsZF9yZXF1aXJlZCBnZmllbGRfcmVxdWlyZWRfYXN0ZXJpc2siPio8L3NwYW4+PC9zcGFuPjwvbGFiZWw+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8xMCcgaWQ9J2lucHV0XzExXzEwJyB0eXBlPSd0ZXh0JyB2YWx1ZT0nJyBjbGFzcz0nbGFyZ2UnICAgdGFiaW5kZXg9JzUwJyBwbGFjZWhvbGRlcj0nWW91ciBOYW1lIConIGFyaWEtcmVxdWlyZWQ9InRydWUiIGFyaWEtaW52YWxpZD0iZmFsc2UiICAgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMyIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtZW1haWwgZ2ZpZWxkX2NvbnRhaW5zX3JlcXVpcmVkIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgaGlkZGVuX2xhYmVsIGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8zIiA+PGxhYmVsIGNsYXNzPSdnZmllbGRfbGFiZWwgZ2Zvcm0tZmllbGQtbGFiZWwnIGZvcj0naW5wdXRfMTFfMyc+WW91ciBFbWFpbDxzcGFuIGNsYXNzPSJnZmllbGRfcmVxdWlyZWQiPjxzcGFuIGNsYXNzPSJnZmllbGRfcmVxdWlyZWQgZ2ZpZWxkX3JlcXVpcmVkX2FzdGVyaXNrIj4qPC9zcGFuPjwvc3Bhbj48L2xhYmVsPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl9lbWFpbCc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0naW5wdXRfMycgaWQ9J2lucHV0XzExXzMnIHR5cGU9J2VtYWlsJyB2YWx1ZT0nJyBjbGFzcz0nbGFyZ2UnIHRhYmluZGV4PSc1MScgIHBsYWNlaG9sZGVyPSdZb3VyIEVtYWlsIConIGFyaWEtcmVxdWlyZWQ9InRydWUiIGFyaWEtaW52YWxpZD0iZmFsc2UiICAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMTciIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhpZGRlbiBnZm9ybV9oaWRkZW4gZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMTciID48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzE3JyBpZD0naW5wdXRfMTFfMTcnIHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgIGFyaWEtaW52YWxpZD0iZmFsc2UiIHZhbHVlPScxMjQ1JyAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8xNSIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaGlkZGVuIGdmb3JtX2hpZGRlbiBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8xNSIgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTUnIGlkPSdpbnB1dF8xMV8xNScgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9J0d1bSBEaXNlYXNlIEd1aWRlJyAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8xNiIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaGlkZGVuIGdmb3JtX2hpZGRlbiBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8xNiIgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTYnIGlkPSdpbnB1dF8xMV8xNicgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9JycgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMTgiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhpZGRlbiBnZm9ybV9oaWRkZW4gZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMTgiID48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzE4JyBpZD0naW5wdXRfMTFfMTgnIHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgIGFyaWEtaW52YWxpZD0iZmFsc2UiIHZhbHVlPScnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzIwIiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzIwIiA+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8yMCcgaWQ9J2lucHV0XzExXzIwJyB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nICBhcmlhLWludmFsaWQ9ImZhbHNlIiB2YWx1ZT0nJyAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8yMSIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaG9uZXlwb3QgZ2Zvcm1fdmFsaWRhdGlvbl9jb250YWluZXIgZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1oYXMtZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzIxIiA+PGxhYmVsIGNsYXNzPSdnZmllbGRfbGFiZWwgZ2Zvcm0tZmllbGQtbGFiZWwnIGZvcj0naW5wdXRfMTFfMjEnPlBob25lPC9sYWJlbD48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyJz48aW5wdXQgbmFtZT0naW5wdXRfMjEnIGlkPSdpbnB1dF8xMV8yMScgdHlwZT0ndGV4dCcgdmFsdWU9JycgYXV0b2NvbXBsZXRlPSduZXctcGFzc3dvcmQnLz48L2Rpdj48ZGl2IGNsYXNzPSdnZmllbGRfZGVzY3JpcHRpb24nIGlkPSdnZmllbGRfZGVzY3JpcHRpb25fMTFfMjEnPlRoaXMgZmllbGQgaXMgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMgYW5kIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC48L2Rpdj48L2xpPjwvdWw+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0nZ2Zvcm0tZm9vdGVyIGdmb3JtX2Zvb3RlciB0b3BfbGFiZWwnPiAKCQk8ZGl2IGNsYXNzPSJzZWN0aW9uLWJ1dHRvbiI+CgkgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBpZD0iZ2Zvcm1fc3VibWl0X2J1dHRvbl8xMSIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+CgkJICAgICAgICBEb3dubG9hZCBub3cKCQkJPC9idXR0b24+CgkJPC9kaXY+CiAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZ2Zvcm1fYWpheCcgdmFsdWU9J2Zvcm1faWQ9MTEmYW1wO3RpdGxlPSZhbXA7ZGVzY3JpcHRpb249JmFtcDt0YWJpbmRleD01MCZhbXA7dGhlbWU9bGVnYWN5JmFtcDtzdHlsZXM9W10mYW1wO2hhc2g9ZTI4MmQ2YzNmOTYwNjM1ZGM2NzhiNjc4NjE3ZDQ0NzAnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3N1Ym1pc3Npb25fbWV0aG9kJyBkYXRhLWpzPSdnZm9ybV9zdWJtaXNzaW9uX21ldGhvZF8xMScgdmFsdWU9J2lmcmFtZScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fdGhlbWUnIGRhdGEtanM9J2dmb3JtX3RoZW1lXzExJyBpZD0nZ2Zvcm1fdGhlbWVfMTEnIHZhbHVlPSdsZWdhY3knIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3N0eWxlX3NldHRpbmdzJyBkYXRhLWpzPSdnZm9ybV9zdHlsZV9zZXR0aW5nc18xMScgaWQ9J2dmb3JtX3N0eWxlX3NldHRpbmdzXzExJyB2YWx1ZT0nW10nIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2lzX3N1Ym1pdF8xMScgdmFsdWU9JzEnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3N1Ym1pdCcgdmFsdWU9JzExJyAvPgogICAgICAgICAgICAKICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fdW5pcXVlX2lkJyB2YWx1ZT0nJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdzdGF0ZV8xMScgdmFsdWU9J1d5SmJYU0lzSW1VME1XRm1NMlJtTkRJd01tUTJObVl4T1dFNFpETTJPVFF5Tm1ZNFpHWTBJbDA9JyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBhdXRvY29tcGxldGU9J29mZicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fdGFyZ2V0X3BhZ2VfbnVtYmVyXzExJyBpZD0nZ2Zvcm1fdGFyZ2V0X3BhZ2VfbnVtYmVyXzExJyB2YWx1ZT0nMCcgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgYXV0b2NvbXBsZXRlPSdvZmYnIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3NvdXJjZV9wYWdlX251bWJlcl8xMScgaWQ9J2dmb3JtX3NvdXJjZV9wYWdlX251bWJlcl8xMScgdmFsdWU9JzEnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2dmb3JtX2ZpZWxkX3ZhbHVlcycgdmFsdWU9J2Vib29rX2lkPTEyNDUmYW1wO2Vib29rX2FjdGl2ZV9jYW1wYWlnbl90YWc9R3VtK0Rpc2Vhc2UrR3VpZGUnIC8+CiAgICAgICAgICAgIAogICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoJCSAgICAgICAgICAgICAgICA8aWZyYW1lIHN0eWxlPSdkaXNwbGF5Om5vbmU7d2lkdGg6MHB4O2hlaWdodDowcHg7JyBzcmM9J2Fib3V0OmJsYW5rJyBuYW1lPSdnZm9ybV9hamF4X2ZyYW1lXzExJyBpZD0nZ2Zvcm1fYWpheF9mcmFtZV8xMScgdGl0bGU9J1RoaXMgaWZyYW1lIGNvbnRhaW5zIHRoZSBsb2dpYyByZXF1aXJlZCB0byBoYW5kbGUgQWpheCBwb3dlcmVkIEdyYXZpdHkgRm9ybXMuJz48L2lmcmFtZT4KCQkgICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiA8IVtDREFUQVsgKi8KIGdmb3JtLmluaXRpYWxpemVPbkxvYWRlZCggZnVuY3Rpb24oKSB7Z2Zvcm1Jbml0U3Bpbm5lciggMTEsICdodHRwczovL3BhY2lmaWNwZXJpby5jb20uYXUvd3AtY29udGVudC9wbHVnaW5zL2dyYXZpdHlmb3Jtcy9pbWFnZXMvc3Bpbm5lci5zdmcnLCB0cnVlICk7alF1ZXJ5KCcjZ2Zvcm1fYWpheF9mcmFtZV8xMScpLm9uKCdsb2FkJyxmdW5jdGlvbigpe3ZhciBjb250ZW50cyA9IGpRdWVyeSh0aGlzKS5jb250ZW50cygpLmZpbmQoJyonKS5odG1sKCk7dmFyIGlzX3Bvc3RiYWNrID0gY29udGVudHMuaW5kZXhPZignR0ZfQUpBWF9QT1NUQkFDSycpID49IDA7aWYoIWlzX3Bvc3RiYWNrKXtyZXR1cm47fXZhciBmb3JtX2NvbnRlbnQgPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcjZ2Zvcm1fd3JhcHBlcl8xMScpO3ZhciBpc19jb25maXJtYXRpb24gPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcjZ2Zvcm1fY29uZmlybWF0aW9uX3dyYXBwZXJfMTEnKS5sZW5ndGggPiAwO3ZhciBpc19yZWRpcmVjdCA9IGNvbnRlbnRzLmluZGV4T2YoJ2dmb3JtUmVkaXJlY3QoKXsnKSA+PSAwO3ZhciBpc19mb3JtID0gZm9ybV9jb250ZW50Lmxlbmd0aCA+IDAgJiYgISBpc19yZWRpcmVjdCAmJiAhIGlzX2NvbmZpcm1hdGlvbjt2YXIgbXQgPSBwYXJzZUludChqUXVlcnkoJ2h0bWwnKS5jc3MoJ21hcmdpbi10b3AnKSwgMTApICsgcGFyc2VJbnQoalF1ZXJ5KCdib2R5JykuY3NzKCdtYXJnaW4tdG9wJyksIDEwKSArIDEwMDtpZihpc19mb3JtKXtqUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykuaHRtbChmb3JtX2NvbnRlbnQuaHRtbCgpKTtpZihmb3JtX2NvbnRlbnQuaGFzQ2xhc3MoJ2dmb3JtX3ZhbGlkYXRpb25fZXJyb3InKSl7alF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLmFkZENsYXNzKCdnZm9ybV92YWxpZGF0aW9uX2Vycm9yJyk7fSBlbHNlIHtqUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykucmVtb3ZlQ2xhc3MoJ2dmb3JtX3ZhbGlkYXRpb25fZXJyb3InKTt9c2V0VGltZW91dCggZnVuY3Rpb24oKSB7IC8qIGRlbGF5IHRoZSBzY3JvbGwgYnkgNTAgbWlsbGlzZWNvbmRzIHRvIGZpeCBhIGJ1ZyBpbiBjaHJvbWUgKi8galF1ZXJ5KGRvY3VtZW50KS5zY3JvbGxUb3AoalF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLm9mZnNldCgpLnRvcCAtIG10KTsgfSwgNTAgKTtpZih3aW5kb3dbJ2dmb3JtSW5pdERhdGVwaWNrZXInXSkge2dmb3JtSW5pdERhdGVwaWNrZXIoKTt9aWYod2luZG93WydnZm9ybUluaXRQcmljZUZpZWxkcyddKSB7Z2Zvcm1Jbml0UHJpY2VGaWVsZHMoKTt9dmFyIGN1cnJlbnRfcGFnZSA9IGpRdWVyeSgnI2dmb3JtX3NvdXJjZV9wYWdlX251bWJlcl8xMScpLnZhbCgpO2dmb3JtSW5pdFNwaW5uZXIoIDExLCAnaHR0cHM6Ly9wYWNpZmljcGVyaW8uY29tLmF1L3dwLWNvbnRlbnQvcGx1Z2lucy9ncmF2aXR5Zm9ybXMvaW1hZ2VzL3NwaW5uZXIuc3ZnJywgdHJ1ZSApO2pRdWVyeShkb2N1bWVudCkudHJpZ2dlcignZ2Zvcm1fcGFnZV9sb2FkZWQnLCBbMTEsIGN1cnJlbnRfcGFnZV0pO3dpbmRvd1snZ2Zfc3VibWl0dGluZ18xMSddID0gZmFsc2U7fWVsc2UgaWYoIWlzX3JlZGlyZWN0KXt2YXIgY29uZmlybWF0aW9uX2NvbnRlbnQgPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcuR0ZfQUpBWF9QT1NUQkFDSycpLmh0bWwoKTtpZighY29uZmlybWF0aW9uX2NvbnRlbnQpe2NvbmZpcm1hdGlvbl9jb250ZW50ID0gY29udGVudHM7fWpRdWVyeSgnI2dmb3JtX3dyYXBwZXJfMTEnKS5yZXBsYWNlV2l0aChjb25maXJtYXRpb25fY29udGVudCk7alF1ZXJ5KGRvY3VtZW50KS5zY3JvbGxUb3AoalF1ZXJ5KCcjZ2ZfMTEnKS5vZmZzZXQoKS50b3AgLSBtdCk7alF1ZXJ5KGRvY3VtZW50KS50cmlnZ2VyKCdnZm9ybV9jb25maXJtYXRpb25fbG9hZGVkJywgWzExXSk7d2luZG93WydnZl9zdWJtaXR0aW5nXzExJ10gPSBmYWxzZTt3cC5hMTF5LnNwZWFrKGpRdWVyeSgnI2dmb3JtX2NvbmZpcm1hdGlvbl9tZXNzYWdlXzExJykudGV4dCgpKTt9ZWxzZXtqUXVlcnkoJyNnZm9ybV8xMScpLmFwcGVuZChjb250ZW50cyk7aWYod2luZG93WydnZm9ybVJlZGlyZWN0J10pIHtnZm9ybVJlZGlyZWN0KCk7fX1qUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXIoImdmb3JtX3ByZV9wb3N0X3JlbmRlciIsIFt7IGZvcm1JZDogIjExIiwgY3VycmVudFBhZ2U6ICJjdXJyZW50X3BhZ2UiLCBhYm9ydDogZnVuY3Rpb24oKSB7IHRoaXMucHJldmVudERlZmF1bHQoKTsgfSB9XSk7ICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7ICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICB9ICAgICAgICBjb25zdCBnZm9ybVdyYXBwZXJEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggImdmb3JtX3dyYXBwZXJfMTEiICk7ICAgICAgICBpZiAoIGdmb3JtV3JhcHBlckRpdiApIHsgICAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzcGFuIiApOyAgICAgICAgICAgIHZpc2liaWxpdHlTcGFuLmlkID0gImdmb3JtX3Zpc2liaWxpdHlfdGVzdF8xMSI7ICAgICAgICAgICAgZ2Zvcm1XcmFwcGVyRGl2Lmluc2VydEFkamFjZW50RWxlbWVudCggImFmdGVyZW5kIiwgdmlzaWJpbGl0eVNwYW4gKTsgICAgICAgIH0gICAgICAgIGNvbnN0IHZpc2liaWxpdHlUZXN0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJnZm9ybV92aXNpYmlsaXR5X3Rlc3RfMTEiICk7ICAgICAgICBsZXQgcG9zdFJlbmRlckZpcmVkID0gZmFsc2U7ICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyaWdnZXJQb3N0UmVuZGVyKCkgeyAgICAgICAgICAgIGlmICggcG9zdFJlbmRlckZpcmVkICkgeyAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgfSAgICAgICAgICAgIHBvc3RSZW5kZXJGaXJlZCA9IHRydWU7ICAgICAgICAgICAgZ2Zvcm0uY29yZS50cmlnZ2VyUG9zdFJlbmRlckV2ZW50cyggMTEsIGN1cnJlbnRfcGFnZSApOyAgICAgICAgICAgIGlmICggdmlzaWJpbGl0eVRlc3REaXYgKSB7ICAgICAgICAgICAgICAgIHZpc2liaWxpdHlUZXN0RGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHZpc2liaWxpdHlUZXN0RGl2ICk7ICAgICAgICAgICAgfSAgICAgICAgfSAgICAgICAgZnVuY3Rpb24gZGVib3VuY2UoIGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSApIHsgICAgICAgICAgICB2YXIgdGltZW91dDsgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7ICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgICAgICAgICAgICAgICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7ICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDsgICAgICAgICAgICAgICAgICAgIGlmICggIWltbWVkaWF0ZSApIGZ1bmMuYXBwbHkoIGNvbnRleHQsIGFyZ3MgKTsgICAgICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7ICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCggdGltZW91dCApOyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCggbGF0ZXIsIHdhaXQgKTsgICAgICAgICAgICAgICAgaWYgKCBjYWxsTm93ICkgZnVuYy5hcHBseSggY29udGV4dCwgYXJncyApOyAgICAgICAgICAgIH07ICAgICAgICB9ICAgICAgICBjb25zdCBkZWJvdW5jZWRUcmlnZ2VyUG9zdFJlbmRlciA9IGRlYm91bmNlKCBmdW5jdGlvbigpIHsgICAgICAgICAgICB0cmlnZ2VyUG9zdFJlbmRlcigpOyAgICAgICAgfSwgMjAwICk7ICAgICAgICBpZiAoIHZpc2liaWxpdHlUZXN0RGl2ICYmIHZpc2liaWxpdHlUZXN0RGl2Lm9mZnNldFBhcmVudCA9PT0gbnVsbCApIHsgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCAoIG11dGF0aW9ucyApID0+IHsgICAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goICggbXV0YXRpb24gKSA9PiB7ICAgICAgICAgICAgICAgICAgICBpZiAoIG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiB2aXNpYmlsaXR5VGVzdERpdi5vZmZzZXRQYXJlbnQgIT09IG51bGwgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VkVHJpZ2dlclBvc3RSZW5kZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7ICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgIH0pOyAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoIGRvY3VtZW50LmJvZHksIHsgICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiBmYWxzZSwgICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwgICAgICAgICAgICAgICAgYXR0cmlidXRlRmlsdGVyOiBbICdzdHlsZScsICdjbGFzcycgXSwgICAgICAgICAgICB9KTsgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgdHJpZ2dlclBvc3RSZW5kZXIoKTsgICAgICAgIH0gICAgfSApO30gKTsgCi8qIF1dPiAqLwo8L3NjcmlwdD4K