nge-facturaperu
Version:
nge-facturaperu. Es un proyecto de libreria javascript que contiene componentes reutilizables para el proyectos web de [facturación electrónica](http://svs.factura-peru.com/) u [algún otro proyecto web](http://hotelparis.pe/).
391 lines • 35.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/components/steps/steps.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, QueryList, Directive, ContentChild, ContentChildren, TemplateRef, Output, EventEmitter, } from '@angular/core';
import { slideOfRight } from './animations/slide-of-right.animation';
import { ConfigNames, NgeStepConfig } from './step-config';
export class NgeStepTitleDirective {
/**
* @param {?} templateRef
*/
constructor(templateRef) {
this.templateRef = templateRef;
}
}
NgeStepTitleDirective.decorators = [
{ type: Directive, args: [{
selector: 'ng-template[ngeStepTitle]',
},] }
];
/** @nocollapse */
NgeStepTitleDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
NgeStepTitleDirective.prototype.templateRef;
}
export class NgeStepContentDirective {
/**
* @param {?} templateRef
*/
constructor(templateRef) {
this.templateRef = templateRef;
}
}
NgeStepContentDirective.decorators = [
{ type: Directive, args: [{
selector: 'ng-template[ngeStepContent]',
},] }
];
/** @nocollapse */
NgeStepContentDirective.ctorParameters = () => [
{ type: TemplateRef }
];
if (false) {
/** @type {?} */
NgeStepContentDirective.prototype.templateRef;
}
/** @type {?} */
let nextId = 0;
export class NgeStepDirective {
constructor() {
this.id = `nge-step-${nextId++}`;
this.disabled = false;
// @Input() disabled = true;
this.isValidStep = true;
}
// public isValidStep: boolean = false;
/**
* @param {?} value
* @return {?}
*/
set validStep(value) {
this.isValidStep = (value === 'true' || value === true) ? true : false;
}
}
NgeStepDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: 'nge-step',
},] }
];
NgeStepDirective.propDecorators = {
id: [{ type: Input }],
title: [{ type: Input }],
icon: [{ type: Input }],
data: [{ type: Input }],
disabled: [{ type: Input }],
validStep: [{ type: Input }],
titleTemplate: [{ type: ContentChild, args: [NgeStepTitleDirective, { static: false },] }],
contentTemplate: [{ type: ContentChild, args: [NgeStepContentDirective, { static: false },] }]
};
if (false) {
/** @type {?} */
NgeStepDirective.prototype.id;
/** @type {?} */
NgeStepDirective.prototype.title;
/** @type {?} */
NgeStepDirective.prototype.icon;
/**
* Guarda Cualquier dato. Creado por el Equipo Lamb.
* @type {?}
*/
NgeStepDirective.prototype.data;
/** @type {?} */
NgeStepDirective.prototype.disabled;
/** @type {?} */
NgeStepDirective.prototype.isValidStep;
/** @type {?} */
NgeStepDirective.prototype.titleTemplate;
/** @type {?} */
NgeStepDirective.prototype.contentTemplate;
}
/**
* @record
*/
export function NgeStepChangeEvent() { }
if (false) {
/**
* Id de la pestaña actualmente activa.
* @type {?}
*/
NgeStepChangeEvent.prototype.activeId;
/**
* Id de la pestaña recién seleccionada.
* @type {?}
*/
NgeStepChangeEvent.prototype.nextId;
/**
* data guardada en la pestaña actualmente activa.
* @type {?}
*/
NgeStepChangeEvent.prototype.activeData;
/**
* Función que evitará el cambio de pertaña si se llama.
* @type {?}
*/
NgeStepChangeEvent.prototype.preventDefault;
}
export class NgeStepGroupComponent {
/**
* @param {?} config
*/
constructor(config) {
this.config = config;
this.hideContent = false;
/**
* Cuando cambia de step se destruira el contenido anterior o solo se oculatará?
*/
// @Input() destroyOnHide: boolean = true;
this.destroyOnHide = false;
/**
* se va usar los botones en cada paso como: siguiente, atras, finalizar?,
* se muestra por default
*/
// @Input() isShowButtons: boolean = true;
this.isShowButtons = true;
/**
* Emite cuando hay cambios de steps.
*/
this.stepChange = new EventEmitter();
// tslint:disable-next-line: no-output-on-prefix
this.onComplete = new EventEmitter();
this.type = this.config.type;
this.justify = this.config.justify;
this.orientation = this.config.orientation;
this.iConfigNames = this.config.configNames;
}
/**
* @param {?} confign
* @return {?}
*/
set configNames(confign) {
this.iConfigNames.buttonBack = confign.buttonBack || this.iConfigNames.buttonBack;
this.iConfigNames.buttonNext = confign.buttonNext || this.iConfigNames.buttonNext;
this.iConfigNames.buttonFinish = confign.buttonFinish || this.iConfigNames.buttonFinish;
}
/**
* @param {?} className
* @return {?}
*/
set justify(className) {
if (className === 'fill' || className === 'justified') {
this.justifyClass = `nav-${className}`;
}
else {
this.justifyClass = `justify-content-${className}`;
}
}
/**
* @param {?} stepId
* @return {?}
*/
onSelect(stepId) {
/** @type {?} */
const selectedStep = this.getStepById(stepId);
/** @type {?} */
const selectedActive = this.getStepById(this.activeId);
// console.log('selectedStep');
// console.log(selectedStep);
if (selectedStep && !selectedStep.disabled && this.activeId !== selectedStep.id) {
/** @type {?} */
let defaultPrevented = false;
this.stepChange.emit({
activeId: this.activeId,
activeData: selectedActive.data || null,
nextId: selectedStep.id,
preventDefault: (/**
* @return {?}
*/
() => { defaultPrevented = true; }),
});
if (!defaultPrevented) {
this.activeId = selectedStep.id;
}
}
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngAfterContentChecked() {
/** @type {?} */
const activeStep = this.getStepById(this.activeId);
this.activeId = activeStep ? activeStep.id : (this.steps.length ? this.steps.first.id : null);
}
/**
* @private
* @param {?} id
* @return {?}
*/
getStepById(id) {
/** @type {?} */
const stepsWithId = this.steps.filter((/**
* @param {?} step
* @return {?}
*/
step => step.id === id));
return stepsWithId.length ? stepsWithId[0] : null;
}
/**
* @return {?}
*/
back() {
/** @type {?} */
const back = this.getStepIdSplice(-1);
this.onSelect(back);
}
/**
* @return {?}
*/
next() {
/** @type {?} */
const next = this.getStepIdSplice(+1);
this.onSelect(next);
}
/**
* @return {?}
*/
complete() {
this.onComplete.emit();
}
/**
* @param {?} stepId
* @return {?}
*/
current(stepId) {
this.onSelect(stepId);
}
/**
* @private
* @param {?} condicion
* @return {?}
*/
getStepIdSplice(condicion) {
/** @type {?} */
const actual = this.activeId;
/** @type {?} */
const splice = actual.slice(0, actual.length - 1);
/** @type {?} */
const index = parseInt(actual.slice((actual.length - 1), actual.length), 10);
/** @type {?} */
const next = `${splice}${(index + (condicion))}`;
return next;
}
/**
* @return {?}
*/
get hidePrevious() {
return this.activeId !== 'nge-step-0';
}
/**
* @return {?}
*/
get hideNext() {
/** @type {?} */
const allLength = (this.steps.length - 1);
return this.activeId !== 'nge-step-' + allLength;
}
/**
* @param {?} stepId
* @return {?}
*/
hideLineRight(stepId) {
/** @type {?} */
const step = parseInt(stepId.slice(stepId.length - 1, stepId.length), 10);
return (this.steps.length !== (step + 1));
}
/**
* @return {?}
*/
ngOnDestroy() {
nextId = 0;
}
}
NgeStepGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'nge-step-group',
template: "<!-- <ul class=\"nav justify-content-center\" id=\"myStep\" role=\"steplist\"> -->\r\n<ul [class]=\"'nav nge-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )\" id=\"myStep\"\r\n role=\"steplist\">\r\n\r\n <!-- <ng-template ngFor let-step [ngForOf]=\"steps\" *ngFor=\"let step of steps\"> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <li class=\"nav-item\">\r\n <a [id]=\"step.id\" class=\"nav-link\" [class.active]=\"step.id === activeId\" [class.disabled]=\"step.disabled || !step.isValidStep\"\r\n role=\"step\" [attr.stepindex]=\"(step.disabled || !step.isValidStep ? '-1': undefined)\"\r\n [attr.aria-controls]=\"(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)\" [attr.aria-expanded]=\"step.id === activeId\"\r\n [attr.aria-disabled]=\"step.disabled || !step.isValidStep\" (click)=\"current(step.id)\"><!---->\r\n <!-- (click)=\"!!onSelect(step.id)\" | Yo Guido declaro haber modificado el codigo de vitmar jhonson, pero si funciona la cosa...vamos con f\u00E9--> \r\n <!-- data-toggle=\"step\" aria-selected=\"true\" -->\r\n <ng-template [ngIf]=\"step.icon\">\r\n <span class=\"nge-round-tabs\" [title]=\"step.title\">\r\n <i class=\"{{ step.icon }} nge-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <br>\r\n <span class=\"nge-round-text\">\r\n {{ step.title }}\r\n </span>\r\n <ng-template [ngTemplateOutlet]=\"step.titleTemplate?.templateRef\"></ng-template>\r\n </a>\r\n </li>\r\n <li class=\"nav-line\" *ngIf=\"hideLineRight(step.id)\">\r\n <div class=\"nge-liner\"></div>\r\n </li>\r\n </ng-template>\r\n\r\n <!-- <ng-content select=\"nge-step-head\"></ng-content> -->\r\n</ul>\r\n<div class=\"tab-content nge-content\" id=\"myStepContent\">\r\n <!-- <ng-content select=\"nge-step-body\"></ng-content> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <!-- class=\"step-pane fade {{ step.id === activeId ? 'active': null }}\" -->\r\n <!--\r\n <div [@slideOfRight]=\"((step.id === activeId) && (status === 'next')) ? 'next': 'back'\" class=\"tab-pane {{ step.id === activeId ? 'active': 'active' }}\"\r\n *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\" [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\"\r\n [attr.aria-expanded]=\"step.id === activeId\"> -->\r\n\r\n <div class=\"tab-pane {{ step.id === activeId ? 'active': null }}\" *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\"\r\n [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\" [attr.aria-expanded]=\"step.id === activeId\">\r\n <div class=\"container\">\r\n <!---<div class=\"row\">\r\n <div class=\"col-md-12\">-->\r\n <ng-template [ngTemplateOutlet]=\"step.contentTemplate?.templateRef\"></ng-template>\r\n <!--</div>\r\n </div>-->\r\n </div>\r\n\r\n\r\n <div class=\"row nge-button-manage\" *ngIf=\"isShowButtons\">\r\n <div class=\"offset-md-4 col-md-4\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-secondary\" (click)=\"back()\">\r\n <span style=\"margin-right:10px;\" class=\"fa fa-arrow-left\"></span>\r\n {{ iConfigNames.buttonBack }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"next()\">\r\n {{ iConfigNames.buttonNext }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-arrow-right\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious && !hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"complete()\">\r\n {{ iConfigNames.buttonFinish }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-check\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>",
// animations: [Animations.slideInOut, Animations.slideOfRight],
animations: [slideOfRight],
styles: [".nge-liner{height:2px;background:#ececec;position:relative;width:5rem;margin:0 auto;right:0;top:1.8rem;z-index:1;left:.5rem;color:#333}.tab-content{padding-top:.3rem}.nav-link{padding:0 0 5px}.nav-link .nge-round-text{color:#000;text-transform:uppercase;font-size:.7rem}@media (max-width:550px){.nge-liner{width:1rem}.nav-link .nge-round-text{display:none}}.nav-link.active span.nge-round-tabs{background:#2962ff;color:#fff}.nge-nav-tabs{border-bottom:transparent;position:relative;margin:0 auto;box-sizing:border-box;text-align:center;padding:0 1.5rem;background-color:#fff;border-radius:1px solid #ccc}.nge-nav-tabs li.nav-line{padding-left:0;padding-right:0}.nge-nav-tabs li a{text-decoration:none}.nge-content{text-align:justify}.nge-button-manage{margin-top:1.5rem}span.nge-round-tabs{width:40px;height:40px;line-height:40px;display:inline-block;border-radius:100px;background:#ececec;z-index:2;left:-1;text-align:center;font-size:1.3rem;position:relative;margin-top:.6rem;margin-bottom:0;color:#333}"]
}] }
];
/** @nocollapse */
NgeStepGroupComponent.ctorParameters = () => [
{ type: NgeStepConfig }
];
NgeStepGroupComponent.propDecorators = {
steps: [{ type: ContentChildren, args: [NgeStepDirective,] }],
activeId: [{ type: Input }],
configNames: [{ type: Input }],
destroyOnHide: [{ type: Input }],
isShowButtons: [{ type: Input }],
stepChange: [{ type: Output }],
onComplete: [{ type: Output }],
justify: [{ type: Input }],
orientation: [{ type: Input }],
type: [{ type: Input }]
};
if (false) {
/** @type {?} */
NgeStepGroupComponent.prototype.justifyClass;
/** @type {?} */
NgeStepGroupComponent.prototype.hideContent;
/** @type {?} */
NgeStepGroupComponent.prototype.steps;
/**
* Id del step que saldrá activado por defecto.
* @type {?}
*/
NgeStepGroupComponent.prototype.activeId;
/**
* Personalizar el nombre 'Anterior | siguiente y Finalizar'
* Formato de variable : objecto
* Ej. configNames: object = {buttonBack: 'Regresar', buttonNext: 'Grabar', buttonFinish: 'Fin'}
* @type {?}
*/
NgeStepGroupComponent.prototype.iConfigNames;
/**
* Cuando cambia de step se destruira el contenido anterior o solo se oculatará?
* @type {?}
*/
NgeStepGroupComponent.prototype.destroyOnHide;
/**
* se va usar los botones en cada paso como: siguiente, atras, finalizar?,
* se muestra por default
* @type {?}
*/
NgeStepGroupComponent.prototype.isShowButtons;
/**
* Emite cuando hay cambios de steps.
* @type {?}
*/
NgeStepGroupComponent.prototype.stepChange;
/** @type {?} */
NgeStepGroupComponent.prototype.onComplete;
/** @type {?} */
NgeStepGroupComponent.prototype.orientation;
/** @type {?} */
NgeStepGroupComponent.prototype.type;
/**
* @type {?}
* @private
*/
NgeStepGroupComponent.prototype.config;
}
/** @type {?} */
export const APP_STEPS_COMPONENTS = [
NgeStepGroupComponent,
NgeStepDirective,
NgeStepTitleDirective,
NgeStepContentDirective,
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmdlLWZhY3R1cmFwZXJ1LyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUMzQixTQUFTLEVBQUUsWUFBWSxFQUN2QixlQUFlLEVBQUUsV0FBVyxFQUF1QixNQUFNLEVBQUUsWUFBWSxHQUMxRSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLM0QsTUFBTSxPQUFPLHFCQUFxQjs7OztJQUM5QixZQUFtQixXQUE2QjtRQUE3QixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7SUFBSSxDQUFDOzs7WUFKeEQsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSwyQkFBMkI7YUFDeEM7Ozs7WUFQb0IsV0FBVzs7OztJQVNoQiw0Q0FBb0M7O0FBTXBELE1BQU0sT0FBTyx1QkFBdUI7Ozs7SUFDaEMsWUFBbUIsV0FBNkI7UUFBN0IsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO0lBQUksQ0FBQzs7O1lBSnhELFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsNkJBQTZCO2FBQzFDOzs7O1lBZG9CLFdBQVc7Ozs7SUFnQmhCLDhDQUFvQzs7O0lBR2hELE1BQU0sR0FBRyxDQUFDO0FBTWQsTUFBTSxPQUFPLGdCQUFnQjtJQUo3QjtRQU1hLE9BQUUsR0FBVyxZQUFZLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFXcEMsYUFBUSxHQUFHLEtBQUssQ0FBQzs7UUFHbkIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7SUFVdkMsQ0FBQzs7Ozs7O0lBUEcsSUFDSSxTQUFTLENBQUMsS0FBdUI7UUFDakMsSUFBSSxDQUFD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LFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7OztJQUVNLFdBQVc7UUFDZCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7O1lBcEpKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQix3d0tBQXFDOztnQkFHckMsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDOzthQUM3Qjs7OztZQS9FcUIsYUFBYTs7O29CQXFGOUIsZUFBZSxTQUFDLGdCQUFnQjt1QkFLaEMsS0FBSzswQkFPTCxLQUFLOzRCQVdMLEtBQUs7NEJBTUwsS0FBSzt5QkFLTCxNQUFNO3lCQUdOLE1BQU07c0JBRU4sS0FBSzswQkF5Q0wsS0FBSzttQkFFTCxLQUFLOzs7O0lBckZOLDZDQUFxQjs7SUFDckIsNENBQW9DOztJQUVwQyxzQ0FBc0U7Ozs7O0lBS3RFLHlDQUEwQjs7Ozs7OztJQU0xQiw2Q0FBaUM7Ozs7O0lBWWpDLDhDQUF3Qzs7Ozs7O0lBTXhDLDhDQUF1Qzs7Ozs7SUFLdkMsMkNBQThEOztJQUc5RCwyQ0FBK0M7O0lBMkMvQyw0Q0FBZ0Q7O0lBRWhELHFDQUFrQzs7Ozs7SUFadEIsdUNBQTZCOzs7QUFxRTdDLE1BQU0sT0FBTyxvQkFBb0IsR0FBRztJQUNoQyxxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQix1QkFBdUI7Q0FDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LCBJbnB1dCwgUXVlcnlMaXN0LFxyXG4gICAgRGlyZWN0aXZlLCBDb250ZW50Q2hpbGQsXHJcbiAgICBDb250ZW50Q2hpbGRyZW4sIFRlbXBsYXRlUmVmLCBBZnRlckNvbnRlbnRDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHNsaWRlT2ZSaWdodCB9IGZyb20gJy4vYW5pbWF0aW9ucy9zbGlkZS1vZi1yaWdodC5hbmltYXRpb24nO1xyXG5pbXBvcnQgeyBDb25maWdOYW1lcywgTmdlU3RlcENvbmZpZyB9IGZyb20gJy4vc3RlcC1jb25maWcnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW25nZVN0ZXBUaXRsZV0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdlU3RlcFRpdGxlRGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtuZ2VTdGVwQ29udGVudF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdlU3RlcENvbnRlbnREaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7IH1cclxufVxyXG5cclxubGV0IG5leHRJZCA9IDA7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnbmdlLXN0ZXAnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdlU3RlcERpcmVjdGl2ZSB7XHJcblxyXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9IGBuZ2Utc3RlcC0ke25leHRJZCsrfWA7XHJcblxyXG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGEgQ3VhbHF1aWVyIGRhdG8uIENyZWFkbyBwb3IgZWwgRXF1aXBvIExhbWIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuXHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgLy8gQElucHV0KCkgZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIHB1YmxpYyBpc1ZhbGlkU3RlcDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyBwdWJsaWMgaXNWYWxpZFN0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHZhbGlkU3RlcCh2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNWYWxpZFN0ZXAgPSAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gdHJ1ZSkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZChOZ2VTdGVwVGl0bGVEaXJlY3RpdmUsIHtzdGF0aWM6IGZhbHNlfSkgdGl0bGVUZW1wbGF0ZTogTmdlU3RlcFRpdGxlRGlyZWN0aXZlO1xyXG4gICAgQENvbnRlbnRDaGlsZChOZ2VTdGVwQ29udGVudERpcmVjdGl2ZSwge3N0YXRpYzogZmFsc2V9KSBjb250ZW50VGVtcGxhdGU6IE5nZVN0ZXBDb250ZW50RGlyZWN0aXZlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nZVN0ZXBDaGFuZ2VFdmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIElkIGRlIGxhIHBlc3Rhw7FhIGFjdHVhbG1lbnRlIGFjdGl2YS5cclxuICAgICAqL1xyXG4gICAgYWN0aXZlSWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIGRlIGxhIHBlc3Rhw7FhIHJlY2nDqW4gc2VsZWNjaW9uYWRhLlxyXG4gICAgICovXHJcbiAgICBuZXh0SWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIGRhdGEgZ3VhcmRhZGEgZW4gbGEgcGVzdGHDsWEgYWN0dWFsbWVudGUgYWN0aXZhLlxyXG4gICAgICovXHJcbiAgICBhY3RpdmVEYXRhOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jacOzbiBxdWUgZXZpdGFyw6EgZWwgY2FtYmlvIGRlIHBlcnRhw7FhIHNpIHNlIGxsYW1hLlxyXG4gICAgICovXHJcbiAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdm9pZDtcclxuXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZ2Utc3RlcC1ncm91cCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3RlcHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vc3RlcHMuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIC8vIGFuaW1hdGlvbnM6IFtBbmltYXRpb25zLnNsaWRlSW5PdXQsIEFuaW1hdGlvbnMuc2xpZGVPZlJpZ2h0XSxcclxuICAgIGFuaW1hdGlvbnM6IFtzbGlkZU9mUmlnaHRdLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE5nZVN0ZXBHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95IHtcclxuICAgIGp1c3RpZnlDbGFzczogc3RyaW5nO1xyXG4gICAgcHVibGljIGhpZGVDb250ZW50OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihOZ2VTdGVwRGlyZWN0aXZlKSBzdGVwczogUXVlcnlMaXN0PE5nZVN0ZXBEaXJlY3RpdmU+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgZGVsIHN0ZXAgcXVlIHNhbGRyw6EgYWN0aXZhZG8gcG9yIGRlZmVjdG8uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGFjdGl2ZUlkOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFBlcnNvbmFsaXphciBlbCBub21icmUgJ0FudGVyaW9yIHwgc2lndWllbnRlIHkgRmluYWxpemFyJ1xyXG4gICAgICogRm9ybWF0byBkZSB2YXJpYWJsZSA6IG9iamVjdG9cclxuICAgICAqIEVqLiBjb25maWdOYW1lczogb2JqZWN0ID0ge2J1dHRvbkJhY2s6ICdSZWdyZXNhcicsIGJ1dHRvbk5leHQ6ICdHcmFiYXInLCBidXR0b25GaW5pc2g6ICdGaW4nfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaUNvbmZpZ05hbWVzOiBDb25maWdOYW1lcztcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgY29uZmlnTmFtZXMoY29uZmlnbjogQ29uZmlnTmFtZXMpIHtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25CYWNrID0gY29uZmlnbi5idXR0b25CYWNrIHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkJhY2s7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uTmV4dCA9IGNvbmZpZ24uYnV0dG9uTmV4dCB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25OZXh0O1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaCA9IGNvbmZpZ24uYnV0dG9uRmluaXNoIHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1YW5kbyBjYW1iaWEgZGUgc3RlcCBzZSBkZXN0cnVpcmEgZWwgY29udGVuaWRvIGFudGVyaW9yIG8gc29sbyBzZSBvY3VsYXRhcsOhP1xyXG4gICAgICovXHJcbiAgICAvLyBASW5wdXQoKSBkZXN0cm95T25IaWRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGRlc3Ryb3lPbkhpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKlxyXG4gICAgICogc2UgdmEgdXNhciBsb3MgYm90b25lcyBlbiBjYWRhIHBhc28gY29tbzogc2lndWllbnRlLCBhdHJhcywgZmluYWxpemFyPywgXHJcbiAgICAgKiBzZSBtdWVzdHJhIHBvciBkZWZhdWx0XHJcbiAgICAgKi9cclxuICAgIC8vIEBJbnB1dCgpIGlzU2hvd0J1dHRvbnM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgaXNTaG93QnV0dG9uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRW1pdGUgY3VhbmRvIGhheSBjYW1iaW9zIGRlIHN0ZXBzLlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TmdlU3RlcENoYW5nZUV2ZW50PigpO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgb25Db21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQganVzdGlmeShjbGFzc05hbWU6ICdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgJ2ZpbGwnIHwgJ2p1c3RpZmllZCcpIHtcclxuICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnZmlsbCcgfHwgY2xhc3NOYW1lID09PSAnanVzdGlmaWVkJykge1xyXG4gICAgICAgICAgICB0aGlzLmp1c3RpZnlDbGFzcyA9IGBuYXYtJHtjbGFzc05hbWV9YDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmp1c3RpZnlDbGFzcyA9IGBqdXN0aWZ5LWNvbnRlbnQtJHtjbGFzc05hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3Qoc3RlcElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwID0gdGhpcy5nZXRTdGVwQnlJZChzdGVwSWQpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aXZlID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnc2VsZWN0ZWRTdGVwJyk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coc2VsZWN0ZWRTdGVwKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkU3RlcCAmJiAhc2VsZWN0ZWRTdGVwLmRpc2FibGVkICYmIHRoaXMuYWN0aXZlSWQgIT09IHNlbGVjdGVkU3RlcC5pZCkge1xyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0ZXBDaGFuZ2UuZW1pdChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVJZDogdGhpcy5hY3RpdmVJZCxcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVEYXRhOiBzZWxlY3RlZEFjdGl2ZS5kYXRhIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dElkOiBzZWxlY3RlZFN0ZXAuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHsgZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoIWRlZmF1bHRQcmV2ZW50ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWQgPSBzZWxlY3RlZFN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogTmdlU3RlcENvbmZpZykge1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5qdXN0aWZ5ID0gdGhpcy5jb25maWcuanVzdGlmeTtcclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5jb25maWcub3JpZW50YXRpb247XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMgPSB0aGlzLmNvbmZpZy5jb25maWdOYW1lcztcclxuICAgIH1cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgfVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KCkgdHlwZTogJ3N0ZXBzcycgfCAncGlsbHMnO1xyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVTdGVwID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUlkID0gYWN0aXZlU3RlcCA/IGFjdGl2ZVN0ZXAuaWQgOiAodGhpcy5zdGVwcy5sZW5ndGggPyB0aGlzLnN0ZXBzLmZpcnN0LmlkIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwQnlJZChpZDogc3RyaW5nKTogTmdlU3RlcERpcmVjdGl2ZSB7XHJcbiAgICAgICAgY29uc3Qgc3RlcHNXaXRoSWQ6IE5nZVN0ZXBEaXJlY3RpdmVbXSA9IHRoaXMuc3RlcHMuZmlsdGVyKHN0ZXAgPT4gc3RlcC5pZCA9PT0gaWQpO1xyXG4gICAgICAgIHJldHVybiBzdGVwc1dpdGhJZC5sZW5ndGggPyBzdGVwc1dpdGhJZFswXSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJhY2soKSB7XHJcbiAgICAgICAgY29uc3QgYmFjayA9IHRoaXMuZ2V0U3RlcElkU3BsaWNlKC0xKTtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0KGJhY2spO1xyXG5cclxuICAgIH1cclxuICAgIHB1YmxpYyBuZXh0KCkge1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldFN0ZXBJZFNwbGljZSgrMSk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3QobmV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGN1cnJlbnQoc3RlcElkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0KHN0ZXBJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwSWRTcGxpY2UoY29uZGljaW9uOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBhY3R1YWwgPSB0aGlzLmFjdGl2ZUlkO1xyXG4gICAgICAgIGNvbnN0IHNwbGljZSA9IGFjdHVhbC5zbGljZSgwLCBhY3R1YWwubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChhY3R1YWwuc2xpY2UoKGFjdHVhbC5sZW5ndGggLSAxKSwgYWN0dWFsLmxlbmd0aCksIDEwKTtcclxuICAgICAgICBjb25zdCBuZXh0ID0gYCR7c3BsaWNlfSR7KGluZGV4ICsgKGNvbmRpY2lvbikpfWA7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGhpZGVQcmV2aW91cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ25nZS1zdGVwLTAnO1xyXG4gICAgfVxyXG4gICAgZ2V0IGhpZGVOZXh0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGFsbExlbmd0aCA9ICh0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUlkICE9PSAnbmdlLXN0ZXAtJyArIGFsbExlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZUxpbmVSaWdodChzdGVwSWQpIHtcclxuICAgICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoc3RlcElkLnNsaWNlKHN0ZXBJZC5sZW5ndGggLSAxLCBzdGVwSWQubGVuZ3RoKSwgMTApO1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGVwcy5sZW5ndGggIT09IChzdGVwICsgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBuZXh0SWQgPSAwO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQVBQX1NURVBTX0NPTVBPTkVOVFMgPSBbXHJcbiAgICBOZ2VTdGVwR3JvdXBDb21wb25lbnQsXHJcbiAgICBOZ2VTdGVwRGlyZWN0aXZlLFxyXG4gICAgTmdlU3RlcFRpdGxlRGlyZWN0aXZlLFxyXG4gICAgTmdlU3RlcENvbnRlbnREaXJlY3RpdmUsXHJcbl07XHJcblxyXG4iXX0=