Skip to content

Instantly share code, notes, and snippets.

@grvcoelho
Created December 28, 2014 17:42
Show Gist options
  • Save grvcoelho/60d5926b3f908607052e to your computer and use it in GitHub Desktop.
Save grvcoelho/60d5926b3f908607052e to your computer and use it in GitHub Desktop.
MYjqLq
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Material Design Ripple Effect</title>
</head>
<body>
<div class="btn"></div>
</body>
</html>
(function($, window, document, undefined) {
'use strict';
/**
* Define the name of the plugin
*/
var ripple = 'ripple';
/**
* Get an instance of the plugin
*/
var self = null;
/**
* Define the defaults of the plugin
*/
var defaults = {};
/**
* Create the main plugin function
*/
function Ripples(element, options) {
self = this;
this.element = $(element);
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = ripple;
this.init();
}
/**
* Initialize the plugin
*/
Ripples.prototype.init = function() {
var $element = this.element;
$element.on('mousedown touchstart', function(event) {
/**
* Verify if the user is just touching on a device and return if so
*/
if(self.isTouch() && event.type === 'mousedown') {
return false;
}
/**
* Verify if the current element already has a ripple wrapper element and
* creates if it doesn't
*/
if(!($element.find('.ripple-wrapper').length)) {
$element.append('<div class="ripple-wrapper"></div>');
}
/**
* Find the ripple wrapper
*/
var $wrapper = $element.find('.ripple-wrapper');
/**
* Get relY and relX positions
*/
var relY = self.getRelY(event);
var relX = self.getRelX(event);
/**
* If relY and/or relX are false, return the event
*/
if(!relY && !relX) {
return;
}
/**
* Get the ripple color
*/
var rippleColor = self.getRippleColor();
/**
* Create the ripple element
*/
var $ripple = $('<div></div>');
$ripple
.addClass('ripple')
.css({
'left': relX,
'top': relY,
'background-color': rippleColor
});
/**
* Append the ripple to the wrapper
*/
$wrapper.append($ripple);
/**
* Make sure the ripple has the styles applied (ugly hack but it works)
*/
(function() { return window.getComputedStyle($ripple[0]).opacity; })();
/**
* Turn on the ripple animation
*/
self.rippleOn($ripple);
/**
* Call the rippleEnd function when the transition 'on' ends
*/
setTimeout(function() {
self.rippleEnd($ripple);
}, 500);
/**
* Detect when the user leaves the element
*/
$element.on('mouseup mouseleave touchend', function() {
$ripple.data('mousedown', 'off');
if($ripple.data('animating') === 'off') {
self.rippleOut($ripple);
}
});
});
};
/**
* Get the new size based on the element height/width and the ripple width
*/
Ripples.prototype.getNewSize = function($ripple) {
var $element = this.element;
return (Math.max($element.outerWidth(), $element.outerHeight()) / $ripple.outerWidth()) * 2.5;
};
/**
* Get the relX
*/
Ripples.prototype.getRelX = function(event) {
var $element = this.element;
var wrapperOffset = $element.find('.ripple-wrapper').offset();
if(!self.isTouch()) {
/**
* Get the mouse position relative to the ripple wrapper
*/
return event.pageX - wrapperOffset.left;
} else {
/**
* Make sure the user is using only one finger and then get the touch
* position relative to the ripple wrapper
*/
event = event.originalEvent;
if(event.touches.length !== 1) {
return event.touches[0].pageX - wrapperOffset.left;
}
return false;
}
};
/**
* Get the relY
*/
Ripples.prototype.getRelY = function(event) {
var $element = this.element;
var wrapperOffset = $element.find('.ripple-wrapper').offset();
if(!self.isTouch()) {
/**
* Get the mouse position relative to the ripple wrapper
*/
return event.pageY - wrapperOffset.top;
} else {
/**
* Make sure the user is using only one finger and then get the touch
* position relative to the ripple wrapper
*/
event = event.originalEvent;
if(event.touches.length !== 1) {
return event.touches[0].pageY - wrapperOffset.top;
}
return false;
}
};
/**
* Get the ripple color
*/
Ripples.prototype.getRippleColor = function() {
var $element = this.element;
var color = $element.data('ripple-color') ? $element.data('ripple-color') : window.getComputedStyle($element[0]).color;
return color;
};
/**
* Verify if the client browser has transistion support
*/
Ripples.prototype.hasTransitionSupport = function() {
var thisBody = document.body || document.documentElement;
var thisStyle = thisBody.style;
var support = (
thisStyle.transition !== undefined ||
thisStyle.WebkitTransition !== undefined ||
thisStyle.MozTransition !== undefined ||
thisStyle.MsTransition !== undefined ||
thisStyle.OTransition !== undefined
);
return support;
};
/**
* Verify if the client is using a mobile device
*/
Ripples.prototype.isTouch = function() {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
};
/**
* End the animation of the ripple
*/
Ripples.prototype.rippleEnd = function($ripple) {
$ripple.data('animating', 'off');
if($ripple.data('mousedown') === 'off') {
self.rippleOut($ripple);
}
};
/**
* Turn off the ripple effect
*/
Ripples.prototype.rippleOut = function($ripple) {
$ripple.off();
if(self.hasTransitionSupport()) {
$ripple.addClass('ripple-out');
} else {
$ripple.animate({'opacity': 0}, 100, function() {
$ripple.trigger('transitionend');
});
}
$ripple.on('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function() {
$ripple.remove();
});
};
/**
* Turn on the ripple effect
*/
Ripples.prototype.rippleOn = function($ripple) {
var size = self.getNewSize($ripple);
var $element = this.element;
if(self.hasTransitionSupport()) {
$ripple
.css({
'-ms-transform': 'scale(' + size + ')',
'-moz-transform': 'scale(' + size + ')',
'-webkit-transform': 'scale(' + size + ')',
'transform': 'scale(' + size + ')'
})
.addClass('ripple-on')
.data('animating', 'on')
.data('mousedown', 'on');
} else {
$ripple.animate({
'width': Math.max($element.outerWidth(), $element.outerHeight()) * 2,
'height': Math.max($element.outerWidth(), $element.outerHeight()) * 2,
'margin-left': Math.max($element.outerWidth(), $element.outerHeight()) * (-1),
'margin-top': Math.max($element.outerWidth(), $element.outerHeight()) * (-1),
'opacity': 0.2
}, 500, function() {
$ripple.trigger('transitionend');
});
}
};
/**
* Create the jquery plugin function
*/
$.fn.ripple = function(options) {
return this.each(function() {
if(!$.data(this, 'plugin_' + ripple)) {
$.data(this, 'plugin_' + ripple, new Ripples(this, options));
}
});
};
})(jQuery, window, document);
$(document).ready(function() {
$('.btn').ripple();
})
.btn {
position: relative;
background: #283593;
display: inline-block;
margin: 20px;
width: 200px; height: 200px;
color: #fff;
border-radius: 50%
}
.ripple-wrapper {
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 100%;
height: 100%;
overflow: hidden;
border-radius: inherit;
pointer-events: none;
}
.ripple {
position: absolute;
width: 20px;
height: 20px;
margin-left: -10px;
margin-top: -10px;
border-radius: 100%;
background-color: rgba(0,0,0,0.05);
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
-webkit-transform-origin: 50%;
-ms-transform-origin: 50%;
transform-origin: 50%;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
pointer-events: none;
}
.ripple.ripple-on {
-webkit-transition: opacity 0.15s ease-in 0s, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;
transition: opacity 0.15s ease-in 0s, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)";
filter: alpha(opacity=15);
opacity: 0.15;
}
.ripple.ripple-out {
-webkit-transition: opacity 0.1s linear 0s !important;
transition: opacity 0.1s linear 0s !important;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
}
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdHlsL3JpcHBsZS5zdHlsIiwiLi4vbm9kZV9tb2R1bGVzL2tvdXRvLXN3aXNzL2xpYi9rb3V0by1zd2lzcy91dGlsaXRpZXMvb3ZlcmZsb3cuc3R5bCIsIi4uL25vZGVfbW9kdWxlcy9rb3V0by1zd2lzcy9saWIva291dG8tc3dpc3MvbWl4aW5zL3ZlbmRvcnMuc3R5bCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTtFQUNFLFVBQVMsU0FBVDtFQUNBLEtBQUksRUFBSjtFQUNBLE1BQUssRUFBTDtFQUNBLFNBQVEsRUFBUjtFQUNBLE9BQU0sS0FBTjtFQUNBLFFBQU8sS0FBUDtFQ0ZNLFVBQVMsT0FBVDtFRElOLGVBQWMsUUFBZDtFQUNBLGdCQUFlLEtBQWY7O0FBRUY7RUFDRSxVQUFTLFNBQVQ7RUFDQSxPQUFNLEtBQU47RUFDQSxRQUFPLEtBQVA7RUFDQSxhQUFZLE1BQVo7RUFDQSxZQUFXLE1BQVg7RUFDQSxlQUFjLEtBQWQ7RUFDQSxrQkFBbUMsaUJBQW5DO0VFYitCLG1CQUFHLFNBQUg7RUFBQSxlQUFHLFNBQUg7RUFTaEIsV0FBRyxTQUFIO0VBVGdCLDBCQUFHLElBQUg7RUFBQSxzQkFBRyxJQUFIO0VBU2hCLGtCQUFHLElBQUg7RUFpSUQsWUFBc0UscURBQXRFO0VBQ0EsUUFBOEIsaUJBQTlCO0VBQ1IsU0FBUSxFQUFSO0VGM0hOLGdCQUFlLEtBQWY7O0FBRUY7RUVuQmlDLG9CQUFHLDJFQUFIO0VBU2hCLFlBQUcsMkVBQUg7RUFpSUQsWUFBc0Usc0RBQXRFO0VBQ0EsUUFBOEIsa0JBQTlCO0VBQ1IsU0FBUSxLQUFSOztBRnJIUjtFRXZCaUMsb0JBQUcsa0NBQUg7RUFTaEIsWUFBRyxrQ0FBSDtFQWlJRCxZQUFzRSxxREFBdEU7RUFDQSxRQUE4QixpQkFBOUI7RUFDUixTQUFRLEVBQVIiLCJmaWxlIjoicmlwcGxlLmNzcyIsInNvdXJjZVJvb3QiOiIuLiIsInNvdXJjZXNDb250ZW50IjpbIkBpbXBvcnQgJ2tvdXRvLXN3aXNzJ1xyXG5cclxuLnJpcHBsZS13cmFwcGVyXHJcbiAgcG9zaXRpb24gYWJzb2x1dGVcclxuICB0b3AgMFxyXG4gIGxlZnQgMFxyXG4gIHotaW5kZXggMVxyXG4gIHdpZHRoIDEwMCVcclxuICBoZWlnaHQgMTAwJVxyXG4gIG92ZXJmbG93IGhpZGRlblxyXG4gIGJvcmRlci1yYWRpdXMgaW5oZXJpdFxyXG4gIHBvaW50ZXItZXZlbnRzIG5vbmVcclxuXHJcbi5yaXBwbGVcclxuICBwb3NpdGlvbiBhYnNvbHV0ZVxyXG4gIHdpZHRoIDIwcHhcclxuICBoZWlnaHQgMjBweFxyXG4gIG1hcmdpbi1sZWZ0IC0xMHB4XHJcbiAgbWFyZ2luLXRvcCAtMTBweFxyXG4gIGJvcmRlci1yYWRpdXMgMTAwJVxyXG4gIGJhY2tncm91bmQtY29sb3IgcmdiYSgwLCAwLCAwLCAwLjA1KVxyXG4gIHRyYW5zZm9ybSBzY2FsZSgxKVxyXG4gIHRyYW5zZm9ybS1vcmlnaW4gNTAlXHJcbiAgb3BhY2l0eSAwXHJcbiAgcG9pbnRlci1ldmVudHMgbm9uZVxyXG5cclxuLnJpcHBsZS5yaXBwbGUtb25cclxuICB0cmFuc2l0aW9uIG9wYWNpdHkgMC4xNXMgZWFzZS1pbiAwcywgdHJhbnNmb3JtIDAuNXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSAwLjFzXHJcbiAgb3BhY2l0eSAwLjE1XHJcblxyXG4ucmlwcGxlLnJpcHBsZS1vdXRcclxuICB0cmFuc2l0aW9uIG9wYWNpdHkgMC4xcyBsaW5lYXIgMHMgIWltcG9ydGFudFxyXG4gIG9wYWNpdHkgMCIsImtzLW92ZXJmbG93KCB2YWx1ZSwgYXJncy4uLiApXG4gICAgaWYgdmFsdWUgPT0gZWxsaXBzaXNcbiAgICAgICAgd2hpdGUtc3BhY2Ugbm93cmFwXG4gICAgICAgIHRleHQtb3ZlcmZsb3cgZWxsaXBzaXNcbiAgICAgICAgb3ZlcmZsb3cgaGlkZGVuXG4gICAgZWxzZVxuICAgICAgICBvdmVyZmxvdyB2YWx1ZSBhcmdzXG5cbm92ZXJmbG93ID0ga3Mtb3ZlcmZsb3cgdW5sZXNzIGtzLW5vLWNvbmZsaWN0XG4iLCJrcy12ZW5kb3JzLXByZWZpeGVzID0gcmVjb21tZW5kZWRcblxua3MtdmVuZG9yKCBwcm9wZXJ0eSwgdmFsdWUsIGZlYXR1cmUgPSBudWxsLCBwcmVmaXhlcyA9IG51bGwsIG9mZmljaWFsID0gdHJ1ZSApXG4gICAgdW5sZXNzIFwidmVuZG9yXCIgaW4gY2FsbGVkLWZyb21cbiAgICAgICAgaWYgZmVhdHVyZSBpc250IG51bGwgYW5kICEoIGZlYXR1cmUgaW4ga3Mtc3VwcG9ydC1pZ25vcmUtZmVhdHVyZXMgKVxuICAgICAgICAgICAgZm9yIHByZWZpeCBpbiBjYW5pdXNlLXByZWZpeGVzKCBmZWF0dXJlIClcbiAgICAgICAgICAgICAgICBwcmVmaXhlZHByb3BlcnR5ID0gXCItXCIgKyBwcmVmaXggKyBcIi1cIiArIHByb3BlcnR5XG4gICAgICAgICAgICAgICAge3ByZWZpeGVkcHJvcGVydHl9OiB2YWx1ZVxuICAgICAgICBlbHNlIGlmIGtzLXZlbmRvcnMtcHJlZml4ZXMgaXNudCBmYWxzZVxuICAgICAgICAgICAgICAgIGlmIGtzLXZlbmRvcnMtcHJlZml4ZXMgaXNudCByZWNvbW1lbmRlZFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcyA9IGtzLXZlbmRvcnMtcHJlZml4ZXNcbiAgICAgICAgICAgICAgICBpZiBwcmVmaXhlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlZHByb3BlcnR5ID0gXCItXCIgKyBwcmVmaXggKyBcIi1cIiArIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICB7cHJlZml4ZWRwcm9wZXJ0eX06IHZhbHVlXG4gICAgaWYgb2ZmaWNpYWxcbiAgICAgICAge3Byb3BlcnR5fTogdmFsdWVcblxudmVuZG9yID0ga3MtdmVuZG9yIHVubGVzcyBrcy1uby1jb25mbGljdFxuXG51bmxlc3Mga3Mtbm8tY29uZmxpY3RcbiAgICBhbmltYXRpb24oKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYW5pbWF0aW9uXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtYW5pbWF0aW9uXCIgKVxuICAgIGFuaW1hdGlvbi1kZWxheSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJhbmltYXRpb24tZGVsYXlcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1hbmltYXRpb25cIiApXG4gICAgYW5pbWF0aW9uLWRpcmVjdGlvbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJhbmltYXRpb24tZGlyZWN0aW9uXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtYW5pbWF0aW9uXCIgKVxuICAgIGFuaW1hdGlvbi1kdXJhdGlvbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJhbmltYXRpb24tZHVyYXRpb25cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1hbmltYXRpb25cIiApXG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJhbmltYXRpb24tZmlsbC1tb2RlXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtYW5pbWF0aW9uXCIgKVxuICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudFwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWFuaW1hdGlvblwiIClcbiAgICBhbmltYXRpb24tbmFtZSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJhbmltYXRpb24tbmFtZVwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWFuaW1hdGlvblwiIClcbiAgICBhbmltYXRpb24tcGxheS1zdGF0ZSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJhbmltYXRpb24tcGxheS1zdGF0ZVwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWFuaW1hdGlvblwiIClcbiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKClcbiAgICAgICAga3MtdmVuZG9yKCBcImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb25cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1hbmltYXRpb25cIiApXG5cbiAgICBhcHBlYXJhbmNlKClcbiAgICAgICAga3MtdmVuZG9yKCBcImFwcGVhcmFuY2VcIiwgYXJndW1lbnRzLCBwcmVmaXhlczogd2Via2l0IG1veiApXG5cbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5KClcbiAgICAgICAga3MtdmVuZG9yKCBcImJhY2tmYWNlLXZpc2liaWxpdHlcIiwgYXJndW1lbnRzLCBwcmVmaXhlczogd2Via2l0IG1zIClcblxuICAgIGJhY2tncm91bmQtY2xpcCgpXG4gICAgICAgIGtzLXZlbmRvciggXCJiYWNrZ3JvdW5kLWNsaXBcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImJhY2tncm91bmQtaW1nLW9wdHNcIiApXG4gICAgYmFja2dyb3VuZC1vcmlnaW4oKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYmFja2dyb3VuZC1vcmlnaW5cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImJhY2tncm91bmQtaW1nLW9wdHNcIiApXG4gICAgYmFja2dyb3VuZC1zaXplKClcbiAgICAgICAga3MtdmVuZG9yKCBcImJhY2tncm91bmQtc2l6ZVwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiYmFja2dyb3VuZC1pbWctb3B0c1wiIClcblxuICAgIGJveC1zaXppbmcoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYm94LXNpemluZ1wiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzMy1ib3hzaXppbmdcIiApXG5cbiAgICBib3JkZXItaW1hZ2Utc291cmNlKClcbiAgICAgICAga3MtdmVuZG9yKCBcImJvcmRlci1pbWFnZS1zb3VyY2VcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImJvcmRlci1pbWFnZVwiIClcbiAgICBib3JkZXItaW1hZ2Utc2xpY2UoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYm9yZGVyLWltYWdlLXNsaWNlXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJib3JkZXItaW1hZ2VcIiApXG4gICAgYm9yZGVyLWltYWdlLXdpZHRoKClcbiAgICAgICAga3MtdmVuZG9yKCBcImJvcmRlci1pbWFnZS13aWR0aFwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiYm9yZGVyLWltYWdlXCIgKVxuICAgIGJvcmRlci1pbWFnZS1vdXRzZXQoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYm9yZGVyLWltYWdlLW91dHNldFwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiYm9yZGVyLWltYWdlXCIgKVxuICAgIGJvcmRlci1pbWFnZS1yZXBlYXQoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiYm9yZGVyLWltYWdlLXJlcGVhdFwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiYm9yZGVyLWltYWdlXCIgKVxuICAgIGJvcmRlci1pbWFnZSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJib3JkZXItaW1hZ2VcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImJvcmRlci1pbWFnZVwiIClcblxuICAgIGNsaXAtcGF0aCgpXG4gICAgICAgIGtzLXZlbmRvciggXCJjbGlwLXBhdGhcIiwgYXJndW1lbnRzLCBwcmVmaXhlczogd2Via2l0IClcblxuICAgIGNvbHVtbi1jb3VudCgpXG4gICAgICAgIGtzLXZlbmRvciggXCJjb2x1bW4tY291bnRcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcIm11bHRpY29sdW1uXCIgKVxuICAgIGNvbHVtbi1maWxsKClcbiAgICAgICAga3MtdmVuZG9yKCBcImNvbHVtbi1maWxsXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJtdWx0aWNvbHVtblwiIClcbiAgICBjb2x1bW4tZ2FwKClcbiAgICAgICAga3MtdmVuZG9yKCBcImNvbHVtbi1nYXBcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcIm11bHRpY29sdW1uXCIgKVxuICAgIGNvbHVtbi1ydWxlKClcbiAgICAgICAga3MtdmVuZG9yKCBcImNvbHVtbi1ydWxlXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJtdWx0aWNvbHVtblwiIClcbiAgICBjb2x1bW4tcnVsZS1jb2xvcigpXG4gICAgICAgIGtzLXZlbmRvciggXCJjb2x1bW4tcnVsZS1jb2xvclwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwibXVsdGljb2x1bW5cIiApXG4gICAgY29sdW1uLXJ1bGUtc3R5bGUoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiY29sdW1uLXJ1bGUtc3R5bGVcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcIm11bHRpY29sdW1uXCIgKVxuICAgIGNvbHVtbi1ydWxlLXdpZHRoKClcbiAgICAgICAga3MtdmVuZG9yKCBcImNvbHVtbi1ydWxlLXdpZHRoXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJtdWx0aWNvbHVtblwiIClcbiAgICBjb2x1bW4tc3BhbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJjb2x1bW4tc3BhblwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwibXVsdGljb2x1bW5cIilcbiAgICBjb2x1bW4td2lkdGgoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiY29sdW1uLXdpZHRoXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJtdWx0aWNvbHVtblwiIClcbiAgICBjb2x1bW5zKClcbiAgICAgICAga3MtdmVuZG9yKCBcImNvbHVtbnNcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcIm11bHRpY29sdW1uXCIgKVxuXG4gICAgZ3JpZCgpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtZ3JpZFwiIClcbiAgICBncmlkLWFyZWEoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiZ3JpZC1hcmVhXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtZ3JpZFwiIClcbiAgICBncmlkLWF1dG8tY29sdW1ucygpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLWF1dG8tY29sdW1uc1wiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWdyaWRcIiApXG4gICAgZ3JpZC1hdXRvLWZsb3coKVxuICAgICAgICBrcy12ZW5kb3IoIFwiZ3JpZC1hdXRvLWZsb3dcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1ncmlkXCIgKVxuICAgIGdyaWQtYXV0by1wb3NpdGlvbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLWF1dG8tcG9zaXRpb25cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1ncmlkXCIgKVxuICAgIGdyaWQtYXV0by1yb3dzKClcbiAgICAgICAga3MtdmVuZG9yKCBcImdyaWQtYXV0by1yb3dzXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtZ3JpZFwiIClcbiAgICBncmlkLWNvbHVtbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLWNvbHVtblwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWdyaWRcIiApXG4gICAgZ3JpZC1jb2x1bW4tZW5kKClcbiAgICAgICAga3MtdmVuZG9yKCBcImdyaWQtY29sdW1uLWVuZFwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWdyaWRcIiApXG4gICAgZ3JpZC1jb2x1bW4tc3RhcnQoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiZ3JpZC1jb2x1bW4tc3RhcnRcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1ncmlkXCIgKVxuICAgIGdyaWQtcm93KClcbiAgICAgICAga3MtdmVuZG9yKCBcImdyaWQtcm93XCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtZ3JpZFwiIClcbiAgICBncmlkLXJvdy1lbmQoKVxuICAgICAgICBrcy12ZW5kb3IoIFwiZ3JpZC1yb3ctZW5kXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtZ3JpZFwiIClcbiAgICBncmlkLXJvdy1zdGFydCgpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLXJvdy1zdGFydFwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLWdyaWRcIiApXG4gICAgZ3JpZC10ZW1wbGF0ZSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLXRlbXBsYXRlXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtZ3JpZFwiIClcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzKClcbiAgICAgICAga3MtdmVuZG9yKCBcImdyaWQtdGVtcGxhdGUtYXJlYXNcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1ncmlkXCIgKVxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1ucygpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLXRlbXBsYXRlLWNvbHVtbnNcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1ncmlkXCIgKVxuICAgIGdyaWQtdGVtcGxhdGUtcm93cygpXG4gICAgICAgIGtzLXZlbmRvciggXCJncmlkLXRlbXBsYXRlLXJvd3NcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1ncmlkXCIgKVxuXG4gICAgaHlwaGVucygpXG4gICAgICAgIGtzLXZlbmRvciggXCJoeXBoZW5zXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJjc3MtaHlwaGVuc1wiIClcblxuICAgIGp1c3RpZnktY29udGVudCgpXG4gICAgICAgIGtzLXZlbmRvciggXCJqdXN0aWZ5LWNvbnRlbnRcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImZsZXhib3hcIiApXG5cbiAgICBtYXNrKClcbiAgICAgICAga3MtdmVuZG9yKCBcIm1hc2tcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy1tYXNrc1wiIClcblxuICAgIG9wYWNpdHkoIHZhbHVlIClcbiAgICAgICAgaWYgdmFsdWUgPT0gaW5oZXJpdCBvciB2YWx1ZSA9PSBpbml0aWFsXG4gICAgICAgICAgICAtbXMtZmlsdGVyIHZhbHVlXG4gICAgICAgICAgICBmaWx0ZXIgdmFsdWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdmFsID0gcm91bmQoIHZhbHVlICogMTAwIClcbiAgICAgICAgICAgIGlmIHZhbCA9PSAxMDBcbiAgICAgICAgICAgICAgICAtbXMtZmlsdGVyOiBub25lXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBub25lXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgLW1zLWZpbHRlcjogJ1wicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9JXMpXCInICUgdmFsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiAnYWxwaGEob3BhY2l0eT0lcyknICUgdmFsXG4gICAgICAgIG9wYWNpdHkgdmFsdWVcblxuICAgIG9yZGVyKClcbiAgICAgICAga3MtdmVuZG9yKCBcIm9yZGVyXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJmbGV4Ym94XCIgKVxuXG4gICAgcGVyc3BlY3RpdmUoKVxuICAgICAgICBpZiBjdXJyZW50LXByb3BlcnR5WyAwIF0gaXMgXCJwZXJzcGVjdGl2ZVwiXG4gICAgICAgICAgICBrcy12ZW5kb3IoIFwicGVyc3BlY3RpdmVcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcInRyYW5zZm9ybXMzZFwiIClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdW5xdW90ZSggXCJwZXJzcGVjdGl2ZShcIiArIGFyZ3VtZW50cyArIFwiKVwiIClcblxuICAgIHBlcnNwZWN0aXZlLW9yaWdpbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJwZXJzcGVjdGl2ZS1vcmlnaW5cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcInRyYW5zZm9ybXMzZFwiIClcblxuICAgIHRyYW5zZm9ybSgpXG4gICAgICAgIGtzLXZlbmRvciggXCJ0cmFuc2Zvcm1cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcInRyYW5zZm9ybXMyZFwiIClcbiAgICB0cmFuc2Zvcm0tb3JpZ2luKClcbiAgICAgICAga3MtdmVuZG9yKCBcInRyYW5zZm9ybS1vcmlnaW5cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcInRyYW5zZm9ybXMyZFwiIClcbiAgICB0cmFuc2Zvcm0tc3R5bGUoKVxuICAgICAgICBrcy12ZW5kb3IoIFwidHJhbnNmb3JtLXN0eWxlXCIsIGFyZ3VtZW50cywgZmVhdHVyZTogXCJ0cmFuc2Zvcm1zM2RcIiApXG5cbiAgICB0cmFuc2l0aW9uKClcbiAgICAgICAga3MtdmVuZG9yKCBcInRyYW5zaXRpb25cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy10cmFuc2l0aW9uc1wiIClcbiAgICB0cmFuc2l0aW9uLWRlbGF5KClcbiAgICAgICAga3MtdmVuZG9yKCBcInRyYW5zaXRpb24tZGVsYXlcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy10cmFuc2l0aW9uc1wiIClcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uKClcbiAgICAgICAga3MtdmVuZG9yKCBcInRyYW5zaXRpb24tZHVyYXRpb25cIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy10cmFuc2l0aW9uc1wiIClcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5KClcbiAgICAgICAga3MtdmVuZG9yKCBcInRyYW5zaXRpb24tcHJvcGVydHlcIiwgYXJndW1lbnRzLCBmZWF0dXJlOiBcImNzcy10cmFuc2l0aW9uc1wiIClcbiAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbigpXG4gICAgICAgIGtzLXZlbmRvciggXCJ0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvblwiLCBhcmd1bWVudHMsIGZlYXR1cmU6IFwiY3NzLXRyYW5zaXRpb25zXCIgKVxuIl19 */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment