@uex/web-extensions
Version:
Uex extensions for Angular 6+ web projects
497 lines • 42.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/modules/spinner/spinner.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { coerceNumberProperty } from '@angular/cdk/coercion';
import { Platform } from '@angular/cdk/platform';
import { DOCUMENT } from '@angular/common';
import { ChangeDetectionStrategy, Component, ElementRef, Inject, InjectionToken, Input, Optional } from '@angular/core';
import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
/**
* Base reference size of the spinner.
* \@internal
* @type {?}
*/
var BASE_SIZE = 100;
/**
* Base reference stroke width of the spinner.
* \@internal
* @type {?}
*/
var BASE_STROKE_WIDTH = 10;
// Boilerplate for applying mixins to Spinner.
/**
* \@internal
*/
var
// Boilerplate for applying mixins to Spinner.
/**
* \@internal
*/
ProgressSpinnerBase = /** @class */ (function () {
function ProgressSpinnerBase(_elementRef) {
this._elementRef = _elementRef;
}
return ProgressSpinnerBase;
}());
// Boilerplate for applying mixins to Spinner.
/**
* \@internal
*/
export { ProgressSpinnerBase };
if (false) {
/** @type {?} */
ProgressSpinnerBase.prototype._elementRef;
}
/**
* \@internal
* @record
*/
export function ProgressSpinnerDefaultOptions() { }
if (false) {
/**
* Diameter of the spinner.
* @type {?|undefined}
*/
ProgressSpinnerDefaultOptions.prototype.diameter;
/**
* Width of the spinner's stroke.
* @type {?|undefined}
*/
ProgressSpinnerDefaultOptions.prototype.strokeWidth;
/**
* Whether the animations should be force to be enabled, ignoring if the current environment is
* using NoopAnimationsModule.
* @type {?|undefined}
*/
ProgressSpinnerDefaultOptions.prototype._forceAnimations;
}
/**
* \@internal
* @type {?}
*/
export var UEX_PROGRESS_SPINNER_DEFAULT_OPTIONS = new InjectionToken('uex-spinner-default-options', {
providedIn: 'root',
factory: UEX_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY,
});
/**
* \@internal
* @return {?}
*/
export function UEX_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY() {
return { diameter: BASE_SIZE };
}
// .0001 percentage difference is necessary in order to avoid unwanted animation frames
// for example because the animation duration is 4 seconds, .1% accounts to 4ms
// which are enough to see the flicker described in
// https://github.com/angular/material2/issues/8984
/**
* \@internal
* @type {?}
*/
var INDETERMINATE_ANIMATION_TEMPLATE = "\n @keyframes uex-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n";
/**
* `<uex-spinner>` component.
*/
var Spinner = /** @class */ (function () {
function Spinner(_elementRef, platform, _document, animationMode, defaults) {
this._elementRef = _elementRef;
this._document = _document;
this.animationMode = animationMode;
this.defaults = defaults;
this._value = 0;
this._oldColor = null;
this._oldMode = null;
this._fallbackAnimation = false;
/**
* Whether the _uex-animation-noopable class should be applied, disabling animations.
*/
this._noopAnimations = this.animationMode === 'NoopAnimations' && (!!this.defaults && !this.defaults._forceAnimations);
this._diameter = BASE_SIZE;
this._fallbackAnimation = platform.EDGE || platform.TRIDENT;
if (defaults) {
if (defaults.diameter) {
this.diameter = defaults.diameter;
}
if (defaults.strokeWidth) {
this.strokeWidth = defaults.strokeWidth;
}
}
if (!this._mode) {
this.mode = 'indeterminate';
}
if (!this._color) {
this.color = 'primary';
}
}
Object.defineProperty(Spinner.prototype, "diameter", {
/** The diameter of the progress spinner (will set width and height of svg). */
get: /**
* The diameter of the progress spinner (will set width and height of svg).
* @return {?}
*/
function () { return this._diameter; },
set: /**
* @param {?} size
* @return {?}
*/
function (size) {
this._diameter = coerceNumberProperty(size);
if (!this._fallbackAnimation && !Spinner.diameters.has(this._diameter)) {
this._attachStyleNode();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "strokeWidth", {
/** Stroke width of the progress spinner. */
get: /**
* Stroke width of the progress spinner.
* @return {?}
*/
function () {
return this._strokeWidth || this.diameter / 10;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._strokeWidth = coerceNumberProperty(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "mode", {
/** Mode of the progress circle */
get: /**
* Mode of the progress circle
* @return {?}
*/
function () {
return this._mode;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._mode = newValue ? newValue : 'indeterminate';
// On IE and Edge, we can't animate the `stroke-dashoffset`
// reliably so we fall back to a non-spec animation.
/** @type {?} */
var animationClass = "uex-spinner-" + this.mode + (this._fallbackAnimation ? '-fallback' : '') + "-animation";
if (this._oldMode) {
this._elementRef.nativeElement.classList.remove(this._oldMode);
}
this._oldMode = animationClass;
this._elementRef.nativeElement.classList.add(animationClass);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "value", {
/** Value of the progress circle. */
get: /**
* Value of the progress circle.
* @return {?}
*/
function () {
return this.mode === 'determinate' ? this._value : 0;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._value = Math.max(0, Math.min(100, coerceNumberProperty(newValue)));
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "color", {
/** Color of the progress circle. */
get: /**
* Color of the progress circle.
* @return {?}
*/
function () {
return this._color;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._color = newValue;
this._updateColor();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "_circleRadius", {
/** The radius of the spinner, adjusted for stroke width. */
get: /**
* The radius of the spinner, adjusted for stroke width.
* @return {?}
*/
function () {
return (this.diameter - BASE_STROKE_WIDTH) / 2;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "_viewBox", {
/** The view box of the spinner's svg element. */
get: /**
* The view box of the spinner's svg element.
* @return {?}
*/
function () {
/** @type {?} */
var viewBox = this._circleRadius * 2 + this.strokeWidth;
return "0 0 " + viewBox + " " + viewBox;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "_strokeCircumference", {
/** The stroke circumference of the svg circle. */
get: /**
* The stroke circumference of the svg circle.
* @return {?}
*/
function () {
return 2 * Math.PI * this._circleRadius;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "_strokeDashOffset", {
/** The dash offset of the svg circle. */
get: /**
* The dash offset of the svg circle.
* @return {?}
*/
function () {
if (this.mode === 'determinate') {
return this._strokeCircumference * (100 - this._value) / 100;
}
// In fallback mode set the circle to 80% and rotate it with CSS.
if (this._fallbackAnimation && this.mode === 'indeterminate') {
return this._strokeCircumference * 0.2;
}
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Spinner.prototype, "_circleStrokeWidth", {
/** Stroke width of the circle in percent. */
get: /**
* Stroke width of the circle in percent.
* @return {?}
*/
function () {
return this.strokeWidth / this.diameter * 100;
},
enumerable: true,
configurable: true
});
/** Dynamically generates a style tag containing the correct animation for this diameter. */
/**
* Dynamically generates a style tag containing the correct animation for this diameter.
* @private
* @return {?}
*/
Spinner.prototype._attachStyleNode = /**
* Dynamically generates a style tag containing the correct animation for this diameter.
* @private
* @return {?}
*/
function () {
/** @type {?} */
var styleTag = Spinner.styleTag;
if (!styleTag) {
styleTag = this._document.createElement('style');
this._document.head.appendChild(styleTag);
Spinner.styleTag = styleTag;
}
if (styleTag && styleTag.sheet) {
((/** @type {?} */ (styleTag.sheet))).insertRule(this._getAnimationText(), 0);
}
Spinner.diameters.add(this.diameter);
};
/** Generates animation styles adjusted for the spinner's diameter. */
/**
* Generates animation styles adjusted for the spinner's diameter.
* @private
* @return {?}
*/
Spinner.prototype._getAnimationText = /**
* Generates animation styles adjusted for the spinner's diameter.
* @private
* @return {?}
*/
function () {
return INDETERMINATE_ANIMATION_TEMPLATE
// Animation should begin at 5% and end at 80%
.replace(/START_VALUE/g, "" + 0.95 * this._strokeCircumference)
.replace(/END_VALUE/g, "" + 0.2 * this._strokeCircumference)
.replace(/DIAMETER/g, "" + this.diameter);
};
/** Set the color class of spinner */
/**
* Set the color class of spinner
* @private
* @return {?}
*/
Spinner.prototype._updateColor = /**
* Set the color class of spinner
* @private
* @return {?}
*/
function () {
/** @type {?} */
var current_classes = this._elementRef.nativeElement.className.split(' ');
if (this._oldColor) {
/** @type {?} */
var index = current_classes.indexOf("uex-spinner-" + this._oldColor);
if (index > -1) {
current_classes.splice(index, 1);
}
}
this._oldColor = null;
if (this._color) {
this._oldColor = this._color;
current_classes.push("uex-spinner-" + this._color);
}
this._elementRef.nativeElement.className = current_classes.join(' ');
};
/**
* Tracks diameters of existing instances to de-dupe generated styles (default d = 100)
*/
Spinner.diameters = new Set([BASE_SIZE]);
/**
* Used for storing all of the generated keyframe animations.
* \@dynamic
*/
Spinner.styleTag = null;
Spinner.decorators = [
{ type: Component, args: [{
selector: 'uex-spinner',
exportAs: 'ProgressSpinner',
host: {
'role': 'progressbar',
'class': 'uex-spinner',
'[class._uex-animation-noopable]': "_noopAnimations",
'[style.width.px]': 'diameter',
'[style.height.px]': 'diameter',
'[attr.mode]': 'mode',
'[attr.aria-valuemin]': 'mode === "determinate" ? 0 : null',
'[attr.aria-valuemax]': 'mode === "determinate" ? 100 : null',
'[attr.aria-valuenow]': 'mode === "determinate" ? value : null'
},
inputs: ['color'],
template: "<!--\r\n preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\r\n center. The center of the circle will remain at the center of the uex-spinner\r\n element containing the SVG. `focusable=\"false\"` prevents IE from allowing the user to\r\n tab into the SVG element.\r\n-->\r\n\r\n<svg\r\n [style.width.px]=\"diameter\"\r\n [style.height.px]=\"diameter\"\r\n [attr.viewBox]=\"_viewBox\"\r\n preserveAspectRatio=\"xMidYMid meet\"\r\n focusable=\"false\"\r\n [ngSwitch]=\"mode === 'indeterminate'\">\r\n\r\n <!--\r\n Technically we can reuse the same `circle` element, however Safari has an issue that breaks\r\n the SVG rendering in determinate mode, after switching between indeterminate and determinate.\r\n Using a different element avoids the issue. An alternative to this is adding `display: none`\r\n for a split second and then removing it when switching between modes, but it's hard to know\r\n for how long to hide the element and it can cause the UI to blink.\r\n -->\r\n <circle\r\n *ngSwitchCase=\"true\"\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n [attr.r]=\"_circleRadius\"\r\n [style.animation-name]=\"'uex-spinner-stroke-rotate-' + diameter\"\r\n [style.stroke-dashoffset.px]=\"_strokeDashOffset\"\r\n [style.stroke-dasharray.px]=\"_strokeCircumference\"\r\n [style.stroke-width.%]=\"_circleStrokeWidth\"></circle>\r\n\r\n <circle\r\n *ngSwitchCase=\"false\"\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n [attr.r]=\"_circleRadius\"\r\n [style.stroke-dashoffset.px]=\"_strokeDashOffset\"\r\n [style.stroke-dasharray.px]=\"_strokeCircumference\"\r\n [style.stroke-width.%]=\"_circleStrokeWidth\"></circle>\r\n</svg>\r\n",
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
Spinner.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Platform },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [UEX_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }
]; };
Spinner.propDecorators = {
diameter: [{ type: Input }],
strokeWidth: [{ type: Input }],
mode: [{ type: Input }],
value: [{ type: Input }],
color: [{ type: Input }]
};
return Spinner;
}());
export { Spinner };
if (false) {
/**
* Tracks diameters of existing instances to de-dupe generated styles (default d = 100)
* @type {?}
* @private
*/
Spinner.diameters;
/**
* Used for storing all of the generated keyframe animations.
* \@dynamic
* @type {?}
* @private
*/
Spinner.styleTag;
/**
* @type {?}
* @private
*/
Spinner.prototype._value;
/**
* @type {?}
* @private
*/
Spinner.prototype._color;
/**
* @type {?}
* @private
*/
Spinner.prototype._oldColor;
/**
* @type {?}
* @private
*/
Spinner.prototype._mode;
/**
* @type {?}
* @private
*/
Spinner.prototype._oldMode;
/**
* @type {?}
* @private
*/
Spinner.prototype._strokeWidth;
/**
* @type {?}
* @private
*/
Spinner.prototype._fallbackAnimation;
/**
* Whether the _uex-animation-noopable class should be applied, disabling animations.
* @type {?}
*/
Spinner.prototype._noopAnimations;
/**
* @type {?}
* @private
*/
Spinner.prototype._diameter;
/** @type {?} */
Spinner.prototype._elementRef;
/**
* @type {?}
* @private
*/
Spinner.prototype._document;
/**
* @type {?}
* @private
*/
Spinner.prototype.animationMode;
/**
* @type {?}
* @private
*/
Spinner.prototype.defaults;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdWV4L3dlYi1leHRlbnNpb25zLyIsInNvdXJjZXMiOlsibGliL21vZHVsZXMvc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7SUFVdkUsU0FBUyxHQUFHLEdBQUc7Ozs7OztJQU1mLGlCQUFpQixHQUFHLEVBQUU7Ozs7O0FBSTVCOzs7Ozs7SUFDRSw2QkFBbUIsV0FBdUI7UUFBdkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7SUFBRyxDQUFDO0lBQ2hELDBCQUFDO0FBQUQsQ0FBQyxBQUZELElBRUM7Ozs7Ozs7O0lBRGEsMENBQThCOzs7Ozs7QUFLNUMsbURBVUM7Ozs7OztJQVJDLGlEQUFrQjs7Ozs7SUFFbEIsb0RBQXFCOzs7Ozs7SUFLckIseURBQTJCOzs7Ozs7QUFLN0IsTUFBTSxLQUFPLG9DQUFvQyxHQUM3QyxJQUFJLGNBQWMsQ0FBZ0MsNkJBQTZCLEVBQUU7SUFDL0UsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLDRDQUE0QztDQUN0RCxDQUFDOzs7OztBQUdOLE1BQU0sVUFBVSw0Q0FBNEM7SUFDMUQsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUMsQ0FBQztBQUMvQixDQUFDOzs7Ozs7Ozs7SUFPSyxnQ0FB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LCtCQUE2Qjs7Ozs7SUFDN0IscUNBQW1DOzs7OztJQUduQyxrQ0FDd0Q7Ozs7O0lBQ3hELDRCQUE4Qjs7SUEvRWxCLDhCQUE4Qjs7Ozs7SUFFOUIsNEJBQW9EOzs7OztJQUVwRCxnQ0FBeUU7Ozs7O0lBQ3pFLDJCQUNvRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5qZWN0aW9uVG9rZW4sIElucHV0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBTklNQVRJT05fTU9EVUxFX1RZUEUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xyXG5cclxuXHJcbi8qKiBQb3NzaWJsZSBtb2RlIGZvciBhIHByb2dyZXNzIHNwaW5uZXIuICovXHJcbmV4cG9ydCB0eXBlIFByb2dyZXNzU3Bpbm5lck1vZGUgPSAnZGV0ZXJtaW5hdGUnIHwgJ2luZGV0ZXJtaW5hdGUnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgcmVmZXJlbmNlIHNpemUgb2YgdGhlIHNwaW5uZXIuXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY29uc3QgQkFTRV9TSVpFID0gMTAwO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgcmVmZXJlbmNlIHN0cm9rZSB3aWR0aCBvZiB0aGUgc3Bpbm5lci5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBCQVNFX1NUUk9LRV9XSURUSCA9IDEwO1xyXG5cclxuLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBTcGlubmVyLlxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1NwaW5uZXJCYXNlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XHJcbn1cclxuXHJcbi8qKiBEZWZhdWx0IGB1ZXgtc3Bpbm5lcmAgb3B0aW9ucyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuLiAqL1xyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NTcGlubmVyRGVmYXVsdE9wdGlvbnMge1xyXG4gIC8qKiBEaWFtZXRlciBvZiB0aGUgc3Bpbm5lci4gKi9cclxuICBkaWFtZXRlcj86IG51bWJlcjtcclxuICAvKiogV2lkdGggb2YgdGhlIHNwaW5uZXIncyBzdHJva2UuICovXHJcbiAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgYW5pbWF0aW9ucyBzaG91bGQgYmUgZm9yY2UgdG8gYmUgZW5hYmxlZCwgaWdub3JpbmcgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXNcclxuICAgKiB1c2luZyBOb29wQW5pbWF0aW9uc01vZHVsZS5cclxuICAgKi9cclxuICBfZm9yY2VBbmltYXRpb25zPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEluamVjdGlvbiB0b2tlbiB0byBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGB1ZXgtc3Bpbm5lcmAuICovXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNvbnN0IFVFWF9QUk9HUkVTU19TUElOTkVSX0RFRkFVTFRfT1BUSU9OUyA9XHJcbiAgICBuZXcgSW5qZWN0aW9uVG9rZW48UHJvZ3Jlc3NTcGlubmVyRGVmYXVsdE9wdGlvbnM+KCd1ZXgtc3Bpbm5lci1kZWZhdWx0LW9wdGlvbnMnLCB7XHJcbiAgICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxuICAgICAgZmFjdG9yeTogVUVYX1BST0dSRVNTX1NQSU5ORVJfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlksXHJcbiAgICB9KTtcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFVFWF9QUk9HUkVTU19TUElOTkVSX0RFRkFVTFRfT1BUSU9OU19GQUNUT1JZKCk6IFByb2dyZXNzU3Bpbm5lckRlZmF1bHRPcHRpb25zIHtcclxuICByZXR1cm4ge2RpYW1ldGVyOiBCQVNFX1NJWkV9O1xyXG59XHJcblxyXG4vLyAuMDAwMSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGF2b2lkIHVud2FudGVkIGFuaW1hdGlvbiBmcmFtZXNcclxuLy8gZm9yIGV4YW1wbGUgYmVjYXVzZSB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIDQgc2Vjb25kcywgLjElIGFjY291bnRzIHRvIDRtc1xyXG4vLyB3aGljaCBhcmUgZW5vdWdoIHRvIHNlZSB0aGUgZmxpY2tlciBkZXNjcmliZWQgaW5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvbWF0ZXJpYWwyL2lzc3Vlcy84OTg0XHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY29uc3QgSU5ERVRFUk1JTkFURV9BTklNQVRJT05fVEVNUExBVEUgPSBgXHJcbiBAa2V5ZnJhbWVzIHVleC1zcGlubmVyLXN0cm9rZS1yb3RhdGUtRElBTUVURVIge1xyXG4gICAgMCUgICAgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlKDApOyB9XHJcbiAgICAxMi41JSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGUoMCk7IH1cclxuICAgIDEyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKTsgfVxyXG4gICAgMjUlICAgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKTsgfVxyXG4gICAgMjUuMDAwMSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7IH1cclxuICAgIDM3LjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XHJcbiAgICAzNy41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9XHJcbiAgICA1MCUgICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKTsgfVxyXG4gICAgNTAuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxyXG4gICAgNjIuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cclxuICAgIDYyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgyNTEuNWRlZyk7IH1cclxuICAgIDc1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpOyB9XHJcbiAgICA3NS4wMDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7IH1cclxuICAgIDg3LjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7IH1cclxuICAgIDg3LjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyk7IH1cclxuICAgIDEwMCUgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpOyB9XHJcbiAgfVxyXG5gO1xyXG5cclxuLyoqXHJcbiAqIGA8dWV4LXNwaW5uZXI+YCBjb21wb25lbnQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VleC1zcGlubmVyJyxcclxuICBleHBvcnRBczogJ1Byb2dyZXNzU3Bpbm5lcicsXHJcbiAgaG9zdDoge1xyXG4gICAgJ3JvbGUnOiAncHJvZ3Jlc3NiYXInLFxyXG4gICAgJ2NsYXNzJzogJ3VleC1zcGlubmVyJyxcclxuICAgICdbY2xhc3MuX3VleC1hbmltYXRpb24tbm9vcGFibGVdJzogYF9ub29wQW5pbWF0aW9uc2AsXHJcbiAgICAnW3N0eWxlLndpZHRoLnB4XSc6ICdkaWFtZXRlcicsXHJcbiAgICAnW3N0eWxlLmhlaWdodC5weF0nOiAnZGlhbWV0ZXInLFxyXG4gICAgJ1thdHRyLm1vZGVdJzogJ21vZGUnLFxyXG4gICAgJ1thdHRyLmFyaWEtdmFsdWVtaW5dJzogJ21vZGUgPT09IFwiZGV0ZXJtaW5hdGVcIiA/IDAgOiBudWxsJyxcclxuICAgICdbYXR0ci5hcmlhLXZhbHVlbWF4XSc6ICdtb2RlID09PSBcImRldGVybWluYXRlXCIgPyAxMDAgOiBudWxsJyxcclxuICAgICdbYXR0ci5hcmlhLXZhbHVlbm93XSc6ICdtb2RlID09PSBcImRldGVybWluYXRlXCIgPyB2YWx1ZSA6IG51bGwnXHJcbiAgfSxcclxuICBpbnB1dHM6IFsnY29sb3InXSxcclxuICB0ZW1wbGF0ZVVybDogJ3NwaW5uZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTcGlubmVyIHtcclxuXHJcbiAgLyoqIFRoZSBkaWFtZXRlciBvZiB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lciAod2lsbCBzZXQgd2lkdGggYW5kIGhlaWdodCBvZiBzdmcpLiAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRpYW1ldGVyKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9kaWFtZXRlcjsgfVxyXG4gIHNldCBkaWFtZXRlcihzaXplOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2RpYW1ldGVyID0gY29lcmNlTnVtYmVyUHJvcGVydHkoc2l6ZSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9mYWxsYmFja0FuaW1hdGlvbiAmJiAhU3Bpbm5lci5kaWFtZXRlcnMuaGFzKHRoaXMuX2RpYW1ldGVyKSkge1xyXG4gICAgICB0aGlzLl9hdHRhY2hTdHlsZU5vZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBTdHJva2Ugd2lkdGggb2YgdGhlIHByb2dyZXNzIHNwaW5uZXIuICovXHJcbiAgQElucHV0KClcclxuICBnZXQgc3Ryb2tlV2lkdGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zdHJva2VXaWR0aCB8fCB0aGlzLmRpYW1ldGVyIC8gMTA7XHJcbiAgfVxyXG4gIHNldCBzdHJva2VXaWR0aCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9zdHJva2VXaWR0aCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBNb2RlIG9mIHRoZSBwcm9ncmVzcyBjaXJjbGUgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBtb2RlKCk6IFByb2dyZXNzU3Bpbm5lck1vZGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGU7XHJcbiAgfVxyXG4gIHNldCBtb2RlKG5ld1ZhbHVlOiBQcm9ncmVzc1NwaW5uZXJNb2RlKSB7XHJcbiAgICB0aGlzLl9tb2RlID0gbmV3VmFsdWUgPyBuZXdWYWx1ZSA6ICdpbmRldGVybWluYXRlJztcclxuXHJcbiAgICAvLyBPbiBJRSBhbmQgRWRnZSwgd2UgY2FuJ3QgYW5pbWF0ZSB0aGUgYHN0cm9rZS1kYXNob2Zmc2V0YFxyXG4gICAgLy8gcmVsaWFibHkgc28gd2UgZmFsbCBiYWNrIHRvIGEgbm9uLXNwZWMgYW5pbWF0aW9uLlxyXG4gICAgY29uc3QgYW5pbWF0aW9uQ2xhc3MgPSBgdWV4LXNwaW5uZXItJHt0aGlzLm1vZGV9JHt0aGlzLl9mYWxsYmFja0FuaW1hdGlvbiA/ICctZmFsbGJhY2snIDogJyd9LWFuaW1hdGlvbmA7XHJcblxyXG4gICAgaWYgKHRoaXMuX29sZE1vZGUpIHsgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fb2xkTW9kZSk7IH1cclxuICAgIHRoaXMuX29sZE1vZGUgPSBhbmltYXRpb25DbGFzcztcclxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGFuaW1hdGlvbkNsYXNzKTtcclxuICB9XHJcblxyXG4gIC8qKiBWYWx1ZSBvZiB0aGUgcHJvZ3Jlc3MgY2lyY2xlLiAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHZhbHVlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZGV0ZXJtaW5hdGUnID8gdGhpcy5fdmFsdWUgOiAwO1xyXG4gIH1cclxuICBzZXQgdmFsdWUobmV3VmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIGNvZXJjZU51bWJlclByb3BlcnR5KG5ld1ZhbHVlKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbG9yIG9mIHRoZSBwcm9ncmVzcyBjaXJjbGUuICovXHJcbiAgQElucHV0KClcclxuICBnZXQgY29sb3IoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcclxuICB9XHJcbiAgc2V0IGNvbG9yKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvbG9yID0gbmV3VmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVDb2xvcigpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybSxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55LFxyXG4gICAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjAgYW5pbWF0aW9uTW9kZSBhbmQgZGVmYXVsdHMgcGFyYW1ldGVycyB0byBiZSBtYWRlIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFKSBwcml2YXRlIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQEluamVjdChVRVhfUFJPR1JFU1NfU1BJTk5FUl9ERUZBVUxUX09QVElPTlMpXHJcbiAgICAgICAgICAgICAgICAgIHByaXZhdGUgZGVmYXVsdHM/OiBQcm9ncmVzc1NwaW5uZXJEZWZhdWx0T3B0aW9ucykge1xyXG5cclxuICAgIHRoaXMuX2ZhbGxiYWNrQW5pbWF0aW9uID0gcGxhdGZvcm0uRURHRSB8fCBwbGF0Zm9ybS5UUklERU5UO1xyXG5cclxuICAgIGlmIChkZWZhdWx0cykge1xyXG4gICAgICBpZiAoZGVmYXVsdHMuZGlhbWV0ZXIpIHtcclxuICAgICAgICB0aGlzLmRpYW1ldGVyID0gZGVmYXVsdHMuZGlhbWV0ZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkZWZhdWx0cy5zdHJva2VXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBkZWZhdWx0cy5zdHJva2VXaWR0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fbW9kZSkgeyB0aGlzLm1vZGUgPSAnaW5kZXRlcm1pbmF0ZSc7IH1cclxuICAgIGlmICghdGhpcy5fY29sb3IpIHsgdGhpcy5jb2xvciA9ICdwcmltYXJ5JzsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSByYWRpdXMgb2YgdGhlIHNwaW5uZXIsIGFkanVzdGVkIGZvciBzdHJva2Ugd2lkdGguICovXHJcbiAgZ2V0IF9jaXJjbGVSYWRpdXMoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuZGlhbWV0ZXIgLSBCQVNFX1NUUk9LRV9XSURUSCkgLyAyO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSB2aWV3IGJveCBvZiB0aGUgc3Bpbm5lcidzIHN2ZyBlbGVtZW50LiAqL1xyXG4gIGdldCBfdmlld0JveCgpIHtcclxuICAgIGNvbnN0IHZpZXdCb3ggPSB0aGlzLl9jaXJjbGVSYWRpdXMgKiAyICsgdGhpcy5zdHJva2VXaWR0aDtcclxuICAgIHJldHVybiBgMCAwICR7dmlld0JveH0gJHt2aWV3Qm94fWA7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHN0cm9rZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBzdmcgY2lyY2xlLiAqL1xyXG4gIGdldCBfc3Ryb2tlQ2lyY3VtZmVyZW5jZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDIgKiBNYXRoLlBJICogdGhpcy5fY2lyY2xlUmFkaXVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBkYXNoIG9mZnNldCBvZiB0aGUgc3ZnIGNpcmNsZS4gKi9cclxuICBnZXQgX3N0cm9rZURhc2hPZmZzZXQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGV0ZXJtaW5hdGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdHJva2VDaXJjdW1mZXJlbmNlICogKDEwMCAtIHRoaXMuX3ZhbHVlKSAvIDEwMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbiBmYWxsYmFjayBtb2RlIHNldCB0aGUgY2lyY2xlIHRvIDgwJSBhbmQgcm90YXRlIGl0IHdpdGggQ1NTLlxyXG4gICAgaWYgKHRoaXMuX2ZhbGxiYWNrQW5pbWF0aW9uICYmIHRoaXMubW9kZSA9PT0gJ2luZGV0ZXJtaW5hdGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdHJva2VDaXJjdW1mZXJlbmNlICogMC4yO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0cm9rZSB3aWR0aCBvZiB0aGUgY2lyY2xlIGluIHBlcmNlbnQuICovXHJcbiAgZ2V0IF9jaXJjbGVTdHJva2VXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLnN0cm9rZVdpZHRoIC8gdGhpcy5kaWFtZXRlciAqIDEwMDtcclxuICB9XHJcblxyXG4gIC8qKiBUcmFja3MgZGlhbWV0ZXJzIG9mIGV4aXN0aW5nIGluc3RhbmNlcyB0byBkZS1kdXBlIGdlbmVyYXRlZCBzdHlsZXMgKGRlZmF1bHQgZCA9IDEwMCkgKi9cclxuICBwcml2YXRlIHN0YXRpYyBkaWFtZXRlcnMgPSBuZXcgU2V0PG51bWJlcj4oW0JBU0VfU0laRV0pO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGZvciBzdG9yaW5nIGFsbCBvZiB0aGUgZ2VuZXJhdGVkIGtleWZyYW1lIGFuaW1hdGlvbnMuXHJcbiAgICogQGR5bmFtaWNcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBzdHlsZVRhZzogSFRNTFN0eWxlRWxlbWVudHxudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xyXG4gIHByaXZhdGUgX2NvbG9yOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfb2xkQ29sb3I6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfbW9kZTogUHJvZ3Jlc3NTcGlubmVyTW9kZTtcclxuICBwcml2YXRlIF9vbGRNb2RlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3N0cm9rZVdpZHRoOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfZmFsbGJhY2tBbmltYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIF91ZXgtYW5pbWF0aW9uLW5vb3BhYmxlIGNsYXNzIHNob3VsZCBiZSBhcHBsaWVkLCBkaXNhYmxpbmcgYW5pbWF0aW9ucy4gICovXHJcbiAgX25vb3BBbmltYXRpb25zOiBib29sZWFuID0gdGhpcy5hbmltYXRpb25Nb2RlID09PSAnTm9vcEFuaW1hdGlvbnMnICYmIChcclxuICAgICAgISF0aGlzLmRlZmF1bHRzICYmICF0aGlzLmRlZmF1bHRzLl9mb3JjZUFuaW1hdGlvbnMpO1xyXG4gIHByaXZhdGUgX2RpYW1ldGVyID0gQkFTRV9TSVpFO1xyXG5cclxuICAvKiogRHluYW1pY2FsbHkgZ2VuZXJhdGVzIGEgc3R5bGUgdGFnIGNvbnRhaW5pbmcgdGhlIGNvcnJlY3QgYW5pbWF0aW9uIGZvciB0aGlzIGRpYW1ldGVyLiAqL1xyXG4gIHByaXZhdGUgX2F0dGFjaFN0eWxlTm9kZSgpOiB2b2lkIHtcclxuICAgIGxldCBzdHlsZVRhZyA9IFNwaW5uZXIuc3R5bGVUYWc7XHJcblxyXG4gICAgaWYgKCFzdHlsZVRhZykge1xyXG4gICAgICBzdHlsZVRhZyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICAgIHRoaXMuX2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xyXG4gICAgICBTcGlubmVyLnN0eWxlVGFnID0gc3R5bGVUYWc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0eWxlVGFnICYmIHN0eWxlVGFnLnNoZWV0KSB7XHJcbiAgICAgIChzdHlsZVRhZy5zaGVldCBhcyBDU1NTdHlsZVNoZWV0KS5pbnNlcnRSdWxlKHRoaXMuX2dldEFuaW1hdGlvblRleHQoKSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgU3Bpbm5lci5kaWFtZXRlcnMuYWRkKHRoaXMuZGlhbWV0ZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdlbmVyYXRlcyBhbmltYXRpb24gc3R5bGVzIGFkanVzdGVkIGZvciB0aGUgc3Bpbm5lcidzIGRpYW1ldGVyLiAqL1xyXG4gIHByaXZhdGUgX2dldEFuaW1hdGlvblRleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJTkRFVEVSTUlOQVRFX0FOSU1BVElPTl9URU1QTEFURVxyXG4gICAgICAgIC8vIEFuaW1hdGlvbiBzaG91bGQgYmVnaW4gYXQgNSUgYW5kIGVuZCBhdCA4MCVcclxuICAgICAgICAucmVwbGFjZSgvU1RBUlRfVkFMVUUvZywgYCR7MC45NSAqIHRoaXMuX3N0cm9rZUNpcmN1bWZlcmVuY2V9YClcclxuICAgICAgICAucmVwbGFjZSgvRU5EX1ZBTFVFL2csIGAkezAuMiAqIHRoaXMuX3N0cm9rZUNpcmN1bWZlcmVuY2V9YClcclxuICAgICAgICAucmVwbGFjZSgvRElBTUVURVIvZywgYCR7dGhpcy5kaWFtZXRlcn1gKTtcclxuICB9XHJcblxyXG4gIC8qKiBTZXQgdGhlIGNvbG9yIGNsYXNzIG9mIHNwaW5uZXIgKi9cclxuICBwcml2YXRlIF91cGRhdGVDb2xvcigpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRfY2xhc3NlcyA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKTtcclxuICAgIGlmICh0aGlzLl9vbGRDb2xvcikge1xyXG4gICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRfY2xhc3Nlcy5pbmRleE9mKGB1ZXgtc3Bpbm5lci0ke3RoaXMuX29sZENvbG9yfWApO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkgeyBjdXJyZW50X2NsYXNzZXMuc3BsaWNlKGluZGV4LCAxKTsgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX29sZENvbG9yID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9jb2xvcikge1xyXG4gICAgICB0aGlzLl9vbGRDb2xvciA9IHRoaXMuX2NvbG9yO1xyXG4gICAgICBjdXJyZW50X2NsYXNzZXMucHVzaChgdWV4LXNwaW5uZXItJHt0aGlzLl9jb2xvcn1gKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc05hbWUgPSBjdXJyZW50X2NsYXNzZXMuam9pbignICcpO1xyXG4gIH1cclxufVxyXG4iXX0=