jw-bootstrap-switch-ng2
Version:
Bootstrap Switch for Angular 2+
729 lines • 57.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, Output, HostListener, forwardRef, EventEmitter, ViewChild, Renderer2, ChangeDetectorRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const callback = () => {
};
const ɵ0 = callback;
/** @type {?} */
const CUSTOM_INPUT = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => JwBootstrapSwitchNg2Component),
multi: true
};
export class JwBootstrapSwitchNg2Component {
/**
* @param {?} cd
* @param {?} render
*/
constructor(cd, render) {
this.cd = cd;
this.render = render;
// Defining Default Options for Switch
this.handleWidth = 0;
this.labelWidth = 0;
this.labelText = '';
this.inverse = false;
this.baseClass = 'bootstrap-switch';
this.onText = 'ON';
this.offText = 'OFF';
this.disabled = false;
this.readonly = false;
this._focused = false;
this._size = 'normal';
this._animate = true;
this._innerAnimate = true;
this._indeterminate = false;
this._onColor = 'primary';
this._offColor = 'default';
this._wrapperClass = 'wrapper';
this._innerState = false;
this._innerHandleWidth = 'auto';
this._innerLabelWidth = 'auto';
this._dragStart = null;
this._dragEnd = null;
this._onTouchedCallback = callback;
this._onChangeCallback = callback;
this.changeState = new EventEmitter();
}
/**
* @private
* @return {?}
*/
$on() {
return this.on.nativeElement;
}
/**
* @private
* @return {?}
*/
$off() {
return this.off.nativeElement;
}
/**
* @private
* @return {?}
*/
$label() {
return this.label.nativeElement;
}
/**
* @private
* @return {?}
*/
$container() {
return this.container.nativeElement;
}
/**
* \@description: Function to set the Classes for the Wrapper Div
* @return {?} string
*/
getWrapperClasses() {
/** @type {?} */
let output = this.baseClass + ' ' + this.baseClass + '-' + this._wrapperClass;
if (this._focused) {
output += ' ' + this.baseClass + '-focused';
}
if (this.readonly) {
output += ' ' + this.baseClass + '-readonly';
}
if (this._size != null) {
output += ' ' + this.baseClass + '-' + this._size;
}
if (this._innerState) {
output += ' ' + this.baseClass + '-on';
}
else {
output += ' ' + this.baseClass + '-off';
}
if (this._animate) {
output += ' ' + this.baseClass + '-animate';
}
if (this.disabled) {
output += ' ' + this.baseClass + '-disabled';
}
if (this._indeterminate || this._innerState === null || typeof this._innerState === 'undefined') {
output += ' ' + this.baseClass + '-indeterminate';
}
if (this.inverse) {
output += ' ' + this.baseClass + '-inverse';
}
return output;
}
/**
* \@description Function to set the css classes for #on
* @return {?} string
*/
getOnClasses() {
/** @type {?} */
let output = this.baseClass + '-handle-on';
if (this._onColor) {
output += ' ' + this.baseClass + '-' + this._onColor;
}
return output;
}
/**
* \@description Function to set the css classes for #off
* @return {?} string
*/
getOffClasses() {
/** @type {?} */
let output = this.baseClass + '-handle-off';
if (this._offColor) {
output += ' ' + this.baseClass + '-' + this._offColor;
}
return output;
}
/**
* \@description Function set the marging of the #label when change the state
* @return {?} string
*/
getLabelMarginLeft() {
/** @type {?} */
let width = (this.inverse) ? -this.handleWidth : 0;
if (this._indeterminate || this._innerState === null || typeof this._innerState === 'undefined') {
width = -(this.handleWidth / 2);
}
else if (this._dragEnd) {
width = this._dragEnd;
}
else if (!this._innerState) {
if (!this.inverse) {
width = -this.handleWidth;
}
else {
width = 0;
}
}
return width + 'px';
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes['setLabelText'] ||
changes['setOnText'] ||
changes['setHandleWidth'] ||
changes['setLabelWidth'] ||
changes['setOffText'] ||
changes['setSize']) {
this.calculateWith(true);
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.calculateWith();
}
/**
* @return {?}
*/
onClick() {
if (!this.disabled && !this.readonly && !this._dragEnd) {
this.setStateValue(!this._innerState);
}
else if (this._dragEnd) {
this._dragEnd = null;
}
}
/**
* @param {?} e
* @return {?}
*/
onKeyDown(e) {
if (!e.which || this.disabled || this.readonly) {
return;
}
switch (e.which) {
case 37:
e.preventDefault();
e.stopImmediatePropagation();
this.setStateValue(false);
break;
case 39:
e.preventDefault();
e.stopImmediatePropagation();
this.setStateValue(true);
break;
}
}
/**
* @private
* @param {?} e
* @return {?}
*/
onDragStart(e) {
if (e.target === this.$label()) {
if (this._dragStart || this.disabled || this.readonly) {
return;
}
e.preventDefault();
e.stopPropagation();
this._dragStart = (e.pageX || e.touches[0].pageX) - parseInt(this.$container().style.marginLeft, 10);
if (this._animate) {
this._animate = !this._animate;
}
}
}
/**
* @private
* @param {?} e
* @return {?}
*/
onDragMove(e) {
if (this._dragStart) {
e.preventDefault();
/** @type {?} */
const difference = (e.pageX || e.touches[0].pageX) - this._dragStart;
if (difference < -Number(this.handleWidth) || difference > 0) {
return;
}
this._dragEnd = difference;
}
}
/**
* @private
* @param {?} e
* @param {?=} removeDragEnd
* @return {?}
*/
onDragEnd(e, removeDragEnd = false) {
if (this._dragStart) {
e.preventDefault();
e.stopPropagation();
if (this._dragEnd) {
/** @type {?} */
const state = this._dragEnd > -(Number(this.handleWidth) / 2);
this.setStateValue((this.inverse) ? !state : state);
}
this._dragStart = null;
if (removeDragEnd) {
this._dragEnd = null;
}
if (this._innerAnimate) {
this._animate = true;
}
}
}
/**
* @param {?} e
* @return {?}
*/
onTouchStart(e) {
this.onDragStart(e);
}
/**
* @param {?} e
* @return {?}
*/
onMouseDown(e) {
this.onDragStart(e);
}
/**
* @param {?} e
* @return {?}
*/
onTouchMove(e) {
this.onDragMove(e);
}
/**
* @param {?} e
* @return {?}
*/
onMouseMove(e) {
this.onDragMove(e);
}
/**
* @param {?} e
* @return {?}
*/
onMouseUp(e) {
this.onDragEnd(e);
}
/**
* @param {?} e
* @return {?}
*/
onTouchEnd(e) {
this.onDragEnd(e, true);
}
/**
* @param {?} e
* @return {?}
*/
onMouseLeave(e) {
this.onDragEnd(e, true);
}
/**
* @return {?}
*/
onFocus() {
this._focused = true;
}
/**
* @return {?}
*/
onBlur() {
this._focused = false;
this._onTouchedCallback();
}
/**
* \@description Function to make recalculate the size of the elements when options change
* @private
* @param {?=} disableAnimation
* @return {?}
*/
calculateWith(disableAnimation = false) {
if (disableAnimation && this._innerAnimate) {
this._animate = false;
}
setTimeout(() => {
this.render.setStyle(this.$on(), 'width', 'auto');
this.render.setStyle(this.$off(), 'width', 'auto');
this.render.setStyle(this.$label(), 'width', 'auto');
/** @type {?} */
const width = (this._innerHandleWidth === 'auto')
? Math.max(this.$on().offsetWidth, this.$off().offsetWidth)
: this._innerHandleWidth;
if (this.$label().offsetWidth < width) {
if (this._innerLabelWidth === 'auto') {
this.labelWidth = Number(width);
}
else {
this.labelWidth = Number(this._innerLabelWidth);
}
}
else {
if (this._innerLabelWidth === 'auto') {
this.labelWidth = this.$label().offsetWidth;
}
else {
this.labelWidth = Number(this._innerLabelWidth);
}
}
this.handleWidth = Number(width);
this.render.setStyle(this.$label(), 'width', this.labelWidth + 'px');
this.render.setStyle(this.$on(), 'width', this.handleWidth + 'px');
this.render.setStyle(this.$off(), 'width', this.handleWidth + 'px');
setTimeout(() => {
if (disableAnimation && this._innerAnimate) {
this._animate = true;
}
});
this.cd.markForCheck();
});
}
// Functions to set inputs and the private variables of the Switch
/**
* @param {?} value
* @return {?}
*/
set setBaseClass(value) {
this.baseClass = value;
}
/**
* @param {?} value
* @return {?}
*/
set setWrapperClass(value) {
this._wrapperClass = value;
}
/**
* @param {?} value
* @return {?}
*/
set setOffText(value) {
this.offText = (value) ? value : 'OFF';
}
/**
* @param {?} value
* @return {?}
*/
set setLabelText(value) {
this.labelText = value;
}
/**
* @param {?} value
* @return {?}
*/
set setOnText(value) {
this.onText = (value) ? value : 'ON';
}
/**
* @param {?} value
* @return {?}
*/
set setSize(value) {
if (value) {
this._size = value;
}
}
/**
* @param {?} value
* @return {?}
*/
set setAnimate(value) {
this._animate = value;
this._innerAnimate = value;
}
/**
* @param {?} value
* @return {?}
*/
set setOnColor(value) {
if (value) {
this._onColor = value;
}
}
/**
* @param {?} value
* @return {?}
*/
set setOffColor(value) {
if (value) {
this._offColor = value;
}
}
/**
* @param {?} value
* @return {?}
*/
set setDisabled(value) {
this.disabled = value;
}
/**
* @param {?} value
* @return {?}
*/
set setReadOnly(value) {
this.readonly = value;
}
/**
* @param {?} value
* @return {?}
*/
set setIndeterminate(value) {
this._indeterminate = value;
}
/**
* @param {?} value
* @return {?}
*/
set setInverse(value) {
this.inverse = value;
}
/**
* @param {?} value
* @return {?}
*/
set setHandleWidth(value) {
this._innerHandleWidth = (typeof (value) !== 'undefined') ? value : 'auto';
}
/**
* @param {?} value
* @return {?}
*/
set setLabelWidth(value) {
this._innerLabelWidth = (typeof (value) !== 'undefined') ? value : 'auto';
}
/**
* @return {?}
*/
get value() {
return this._innerState;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (v === null || typeof v === 'undefined') {
this._indeterminate = true;
}
this.setStateValue(v);
}
/**
* @private
* @param {?} v
* @return {?}
*/
setStateValue(v) {
if (v !== this._innerState) {
this._onChangeCallback(v);
this.changeState.emit({
previousValue: this._innerState,
currentValue: v
});
this._innerState = v;
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== this._innerState) {
this._innerState = value;
this.cd.markForCheck();
}
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this._onChangeCallback = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this._onTouchedCallback = fn;
}
}
JwBootstrapSwitchNg2Component.decorators = [
{ type: Component, args: [{
selector: 'bSwitch',
providers: [CUSTOM_INPUT],
template: `
<div [ngClass]="getWrapperClasses()" [style.width]="(handleWidth + labelWidth ) +'px'">
<div #container [ngClass]="baseClass + '-container'"
[style.width]="((handleWidth * 2) + labelWidth) +'px'"
[style.margin-left]="getLabelMarginLeft()"><!--
--><span #on [innerHTML]="(inverse) ? offText : onText"
[ngClass]="(inverse) ? getOffClasses() : getOnClasses()"></span><!--
--><span #label [ngClass]="baseClass + '-label'"> {{ labelText }}</span><!--
--><span #off [innerHTML]="(inverse) ? onText : offText"
[ngClass]="(inverse) ? getOnClasses() : getOffClasses()"></span><!--
--><input type="checkbox" [(ngModel)]="value" [readonly]="readonly" [disabled]="disabled"
(focus)="onFocus()" (blur)="onBlur()">
</div>
</div>`
},] },
];
/** @nocollapse */
JwBootstrapSwitchNg2Component.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: Renderer2 }
];
JwBootstrapSwitchNg2Component.propDecorators = {
changeState: [{ type: Output }],
container: [{ type: ViewChild, args: ['container',] }],
on: [{ type: ViewChild, args: ['on',] }],
label: [{ type: ViewChild, args: ['label',] }],
off: [{ type: ViewChild, args: ['off',] }],
onClick: [{ type: HostListener, args: ['click',] }],
onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }],
onTouchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
onTouchMove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
onMouseMove: [{ type: HostListener, args: ['mousemove', ['$event'],] }],
onMouseUp: [{ type: HostListener, args: ['mouseup', ['$event'],] }],
onTouchEnd: [{ type: HostListener, args: ['touchend', ['$event'],] }],
onMouseLeave: [{ type: HostListener, args: ['mouseleave', ['$event'],] }],
setBaseClass: [{ type: Input, args: ['switch-base-class',] }],
setWrapperClass: [{ type: Input, args: ['switch-wrapper-class',] }],
setOffText: [{ type: Input, args: ['switch-off-text',] }],
setLabelText: [{ type: Input, args: ['switch-label-text',] }],
setOnText: [{ type: Input, args: ['switch-on-text',] }],
setSize: [{ type: Input, args: ['switch-size',] }],
setAnimate: [{ type: Input, args: ['switch-animate',] }],
setOnColor: [{ type: Input, args: ['switch-on-color',] }],
setOffColor: [{ type: Input, args: ['switch-off-color',] }],
setDisabled: [{ type: Input, args: ['switch-disabled',] }],
setReadOnly: [{ type: Input, args: ['switch-readonly',] }],
setIndeterminate: [{ type: Input, args: ['switch-indeterminate',] }],
setInverse: [{ type: Input, args: ['switch-inverse',] }],
setHandleWidth: [{ type: Input, args: ['switch-handle-width',] }],
setLabelWidth: [{ type: Input, args: ['switch-label-width',] }]
};
if (false) {
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.handleWidth;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.labelWidth;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.labelText;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.inverse;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.baseClass;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.onText;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.offText;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.disabled;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.readonly;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._focused;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._size;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._animate;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerAnimate;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._indeterminate;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._onColor;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._offColor;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._wrapperClass;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerState;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerHandleWidth;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerLabelWidth;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._dragStart;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._dragEnd;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._onTouchedCallback;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._onChangeCallback;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.changeState;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.container;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.on;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.label;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.off;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype.cd;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype.render;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianctYm9vdHN0cmFwLXN3aXRjaC1uZzIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vanctYm9vdHN0cmFwLXN3aXRjaC1uZzIvIiwic291cmNlcyI6WyJsaWIvanctYm9vdHN0cmFwLXN3aXRjaC1uZzIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBRVYsWUFBWSxFQUNaLFNBQVMsRUFFVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFSCxpQkFBaUIsRUFDcEIsTUFBTSxnQkFBZ0IsQ0FBQzs7TUFFbEIsUUFBUSxHQUFHLEdBQUcsRUFBRTtBQUN0QixDQUFDOzs7TUFFSyxZQUFZLEdBQVE7SUFDdEIsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDZCQUE2QixDQUFDO0lBQzVELEtBQUssRUFBRSxJQUFJO0NBQ2Q7QUFxQkQsTUFBTSxPQUFPLDZCQUE2Qjs7Ozs7SUFpSnRDLFlBQW9CLEVBQXFCLEVBQVUsTUFBaUI7UUFBaEQsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFXOztRQS9JN0QsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFXLGtCQUFrQixDQUFDO1FBQ3ZDLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUFXLEtBQUssQ0FBQztRQUN4QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMx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QUE4Qzs7SUFDOUMsK0NBQTZCOztJQUM3QixnREFBK0I7O0lBQy9CLGlEQUFpQzs7SUFDakMsaURBQWlDOzs7OztJQUVqQyxpREFBa0M7Ozs7O0lBQ2xDLDhDQUE4Qjs7Ozs7SUFDOUIsaURBQWlDOzs7OztJQUNqQyxzREFBc0M7Ozs7O0lBQ3RDLHVEQUF3Qzs7Ozs7SUFDeEMsaURBQXFDOzs7OztJQUNyQyxrREFBc0M7Ozs7O0lBQ3RDLHNEQUEwQzs7Ozs7SUFDMUMsb0RBQXFDOzs7OztJQUNyQywwREFBb0Q7Ozs7O0lBQ3BELHlEQUFtRDs7Ozs7SUFFbkQsbURBQStCOzs7OztJQUMvQixpREFBNkI7Ozs7O0lBRTdCLDJEQUFrRDs7Ozs7SUFDbEQsMERBQXVEOztJQUV2RCxvREFBbUU7O0lBSW5FLGtEQUE4Qzs7SUFDOUMsMkNBQWdDOztJQUNoQyw4Q0FBc0M7O0lBQ3RDLDRDQUFrQzs7Ozs7SUE0R3RCLDJDQUE2Qjs7Ozs7SUFBRSwrQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIElucHV0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIGZvcndhcmRSZWYsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgUmVuZGVyZXIyLFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gICAgTkdfVkFMVUVfQUNDRVNTT1JcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5jb25zdCBjYWxsYmFjayA9ICgpID0+IHtcclxufTtcclxuXHJcbmNvbnN0IENVU1RPTV9JTlBVVDogYW55ID0ge1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBKd0Jvb3RzdHJhcFN3aXRjaE5nMkNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JTd2l0Y2gnLFxyXG4gICAgcHJvdmlkZXJzOiBbQ1VTVE9NX0lOUFVUXSxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0V3JhcHBlckNsYXNzZXMoKVwiIFtzdHlsZS53aWR0aF09XCIoaGFuZGxlV2lkdGggICsgbGFiZWxXaWR0aCApICsncHgnXCI+XHJcbiAgICAgICAgICA8ZGl2ICNjb250YWluZXIgW25nQ2xhc3NdPVwiYmFzZUNsYXNzICsgJy1jb250YWluZXInXCJcclxuICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIigoaGFuZGxlV2lkdGggKiAyKSArIGxhYmVsV2lkdGgpICsncHgnXCJcclxuICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpbi1sZWZ0XT1cImdldExhYmVsTWFyZ2luTGVmdCgpXCI+PCEtLVxyXG4gICAgICAgICAgICAgIC0tPjxzcGFuICNvbiBbaW5uZXJIVE1MXT1cIihpbnZlcnNlKSA/IG9mZlRleHQgOiBvblRleHRcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGludmVyc2UpID8gZ2V0T2ZmQ2xhc3NlcygpIDogZ2V0T25DbGFzc2VzKClcIj48L3NwYW4+PCEtLVxyXG4gICAgICAgICAgICAgIC0tPjxzcGFuICNsYWJlbCBbbmdDbGFzc109XCJiYXNlQ2xhc3MgKyAnLWxhYmVsJ1wiPiZuYnNwO3t7IGxhYmVsVGV4dCB9fTwvc3Bhbj48IS0tXHJcbiAgICAgICAgICAgICAgLS0+PHNwYW4gI29mZiBbaW5uZXJIVE1MXT1cIihpbnZlcnNlKSA/IG9uVGV4dCA6IG9mZlRleHRcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGludmVyc2UpID8gZ2V0T25DbGFzc2VzKCkgOiBnZXRPZmZDbGFzc2VzKClcIj48L3NwYW4+PCEtLVxyXG4gICAgICAgICAgICAgIC0tPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChibHVyKT1cIm9uQmx1cigpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEp3Qm9vdHN0cmFwU3dpdGNoTmcyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XHJcbiAgICAvLyBEZWZpbmluZyBEZWZhdWx0IE9wdGlvbnMgZm9yIFN3aXRjaFxyXG4gICAgcHVibGljIGhhbmRsZVdpZHRoOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxhYmVsV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbGFiZWxUZXh0OiBzdHJpbmcgPSAnJztcclxuICAgIHB1YmxpYyBpbnZlcnNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgYmFzZUNsYXNzOiBzdHJpbmcgPSAnYm9vdHN0cmFwLXN3aXRjaCc7XHJcbiAgICBwdWJsaWMgb25UZXh0OiBzdHJpbmcgPSAnT04nO1xyXG4gICAgcHVibGljIG9mZlRleHQ6IHN0cmluZyA9ICdPRkYnO1xyXG4gICAgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9zaXplOiBhbnkgPSAnbm9ybWFsJztcclxuICAgIHByaXZhdGUgX2FuaW1hdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfaW5uZXJBbmltYXRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2luZGV0ZXJtaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX29uQ29sb3I6IHN0cmluZyA9ICdwcmltYXJ5JztcclxuICAgIHByaXZhdGUgX29mZkNvbG9yOiBzdHJpbmcgPSAnZGVmYXVsdCc7XHJcbiAgICBwcml2YXRlIF93cmFwcGVyQ2xhc3M6IHN0cmluZyA9ICd3cmFwcGVyJztcclxuICAgIHByaXZhdGUgX2lubmVyU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lubmVySGFuZGxlV2lkdGg6IHN0cmluZyB8IG51bWJlciA9ICdhdXRvJztcclxuICAgIHByaXZhdGUgX2lubmVyTGFiZWxXaWR0aDogc3RyaW5nIHwgbnVtYmVyID0gJ2F1dG8nO1xyXG5cclxuICAgIHByaXZhdGUgX2RyYWdTdGFydDogYW55ID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2RyYWdFbmQ6IGFueSA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBjYWxsYmFjaztcclxuICAgIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBjYWxsYmFjaztcclxuXHJcbiAgICBAT3V0cHV0KCkgY2hhbmdlU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cclxuICAgIC8vIERlZmluaW5nIERPTSBFbGVtZW50c1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnb24nKSBvbjogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2xhYmVsJykgbGFiZWw6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdvZmYnKSBvZmY6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgcHJpdmF0ZSAkb24oKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vbi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgJG9mZigpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgJGxhYmVsKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWwubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlICRjb250YWluZXIoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbjogIEZ1bmN0aW9uIHRvIHNldCB0aGUgQ2xhc3NlcyBmb3IgdGhlIFdyYXBwZXIgRGl2XHJcbiAgICAgKiBAcmV0dXJucyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFdyYXBwZXJDbGFzc2VzKCkge1xyXG4gICAgICAgIGxldCBvdXRwdXQ6IHN0cmluZyA9IHRoaXMuYmFzZUNsYXNzICsgJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLScgKyB0aGlzLl93cmFwcGVyQ2xhc3M7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctZm9jdXNlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctcmVhZG9ubHknO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NpemUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gJyAnICsgdGhpcy5iYXNlQ2xhc3MgKyAnLScgKyB0aGlzLl9zaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lubmVyU3RhdGUpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9ICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy1vbic7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9ICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy1vZmYnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGUpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9ICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy1hbmltYXRlJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctZGlzYWJsZWQnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2luZGV0ZXJtaW5hdGUgfHwgdGhpcy5faW5uZXJTdGF0ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5faW5uZXJTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9ICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy1pbmRldGVybWluYXRlJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmludmVyc2UpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9ICcgJyArIHRoaXMuYmFzZUNsYXNzICsgJy1pbnZlcnNlJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBzZXQgdGhlIGNzcyBjbGFzc2VzIGZvciAjb25cclxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T25DbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IG91dHB1dDogc3RyaW5nID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWhhbmRsZS1vbic7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vbkNvbG9yKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctJyArIHRoaXMuX29uQ29sb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIHNldCB0aGUgY3NzIGNsYXNzZXMgZm9yICNvZmZcclxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0T2ZmQ2xhc3NlcygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBvdXRwdXQ6IHN0cmluZyA9IHRoaXMuYmFzZUNsYXNzICsgJy1oYW5kbGUtb2ZmJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29mZkNvbG9yKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSAnICcgKyB0aGlzLmJhc2VDbGFzcyArICctJyArIHRoaXMuX29mZkNvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiAgRnVuY3Rpb24gc2V0IHRoZSBtYXJnaW5nIG9mIHRoZSAjbGFiZWwgd2hlbiBjaGFuZ2UgdGhlIHN0YXRlXHJcbiAgICAgKiBAcmV0dXJucyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldExhYmVsTWFyZ2luTGVmdCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCB3aWR0aCA9ICh0aGlzLmludmVyc2UpID8gLXRoaXMuaGFuZGxlV2lkdGggOiAwO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmRldGVybWluYXRlIHx8IHRoaXMuX2lubmVyU3RhdGUgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2lubmVyU3RhdGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gLSh0aGlzLmhhbmRsZVdpZHRoIC8gMik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kcmFnRW5kKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5fZHJhZ0VuZDtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pbm5lclN0YXRlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbnZlcnNlKSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IC10aGlzLmhhbmRsZVdpZHRoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3aWR0aCArICdweCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgcmVuZGVyOiBSZW5kZXJlcjIpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NldExhYmVsVGV4dCddIHx8XHJcbiAgICAgICAgICAgIGNoYW5nZXNbJ3NldE9uVGV4dCddIHx8XHJcbiAgICAgICAgICAgIGNoYW5nZXNbJ3NldEhhbmRsZVdpZHRoJ10gfHxcclxuICAgICAgICAgICAgY2hhbmdlc1snc2V0TGFiZWxXaWR0aCddIHx8XHJcbiAgICAgICAgICAgIGNoYW5nZXNbJ3NldE9mZlRleHQnXSB8fFxyXG4gICAgICAgICAgICBjaGFuZ2VzWydzZXRTaXplJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVXaXRoKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVXaXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAhdGhpcy5fZHJhZ0VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlVmFsdWUoIXRoaXMuX2lubmVyU3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhZ0VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnRW5kID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKCFlLndoaWNoIHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoZS53aGljaCkge1xyXG4gICAgICAgICAgICBjYXNlIDM3OlxyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGVWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAzOTpcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlVmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzLiRsYWJlbCgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnU3RhcnQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnU3RhcnQgPSAoZS5wYWdlWCB8fCBlLnRvdWNoZXNbMF0ucGFnZVgpIC0gcGFyc2VJbnQodGhpcy4kY29udGFpbmVyKCkuc3R5bGUubWFyZ2luTGVmdCwgMTApO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYW5pbWF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0ZSA9ICF0aGlzLl9hbmltYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnTW92ZShlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ1N0YXJ0KSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IChlLnBhZ2VYIHx8IGUudG91Y2hlc1swXS5wYWdlWCkgLSB0aGlzLl9kcmFnU3RhcnQ7XHJcbiAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgLU51bWJlcih0aGlzLmhhbmRsZVdpZHRoKSB8fCBkaWZmZXJlbmNlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdFbmQgPSBkaWZmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ0VuZChlOiBFdmVudCwgcmVtb3ZlRHJhZ0VuZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydCkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnRW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2RyYWdFbmQgPiAtKE51bWJlcih0aGlzLmhhbmRsZVdpZHRoKSAvIDIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZVZhbHVlKCh0aGlzLmludmVyc2UpID8gIXN0YXRlIDogc3RhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdTdGFydCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChyZW1vdmVEcmFnRW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnRW5kID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5uZXJBbmltYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSkgb25Ub3VjaFN0YXJ0KGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EcmFnU3RhcnQoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSkgb25Nb3VzZURvd24oZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkRyYWdTdGFydChlKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKSBvblRvdWNoTW92ZShlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uRHJhZ01vdmUoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSkgb25Nb3VzZU1vdmUoZTogYW55KSB7XHJcbiAgIC