@angular-mdl/core
Version:
Angular components, directives and styles based on material design lite https://getmdl.io.
211 lines • 27 kB
JavaScript
/**
* @license
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable */
/* istanbul ignore file */
// @ts-nocheck
"use strict";
/**
* Class constructor for Ripple MDL component.
* Implements MDL component design pattern defined at:
* https://github.com/jasonmayes/mdl-component-design-pattern
*
*/
export function MaterialRipple(renderer, element) {
this.renderer_ = renderer;
this.element_ = element;
// Initialize instance.
this.init();
}
/**
* Store constants in one place so they can be updated easily.
*/
MaterialRipple.prototype.Constant_ = {
INITIAL_SCALE: "scale(0.0001, 0.0001)",
INITIAL_SIZE: "1px",
INITIAL_OPACITY: "0.4",
FINAL_OPACITY: "0",
FINAL_SCALE: "",
};
/**
* Store strings for class names defined by this component that are used in
* JavaScript. This allows us to simply change it in one place should we
* decide to modify at a later date.
*/
MaterialRipple.prototype.CssClasses_ = {
RIPPLE_CENTER: "mdl-ripple--center",
RIPPLE_EFFECT_IGNORE_EVENTS: "mdl-js-ripple-effect--ignore-events",
RIPPLE: "mdl-ripple",
IS_ANIMATING: "is-animating",
IS_VISIBLE: "is-visible",
};
/**
* Handle mouse / finger down on element.
*
*/
// eslint-disable-next-line
MaterialRipple.prototype.downHandler_ = function (event) {
if (!this.rippleElement_.style.width && !this.rippleElement_.style.height) {
const rect = this.element_.getBoundingClientRect();
this.boundHeight = rect.height;
this.boundWidth = rect.width;
this.rippleSize_ =
Math.sqrt(rect.width * rect.width + rect.height * rect.height) * 2 + 2;
this.rippleElement_.style.width = this.rippleSize_ + "px";
this.rippleElement_.style.height = this.rippleSize_ + "px";
}
this.renderer_.addClass(this.rippleElement_, this.CssClasses_.IS_VISIBLE);
if (event.type === "mousedown" && this.ignoringMouseDown_) {
this.ignoringMouseDown_ = false;
}
else {
if (event.type === "touchstart") {
this.ignoringMouseDown_ = true;
}
const frameCount = this.getFrameCount();
if (frameCount > 0) {
return;
}
this.setFrameCount(1);
const bound = event.currentTarget.getBoundingClientRect();
let x;
let y;
// Check if we are handling a keyboard click.
if (event.clientX === 0 && event.clientY === 0) {
x = Math.round(bound.width / 2);
y = Math.round(bound.height / 2);
}
else {
const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;
const clientY = event.clientY !== undefined ? event.clientY : event.touches[0].clientY;
x = Math.round(clientX - bound.left);
y = Math.round(clientY - bound.top);
}
this.setRippleXY(x, y);
this.setRippleStyles(true);
window.requestAnimationFrame(this.animFrameHandler.bind(this));
}
};
/**
* Handle mouse / finger up on element.
*
*/
// eslint-disable-next-line
MaterialRipple.prototype.upHandler_ = function (event) {
// Don't fire for the artificial "mouseup" generated by a double-click.
if (event && event.detail !== 2) {
// Allow a repaint to occur before removing this class, so the animation
// shows for tap events, which seem to trigger a mouseup too soon after
// mousedown.
// eslint-disable-next-line
setTimeout(function () {
this.renderer_.removeClass(this.rippleElement_, this.CssClasses_.IS_VISIBLE);
}.bind(this), 0);
}
};
/**
* Initialize element.
*/
// eslint-disable-next-line
MaterialRipple.prototype.init = function () {
if (this.element_) {
const recentering = this.element_.classList.contains(this.CssClasses_.RIPPLE_CENTER);
if (!this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT_IGNORE_EVENTS)) {
this.rippleElement_ = this.element_.querySelector("." + this.CssClasses_.RIPPLE);
this.frameCount_ = 0;
this.rippleSize_ = 0;
this.x_ = 0;
this.y_ = 0;
// Touch start produces a compat mouse down event, which would cause a
// second ripples. To avoid that, we use this property to ignore the first
// mouse down after a touch start.
this.ignoringMouseDown_ = false;
this.boundDownHandler = this.downHandler_.bind(this);
this.element_.addEventListener("mousedown", this.boundDownHandler);
this.element_.addEventListener("touchstart", this.boundDownHandler);
this.boundUpHandler = this.upHandler_.bind(this);
this.element_.addEventListener("mouseup", this.boundUpHandler);
this.element_.addEventListener("mouseleave", this.boundUpHandler);
this.element_.addEventListener("touchend", this.boundUpHandler);
this.element_.addEventListener("blur", this.boundUpHandler);
// eslint-disable-next-line
this.getFrameCount = function () {
return this.frameCount_;
};
// eslint-disable-next-line
this.setFrameCount = function (fC) {
this.frameCount_ = fC;
};
// eslint-disable-next-line
this.getRippleElement = function () {
return this.rippleElement_;
};
// eslint-disable-next-line
this.setRippleXY = function (newX, newY) {
this.x_ = newX;
this.y_ = newY;
};
// eslint-disable-next-line
this.setRippleStyles = function (start) {
if (this.rippleElement_ !== null) {
let transformString;
let scale;
let size;
let offset = "translate(" + this.x_ + "px, " + this.y_ + "px)";
if (start) {
scale = this.Constant_.INITIAL_SCALE;
size = this.Constant_.INITIAL_SIZE;
}
else {
scale = this.Constant_.FINAL_SCALE;
size = this.rippleSize_ + "px";
if (recentering) {
offset =
"translate(" +
this.boundWidth / 2 +
"px, " +
this.boundHeight / 2 +
"px)";
}
}
transformString = "translate(-50%, -50%) " + offset + scale;
this.rippleElement_.style.webkitTransform = transformString;
this.rippleElement_.style.msTransform = transformString;
this.rippleElement_.style.transform = transformString;
if (start) {
this.renderer_.removeClass(this.rippleElement_, this.CssClasses_.IS_ANIMATING);
}
else {
this.renderer_.addClass(this.rippleElement_, this.CssClasses_.IS_ANIMATING);
}
}
};
/**
* Handles an animation frame.
*/
// eslint-disable-next-line
this.animFrameHandler = function () {
if (this.frameCount_-- > 0) {
window.requestAnimationFrame(this.animFrameHandler.bind(this));
}
else {
this.setRippleStyles(false);
}
};
}
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLnZlbmRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9yaXBwbGUvcmlwcGxlLnZlbmRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxvQkFBb0I7QUFDcEIsMEJBQTBCO0FBQzFCLGNBQWM7QUFDZCxZQUFZLENBQUM7QUFFYjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU87SUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFFeEIsdUJBQXVCO0lBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFFRDs7R0FFRztBQUNILGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHO0lBQ25DLGFBQWEsRUFBRSx1QkFBdUI7SUFDdEMsWUFBWSxFQUFFLEtBQUs7SUFDbkIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsYUFBYSxFQUFFLEdBQUc7SUFDbEIsV0FBVyxFQUFFLEVBQUU7Q0FDaEIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxjQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRztJQUNyQyxhQUFhLEVBQUUsb0JBQW9CO0lBQ25DLDJCQUEyQixFQUFFLHFDQUFxQztJQUNsRSxNQUFNLEVBQUUsWUFBWTtJQUNwQixZQUFZLEVBQUUsY0FBYztJQUM1QixVQUFVLEVBQUUsWUFBWTtDQUN6QixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsMkJBQTJCO0FBQzNCLGNBQWMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFVBQVUsS0FBSztJQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFL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LENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7b0JBQzVELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7b0JBQ3hELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7b0JBRXRELElBQUksS0FBSyxFQUFFO3dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUN4QixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDOUIsQ0FBQztxQkFDSDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FDckIsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQzlCLENBQUM7cUJBQ0g7aUJBQ0Y7WUFDSCxDQUFDLENBQUM7WUFFRjs7ZUFFRztZQUNILDJCQUEyQjtZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUc7Z0JBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDaEU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0I7WUFDSCxDQUFDLENBQUM7U0FDSDtLQUNGO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbi8vIEB0cy1ub2NoZWNrXG5cInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBDbGFzcyBjb25zdHJ1Y3RvciBmb3IgUmlwcGxlIE1ETCBjb21wb25lbnQuXG4gKiBJbXBsZW1lbnRzIE1ETCBjb21wb25lbnQgZGVzaWduIHBhdHRlcm4gZGVmaW5lZCBhdDpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNvbm1heWVzL21kbC1jb21wb25lbnQtZGVzaWduLXBhdHRlcm5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXRlcmlhbFJpcHBsZShyZW5kZXJlciwgZWxlbWVudCk6IHZvaWQge1xuICB0aGlzLnJlbmRlcmVyXyA9IHJlbmRlcmVyO1xuICB0aGlzLmVsZW1lbnRfID0gZWxlbWVudDtcblxuICAvLyBJbml0aWFsaXplIGluc3RhbmNlLlxuICB0aGlzLmluaXQoKTtcbn1cblxuLyoqXG4gKiBTdG9yZSBjb25zdGFudHMgaW4gb25lIHBsYWNlIHNvIHRoZXkgY2FuIGJlIHVwZGF0ZWQgZWFzaWx5LlxuICovXG5NYXRlcmlhbFJpcHBsZS5wcm90b3R5cGUuQ29uc3RhbnRfID0ge1xuICBJTklUSUFMX1NDQUxFOiBcInNjYWxlKDAuMDAwMSwgMC4wMDAxKVwiLFxuICBJTklUSUFMX1NJWkU6IFwiMXB4XCIsXG4gIElOSVRJQUxfT1BBQ0lUWTogXCIwLjRcIixcbiAgRklOQUxfT1BBQ0lUWTogXCIwXCIsXG4gIEZJTkFMX1NDQUxFOiBcIlwiLFxufTtcblxuLyoqXG4gKiBTdG9yZSBzdHJpbmdzIGZvciBjbGFzcyBuYW1lcyBkZWZpbmVkIGJ5IHRoaXMgY29tcG9uZW50IHRoYXQgYXJlIHVzZWQgaW5cbiAqIEphdmFTY3JpcHQuIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXBseSBjaGFuZ2UgaXQgaW4gb25lIHBsYWNlIHNob3VsZCB3ZVxuICogZGVjaWRlIHRvIG1vZGlmeSBhdCBhIGxhdGVyIGRhdGUuXG4gKi9cbk1hdGVyaWFsUmlwcGxlLnByb3RvdHlwZS5Dc3NDbGFzc2VzXyA9IHtcbiAgUklQUExFX0NFTlRFUjogXCJtZGwtcmlwcGxlLS1jZW50ZXJcIixcbiAgUklQUExFX0VGRkVDVF9JR05PUkVfRVZFTlRTOiBcIm1kbC1qcy1yaXBwbGUtZWZmZWN0LS1pZ25vcmUtZXZlbnRzXCIsXG4gIFJJUFBMRTogXCJtZGwtcmlwcGxlXCIsXG4gIElTX0FOSU1BVElORzogXCJpcy1hbmltYXRpbmdcIixcbiAgSVNfVklTSUJMRTogXCJpcy12aXNpYmxlXCIsXG59O1xuXG4vKipcbiAqIEhhbmRsZSBtb3VzZSAvIGZpbmdlciBkb3duIG9uIGVsZW1lbnQuXG4gKlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbk1hdGVyaWFsUmlwcGxlLnByb3RvdHlwZS5kb3duSGFuZGxlcl8gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKCF0aGlzLnJpcHBsZUVsZW1lbnRfLnN0eWxlLndpZHRoICYmICF0aGlzLnJpcHBsZUVsZW1lbnRfLnN0eWxlLmhlaWdodCkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnRfLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuYm91bmRIZWlnaHQgPSByZWN0LmhlaWdodDtcbiAgICB0aGlzLmJvdW5kV2lkdGggPSByZWN0LndpZHRoO1xuICAgIHRoaXMucmlwcGxlU2l6ZV8gPVxuICAgICAgTWF0aC5zcXJ0KHJlY3Qud2lkdGggKiByZWN0LndpZHRoICsgcmVjdC5oZWlnaHQgKiByZWN0LmhlaWdodCkgKiAyICsgMjtcbiAgICB0aGlzLnJpcHBsZUVsZW1lbnRfLnN0eWxlLndpZHRoID0gdGhpcy5yaXBwbGVTaXplXyArIFwicHhcIjtcbiAgICB0aGlzLnJpcHBsZUVsZW1lbnRfLnN0eWxlLmhlaWdodCA9IHRoaXMucmlwcGxlU2l6ZV8gKyBcInB4XCI7XG4gIH1cblxuICB0aGlzLnJlbmRlcmVyXy5hZGRDbGFzcyh0aGlzLnJpcHBsZUVsZW1lbnRfLCB0aGlzLkNzc0NsYXNzZXNfLklTX1ZJU0lCTEUpO1xuXG4gIGlmIChldmVudC50eXBlID09PSBcIm1vdXNlZG93blwiICYmIHRoaXMuaWdub3JpbmdNb3VzZURvd25fKSB7XG4gICAgdGhpcy5pZ25vcmluZ01vdXNlRG93bl8gPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ0b3VjaHN0YXJ0XCIpIHtcbiAgICAgIHRoaXMuaWdub3JpbmdNb3VzZURvd25fID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZnJhbWVDb3VudCA9IHRoaXMuZ2V0RnJhbWVDb3VudCgpO1xuICAgIGlmIChmcmFtZUNvdW50ID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEZyYW1lQ291bnQoMSk7XG4gICAgY29uc3QgYm91bmQgPSBldmVudC5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCB4O1xuICAgIGxldCB5O1xuICAgIC8vIENoZWNrIGlmIHdlIGFyZSBoYW5kbGluZyBhIGtleWJvYXJkIGNsaWNrLlxuICAgIGlmIChldmVudC5jbGllbnRYID09PSAwICYmIGV2ZW50LmNsaWVudFkgPT09IDApIHtcbiAgICAgIHggPSBNYXRoLnJvdW5kKGJvdW5kLndpZHRoIC8gMik7XG4gICAgICB5ID0gTWF0aC5yb3VuZChib3VuZC5oZWlnaHQgLyAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xpZW50WCA9XG4gICAgICAgIGV2ZW50LmNsaWVudFggIT09IHVuZGVmaW5lZCA/IGV2ZW50LmNsaWVudFggOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICBjb25zdCBjbGllbnRZID1cbiAgICAgICAgZXZlbnQuY2xpZW50WSAhPT0gdW5kZWZpbmVkID8gZXZlbnQuY2xpZW50WSA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIHggPSBNYXRoLnJvdW5kKGNsaWVudFggLSBib3VuZC5sZWZ0KTtcbiAgICAgIHkgPSBNYXRoLnJvdW5kKGNsaWVudFkgLSBib3VuZC50b3ApO1xuICAgIH1cbiAgICB0aGlzLnNldFJpcHBsZVhZKHgsIHkpO1xuICAgIHRoaXMuc2V0UmlwcGxlU3R5bGVzKHRydWUpO1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltRnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuICB9XG59O1xuXG4vKipcbiAqIEhhbmRsZSBtb3VzZSAvIGZpbmdlciB1cCBvbiBlbGVtZW50LlxuICpcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5NYXRlcmlhbFJpcHBsZS5wcm90b3R5cGUudXBIYW5kbGVyXyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBEb24ndCBmaXJlIGZvciB0aGUgYXJ0aWZpY2lhbCBcIm1vdXNldXBcIiBnZW5lcmF0ZWQgYnkgYSBkb3VibGUtY2xpY2suXG4gIGlmIChldmVudCAmJiBldmVudC5kZXRhaWwgIT09IDIpIHtcbiAgICAvLyBBbGxvdyBhIHJlcGFpbnQgdG8gb2NjdXIgYmVmb3JlIHJlbW92aW5nIHRoaXMgY2xhc3MsIHNvIHRoZSBhbmltYXRpb25cbiAgICAvLyBzaG93cyBmb3IgdGFwIGV2ZW50cywgd2hpY2ggc2VlbSB0byB0cmlnZ2VyIGEgbW91c2V1cCB0b28gc29vbiBhZnRlclxuICAgIC8vIG1vdXNlZG93bi5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBzZXRUaW1lb3V0KFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyXy5yZW1vdmVDbGFzcyhcbiAgICAgICAgICB0aGlzLnJpcHBsZUVsZW1lbnRfLFxuICAgICAgICAgIHRoaXMuQ3NzQ2xhc3Nlc18uSVNfVklTSUJMRVxuICAgICAgICApO1xuICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgMFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBlbGVtZW50LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbk1hdGVyaWFsUmlwcGxlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5lbGVtZW50Xykge1xuICAgIGNvbnN0IHJlY2VudGVyaW5nID0gdGhpcy5lbGVtZW50Xy5jbGFzc0xpc3QuY29udGFpbnMoXG4gICAgICB0aGlzLkNzc0NsYXNzZXNfLlJJUFBMRV9DRU5URVJcbiAgICApO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmVsZW1lbnRfLmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgdGhpcy5Dc3NDbGFzc2VzXy5SSVBQTEVfRUZGRUNUX0lHTk9SRV9FVkVOVFNcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMucmlwcGxlRWxlbWVudF8gPSB0aGlzLmVsZW1lbnRfLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiLlwiICsgdGhpcy5Dc3NDbGFzc2VzXy5SSVBQTEVcbiAgICAgICk7XG4gICAgICB0aGlzLmZyYW1lQ291bnRfID0gMDtcbiAgICAgIHRoaXMucmlwcGxlU2l6ZV8gPSAwO1xuICAgICAgdGhpcy54XyA9IDA7XG4gICAgICB0aGlzLnlfID0gMDtcblxuICAgICAgLy8gVG91Y2ggc3RhcnQgcHJvZHVjZXMgYSBjb21wYXQgbW91c2UgZG93biBldmVudCwgd2hpY2ggd291bGQgY2F1c2UgYVxuICAgICAgLy8gc2Vjb25kIHJpcHBsZXMuIFRvIGF2b2lkIHRoYXQsIHdlIHVzZSB0aGlzIHByb3BlcnR5IHRvIGlnbm9yZSB0aGUgZmlyc3RcbiAgICAgIC8vIG1vdXNlIGRvd24gYWZ0ZXIgYSB0b3VjaCBzdGFydC5cbiAgICAgIHRoaXMuaWdub3JpbmdNb3VzZURvd25fID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuYm91bmREb3duSGFuZGxlciA9IHRoaXMuZG93bkhhbmRsZXJfLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmVsZW1lbnRfLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5ib3VuZERvd25IYW5kbGVyKTtcbiAgICAgIHRoaXMuZWxlbWVudF8uYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgdGhpcy5ib3VuZERvd25IYW5kbGVyKTtcblxuICAgICAgdGhpcy5ib3VuZFVwSGFuZGxlciA9IHRoaXMudXBIYW5kbGVyXy5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5lbGVtZW50Xy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLmJvdW5kVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZWxlbWVudF8uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5ib3VuZFVwSGFuZGxlcik7XG4gICAgICB0aGlzLmVsZW1lbnRfLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB0aGlzLmJvdW5kVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZWxlbWVudF8uYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy5ib3VuZFVwSGFuZGxlcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgdGhpcy5nZXRGcmFtZUNvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcmFtZUNvdW50XztcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgdGhpcy5zZXRGcmFtZUNvdW50ID0gZnVuY3Rpb24gKGZDKSB7XG4gICAgICAgIHRoaXMuZnJhbWVDb3VudF8gPSBmQztcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgdGhpcy5nZXRSaXBwbGVFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaXBwbGVFbGVtZW50XztcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgdGhpcy5zZXRSaXBwbGVYWSA9IGZ1bmN0aW9uIChuZXdYLCBuZXdZKSB7XG4gICAgICAgIHRoaXMueF8gPSBuZXdYO1xuICAgICAgICB0aGlzLnlfID0gbmV3WTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgdGhpcy5zZXRSaXBwbGVTdHlsZXMgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgaWYgKHRoaXMucmlwcGxlRWxlbWVudF8gIT09IG51bGwpIHtcbiAgICAgICAgICBsZXQgdHJhbnNmb3JtU3RyaW5nO1xuICAgICAgICAgIGxldCBzY2FsZTtcbiAgICAgICAgICBsZXQgc2l6ZTtcbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnhfICsgXCJweCwgXCIgKyB0aGlzLnlfICsgXCJweClcIjtcblxuICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgc2NhbGUgPSB0aGlzLkNvbnN0YW50Xy5JTklUSUFMX1NDQUxFO1xuICAgICAgICAgICAgc2l6ZSA9IHRoaXMuQ29uc3RhbnRfLklOSVRJQUxfU0laRTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2NhbGUgPSB0aGlzLkNvbnN0YW50Xy5GSU5BTF9TQ0FMRTtcbiAgICAgICAgICAgIHNpemUgPSB0aGlzLnJpcHBsZVNpemVfICsgXCJweFwiO1xuICAgICAgICAgICAgaWYgKHJlY2VudGVyaW5nKSB7XG4gICAgICAgICAgICAgIG9mZnNldCA9XG4gICAgICAgICAgICAgICAgXCJ0cmFuc2xhdGUoXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuYm91bmRXaWR0aCAvIDIgK1xuICAgICAgICAgICAgICAgIFwicHgsIFwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kSGVpZ2h0IC8gMiArXG4gICAgICAgICAgICAgICAgXCJweClcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cmFuc2Zvcm1TdHJpbmcgPSBcInRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBcIiArIG9mZnNldCArIHNjYWxlO1xuXG4gICAgICAgICAgdGhpcy5yaXBwbGVFbGVtZW50Xy5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJpbmc7XG4gICAgICAgICAgdGhpcy5yaXBwbGVFbGVtZW50Xy5zdHlsZS5tc1RyYW5zZm9ybSA9IHRyYW5zZm9ybVN0cmluZztcbiAgICAgICAgICB0aGlzLnJpcHBsZUVsZW1lbnRfLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVN0cmluZztcblxuICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlcl8ucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgIHRoaXMucmlwcGxlRWxlbWVudF8sXG4gICAgICAgICAgICAgIHRoaXMuQ3NzQ2xhc3Nlc18uSVNfQU5JTUFUSU5HXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyXy5hZGRDbGFzcyhcbiAgICAgICAgICAgICAgdGhpcy5yaXBwbGVFbGVtZW50XyxcbiAgICAgICAgICAgICAgdGhpcy5Dc3NDbGFzc2VzXy5JU19BTklNQVRJTkdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIEhhbmRsZXMgYW4gYW5pbWF0aW9uIGZyYW1lLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIHRoaXMuYW5pbUZyYW1lSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJhbWVDb3VudF8tLSA+IDApIHtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbUZyYW1lSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFJpcHBsZVN0eWxlcyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuIl19