iptdevs-design-system
Version:
Library common elements into IPT Plattform.
227 lines • 48.5 kB
JavaScript
import { animate, style, transition, trigger } from '@angular/animations';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Validators } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../../../core/services/parameters-service/parameters.service";
import * as i3 from "../../../core/services/user-service/user-service";
import * as i4 from "@angular/common";
import * as i5 from "../../atoms/button/button.component";
import * as i6 from "../../atoms/input/input.component";
import * as i7 from "../../atoms/select/select.component";
export class CreateUserFormComponent {
constructor(fb, parameterService, userService) {
this.fb = fb;
this.parameterService = parameterService;
this.userService = userService;
this.visibility = false;
this.userCreated = new EventEmitter(false);
this.onHide = new EventEmitter(false);
this.loader = false;
this.photo = '';
}
ngOnInit() {
this.initForm();
this.getParameters();
}
closeModal() {
this.visibility = false;
this.onHide.emit(true);
}
createUser() {
this.loader = true;
let request = {
name: this.createUserForm.controls['name'].value,
last_name: this.createUserForm.controls['last_name'].value,
id_card_type: this.createUserForm.controls['id_card_type'].value,
id_card: this.createUserForm.controls['id_card'].value,
phone_indicative: this.createUserForm.controls['phone_indicative'].value,
phone_number: this.createUserForm.controls['phone_number'].value,
email: this.createUserForm.controls['email'].value,
city: this.createUserForm.controls['city'].value,
service_hour: this.createUserForm.controls['service_hour'].value,
role: this.createUserForm.controls['role'].value,
password: this.createUserForm.controls['password'].value,
};
this.userService.registerDashboard(request).subscribe((response) => {
switch (response.message.code) {
case 1:
this.userCreated.emit(true);
this.initForm();
break;
case 2:
throw new Error("Los datos ingresados no corresponden a un usuario registrado en nuestro sistema, por favor reviselos.");
case 3:
throw new Error("Los datos ingresados no cumplen los parámetros establecidos");
default:
break;
}
this.loader = false;
});
}
getParameters() {
this.parameterService.getIndicatives().subscribe((response) => {
this.phoneNumberIndicatives = response.data;
});
this.parameterService.getCardTypes('col').subscribe((response) => {
this.idTypes = response.data;
});
this.parameterService.getStatesByCountry('col').subscribe((response) => {
this.states = response.data;
});
}
getRolesOptions() {
// Estudiante
if (this.userType === 'student') {
this.setPhoto('student');
return [
{ code: '13', name: 'Student' },
];
}
// Académico
if (this.userType === 'academic') {
this.setPhoto('academic');
return [
{ code: '11', name: 'Academic Coordinator' },
{ code: '12', name: 'Teacher' },
];
}
// Administrativo
if (this.userType === 'administrative') {
this.setPhoto('administrative');
return [
{ code: '31', name: 'Administrative Coordinator' },
{ code: '32', name: 'Administrative Advisor' },
];
}
// Marketing
if (this.userType === 'marketing') {
this.setPhoto('marketing');
return [
{ code: '21', name: 'Marketing Coordinator' },
{ code: '22', name: 'Marketing Advisor' },
];
}
// Comercial
if (this.userType === 'commercial') {
this.setPhoto('commercial');
return [
{ code: '41', name: 'Commercial Coordinator' },
{ code: '42', name: 'Commercial Advisor' },
];
}
// Cartera
if (this.userType === 'treasure') {
this.setPhoto('treasure');
return [
{ code: '51', name: 'Treauser Coordinator' },
{ code: '52', name: 'Treauser Advisor' },
];
}
}
initForm() {
this.createUserForm = this.fb.group({
name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(32)],],
last_name: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(32),],],
email: ['', [Validators.required, Validators.maxLength(300)]],
id_card_type: ['', [Validators.required]],
id_card: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(20),]],
phone_indicative: ['', [Validators.required]],
city: ['', [Validators.required]],
role: ['', [Validators.required]],
service_hour: ['', [Validators.required]],
phone_number: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(15)]],
password: ['', [Validators.required, Validators.minLength(7), Validators.maxLength(32)]],
re_password: ['', [Validators.required, Validators.minLength(7), Validators.maxLength(32)]],
state: [''],
});
}
setPhoto(type) {
if (type === 'student')
this.photo = '/platform/academic/assets/student.jpg';
if (type === 'academic')
this.photo = '/platform/academic/assets/academico.png';
if (type === 'administrative')
this.photo = '/platform/administrative/assets/administrativo.jpg';
if (type === 'marketing')
this.photo = '/platform/marketing/assets//marketing.jpg';
if (type === 'commercial')
this.photo = '/platform/commercial/assets/user-form-assets/comercial.jpg';
if (type === 'treasure')
this.photo = '/platform/treasure/assets/administrativo.jpg';
}
selectRol(role) {
if (role !== 'Seleccione el rol') {
this.createUserForm.controls['role'].setValue(role);
}
else {
this.createUserForm.controls['role'].setValue(null);
}
}
selectIndicatives(indicative) {
if (indicative !== 'Seleccione el indicativo') {
this.createUserForm.controls['phone_indicative'].setValue(indicative);
}
else {
this.createUserForm.controls['phone_indicative'].setValue(null);
}
}
selectIdType(idType) {
if (idType !== 'Ingrese el tipo de documento') {
this.createUserForm.controls['id_card_type'].setValue(idType);
}
else {
this.createUserForm.controls['id_card_type'].setValue(null);
}
}
selectState(state) {
if (state !== 'Seleccione el departamento') {
this.createUserForm.controls['state'].setValue(state);
this.parameterService.getCitiesByState(state).subscribe((response) => {
this.cities = response.data;
});
}
else {
this.createUserForm.controls['state'].setValue(null);
this.createUserForm.controls['city'].setValue(null);
this.cities = [];
}
}
selectCity(city) {
if (city !== 'Ciudad de residencia') {
this.createUserForm.controls['city'].setValue(city);
}
else {
this.createUserForm.controls['city'].setValue(null);
}
}
}
CreateUserFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: CreateUserFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ParameterService }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component });
CreateUserFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.7", type: CreateUserFormComponent, selector: "ipt-create-user-form", inputs: { userType: "userType", visibility: "visibility" }, outputs: { userCreated: "userCreated", onHide: "onHide" }, ngImport: i0, template: "<main *ngIf=\"visibility\">\n <div @fade class=\"modal_container\">\n <div class=\"header_modal\">\n <h1>Crear usuario de {{ userType | titlecase}}</h1>\n <button (click)=\"closeModal()\">x</button>\n </div>\n <div class=\"grid_container\">\n <div>\n <form autocomplete=\"off\" [formGroup]=\"createUserForm\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"createUserForm.controls['name']\"\n [validateText]=\"'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"createUserForm.controls['last_name']\"\n [validateText]=\"'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Email'\"\n [control]=\"createUserForm.controls['email']\"\n [validateText]=\"'Debe tener dominio @inglesparatodos.edu.co'\"\n ></ipt-input>\n <ipt-select\n [isRequired]=\"true\"\n [defaultText]=\"'Rol'\"\n (eventSelect)=\"selectRol($event)\"\n [data]=\"getRolesOptions()\"\n ></ipt-select>\n <ipt-select\n [isRequired]=\"true\"\n [data]=\"phoneNumberIndicatives\"\n (eventSelect)=\"selectIndicatives($event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"createUserForm.controls['phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType($event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"createUserForm.controls['id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [isRequired]=\"true\"\n (eventSelect)=\"selectState($event)\"\n [data]=\"states\"\n [defaultText]=\"'Departamento'\"\n ></ipt-select>\n <ipt-select\n [isRequired]=\"true\"\n (eventSelect)=\"selectCity($event)\"\n [data]=\"cities\"\n [defaultText]=\"'Ciudad'\"\n ></ipt-select>\n <ipt-input *ngIf=\"!(userType === 'student')\"\n [inputType]=\"'number'\"\n [placeHolder]=\"'Horas de servicio'\"\n [control]=\"createUserForm.controls['service_hour']\"\n [validateText]=\"'Debe ingresar las horas de servicio'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Contrase\u00F1a'\"\n [control]=\"createUserForm.controls['password']\"\n >\n </ipt-input>\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Repetir contrase\u00F1a'\"\n [control]=\"createUserForm.controls['re_password']\"\n >\n </ipt-input>\n </form>\n\n <div class=\"buttons-container\">\n <ipt-button\n [label]=\"'Crear usuario'\"\n [isEnabled]=\"\n !loader &&\n createUserForm.value['re_password'] ===\n createUserForm.value['password']\n \"\n (onClick)=\"createUser()\"\n [primary]=\"true\"\n >\n </ipt-button>\n </div>\n </div>\n <div [ngStyle]=\"{'background-image': 'url(' + photo + ')'}\" class=\"user_type_image\"></div>\n </div>\n </div>\n</main>\n", styles: ["@media screen and (min-width: 320px){main{background:rgba(0,0,0,.472);color:#fff;position:fixed;top:0;left:0;height:100vh;width:100vw;transition:all .5s}main .modal_container{width:60%;height:-moz-fit-content;height:fit-content;position:absolute;inset:0;margin:auto;background-color:#fff;border-radius:3px}.header_modal{display:flex;padding:15px 15px 0;gap:1rem;align-items:center}.header_modal h1{padding:.5rem;background-color:#1c77f7;color:#fff;width:100%;border-radius:10px;font-size:1.25rem;font-weight:700}.header_modal button{margin-left:auto;font-size:26px;padding:1.2rem;font-weight:200;color:#6c7f7d;display:flex;width:25px;height:25px;align-items:center;justify-content:center;transition:50ms;background-color:transparent;border:none}.header_modal button:hover{cursor:pointer;border-radius:50%;background-color:#d4d4d4}.grid_container{display:grid;grid-template-columns:1fr;padding:0 15px}form{display:grid;grid-template-columns:1fr;gap:.25rem;justify-content:center;padding:0 1rem}.buttons-container{margin-top:2rem;margin-bottom:2rem;display:flex;justify-content:center;align-items:center;justify-items:center;align-content:center}.user_type_image{display:none}}@media screen and (min-width: 768px){form{display:grid;grid-template-columns:1fr 1fr;gap:1rem;justify-content:center}}@media screen and (min-width: 1366px){form{padding:0rem}.grid_container{display:grid;grid-template-columns:1fr 250px;gap:1rem}.user_type_image{display:flex;background-size:cover;background-repeat:no-repeat;background-position:center;height:100%;border-radius:1rem;padding:1rem}}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.ButtonComponent, selector: "ipt-button", inputs: ["primary", "size", "label", "buttonType", "isEnabled"], outputs: ["onClick"] }, { kind: "component", type: i6.InputComponent, selector: "ipt-input", inputs: ["inputType", "placeHolder", "validateText", "withPipe", "list", "iconUrl", "control", "prefix", "thousands", "decimal", "disabledSel"], outputs: ["dateSelected"] }, { kind: "component", type: i7.SelectComponent, selector: "ipt-select", inputs: ["isRequired", "data", "defaultText", "selectCode", "disabledSel", "initialValue", "label", "control"], outputs: ["eventSelect"] }, { kind: "pipe", type: i4.TitleCasePipe, name: "titlecase" }], animations: [
trigger('fade', [
transition('void => *', [
style({ opacity: 0 }),
animate(200, style({ opacity: 1 }))
])
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: CreateUserFormComponent, decorators: [{
type: Component,
args: [{ selector: 'ipt-create-user-form', animations: [
trigger('fade', [
transition('void => *', [
style({ opacity: 0 }),
animate(200, style({ opacity: 1 }))
])
])
], template: "<main *ngIf=\"visibility\">\n <div @fade class=\"modal_container\">\n <div class=\"header_modal\">\n <h1>Crear usuario de {{ userType | titlecase}}</h1>\n <button (click)=\"closeModal()\">x</button>\n </div>\n <div class=\"grid_container\">\n <div>\n <form autocomplete=\"off\" [formGroup]=\"createUserForm\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"createUserForm.controls['name']\"\n [validateText]=\"'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"createUserForm.controls['last_name']\"\n [validateText]=\"'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Email'\"\n [control]=\"createUserForm.controls['email']\"\n [validateText]=\"'Debe tener dominio @inglesparatodos.edu.co'\"\n ></ipt-input>\n <ipt-select\n [isRequired]=\"true\"\n [defaultText]=\"'Rol'\"\n (eventSelect)=\"selectRol($event)\"\n [data]=\"getRolesOptions()\"\n ></ipt-select>\n <ipt-select\n [isRequired]=\"true\"\n [data]=\"phoneNumberIndicatives\"\n (eventSelect)=\"selectIndicatives($event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"createUserForm.controls['phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType($event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"createUserForm.controls['id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [isRequired]=\"true\"\n (eventSelect)=\"selectState($event)\"\n [data]=\"states\"\n [defaultText]=\"'Departamento'\"\n ></ipt-select>\n <ipt-select\n [isRequired]=\"true\"\n (eventSelect)=\"selectCity($event)\"\n [data]=\"cities\"\n [defaultText]=\"'Ciudad'\"\n ></ipt-select>\n <ipt-input *ngIf=\"!(userType === 'student')\"\n [inputType]=\"'number'\"\n [placeHolder]=\"'Horas de servicio'\"\n [control]=\"createUserForm.controls['service_hour']\"\n [validateText]=\"'Debe ingresar las horas de servicio'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Contrase\u00F1a'\"\n [control]=\"createUserForm.controls['password']\"\n >\n </ipt-input>\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Repetir contrase\u00F1a'\"\n [control]=\"createUserForm.controls['re_password']\"\n >\n </ipt-input>\n </form>\n\n <div class=\"buttons-container\">\n <ipt-button\n [label]=\"'Crear usuario'\"\n [isEnabled]=\"\n !loader &&\n createUserForm.value['re_password'] ===\n createUserForm.value['password']\n \"\n (onClick)=\"createUser()\"\n [primary]=\"true\"\n >\n </ipt-button>\n </div>\n </div>\n <div [ngStyle]=\"{'background-image': 'url(' + photo + ')'}\" class=\"user_type_image\"></div>\n </div>\n </div>\n</main>\n", styles: ["@media screen and (min-width: 320px){main{background:rgba(0,0,0,.472);color:#fff;position:fixed;top:0;left:0;height:100vh;width:100vw;transition:all .5s}main .modal_container{width:60%;height:-moz-fit-content;height:fit-content;position:absolute;inset:0;margin:auto;background-color:#fff;border-radius:3px}.header_modal{display:flex;padding:15px 15px 0;gap:1rem;align-items:center}.header_modal h1{padding:.5rem;background-color:#1c77f7;color:#fff;width:100%;border-radius:10px;font-size:1.25rem;font-weight:700}.header_modal button{margin-left:auto;font-size:26px;padding:1.2rem;font-weight:200;color:#6c7f7d;display:flex;width:25px;height:25px;align-items:center;justify-content:center;transition:50ms;background-color:transparent;border:none}.header_modal button:hover{cursor:pointer;border-radius:50%;background-color:#d4d4d4}.grid_container{display:grid;grid-template-columns:1fr;padding:0 15px}form{display:grid;grid-template-columns:1fr;gap:.25rem;justify-content:center;padding:0 1rem}.buttons-container{margin-top:2rem;margin-bottom:2rem;display:flex;justify-content:center;align-items:center;justify-items:center;align-content:center}.user_type_image{display:none}}@media screen and (min-width: 768px){form{display:grid;grid-template-columns:1fr 1fr;gap:1rem;justify-content:center}}@media screen and (min-width: 1366px){form{padding:0rem}.grid_container{display:grid;grid-template-columns:1fr 250px;gap:1rem}.user_type_image{display:flex;background-size:cover;background-repeat:no-repeat;background-position:center;height:100%;border-radius:1rem;padding:1rem}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ParameterService }, { type: i3.UserService }]; }, propDecorators: { userType: [{
type: Input
}], visibility: [{
type: Input
}], userCreated: [{
type: Output
}], onHide: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXVzZXItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy9jcmVhdGUtdXNlci1mb3JtL2NyZWF0ZS11c2VyLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY3JlYXRlLXVzZXItZm9ybS9jcmVhdGUtdXNlci1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQWtCcEUsTUFBTSxPQUFPLHVCQUF1QjtJQWNsQyxZQUNVLEVBQWUsRUFDZixnQkFBa0MsRUFDbEMsV0FBd0I7UUFGeEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFmekIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUMzQixnQkFBVyxHQUFHLElBQUksWUFBWSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQy9DLFdBQU0sR0FBRyxJQUFJLFlBQVksQ0FBVSxLQUFLLENBQUMsQ0FBQztRQU1wRCxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXhCLFVBQUssR0FBVyxFQUFFLENBQUM7SUFNaEIsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixJQUFJLE9BQU8sR0FBd0I7WUFDakMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUs7WUFDaEQsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUs7WUFDMUQsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUs7WUFDaEUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUs7WUFDdEQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxLQUFLO1lBQ3hFLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLO1lBQ2hFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLO1lBQ2xELElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO1lBQ2hELFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLO1lBQ2hFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO1lBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLO1NBQ3pELENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pFLFFBQVEsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQzdCLEtBQUssQ0FBQztvQkFDSixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNoQixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixNQUFNLElBQUksS0FBSyxDQUFDLHVHQUF1RyxDQUFDLENBQUM7Z0JBQzNILEtBQUssQ0FBQztvQkFDSixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7Z0JBQ2pGO29CQUNFLE1BQU07YUFDVDtZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBd0IsRUFBRSxFQUFFO1lBQzVFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUF3QixFQUFFLEVBQUU7WUFDL0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBUSxFQUFFO1lBQzNFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ2IsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QixPQUFPO2dCQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2FBQ2hDLENBQUM7U0FDSDtRQUVELFlBQVk7UUFDWixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUIsT0FBTztnQkFDTCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFO2dCQUM1QyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTthQUNoQyxDQUFDO1NBQ0g7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixFQUFFO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNoQyxPQUFPO2dCQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUU7Z0JBQ2xELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7YUFDL0MsQ0FBQztTQUNIO1FBRUQsWUFBWTtRQUNaLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMzQixPQUFPO2dCQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7Z0JBQzdDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7YUFDMUMsQ0FBQztTQUNIO1FBRUQsWUFBWTtRQUNaLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM1QixPQUFPO2dCQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7Z0JBQzlDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7YUFDM0MsQ0FBQztTQUNIO1FBRUQsVUFBVTtRQUNWLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixPQUFPO2dCQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7Z0JBQzVDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7YUFDekMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDbEYsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4RixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RCxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN4RixnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdGLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEYsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRixLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVk7UUFDbkIsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsdUNBQXVDLENBQUE7UUFDNUUsSUFBSSxJQUFJLEtBQUssVUFBVTtZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcseUNBQXlDLENBQUE7UUFDL0UsSUFBSSxJQUFJLEtBQUssZ0JBQWdCO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxvREFBb0QsQ0FBQTtRQUNoRyxJQUFJLElBQUksS0FBSyxXQUFXO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRywyQ0FBMkMsQ0FBQTtRQUNsRixJQUFJLElBQUksS0FBSyxZQUFZO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyw0REFBNEQsQ0FBQTtRQUNwRyxJQUFJLElBQUksS0FBSyxVQUFVO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyw4Q0FBOEMsQ0FBQTtJQUN0RixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVM7UUFDakIsSUFBSSxJQUFJLEtBQUssbUJBQW1CLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsVUFBZTtRQUMvQixJQUFJLFVBQVUsS0FBSywwQkFBMEIsRUFBRTtZQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN2RTthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQVc7UUFDdEIsSUFBSSxNQUFNLEtBQUssOEJBQThCLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9EO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0Q7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVU7UUFDcEIsSUFBSSxLQUFLLEtBQUssNEJBQTRCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVM7UUFDbEIsSUFBSSxJQUFJLEtBQUssc0JBQXNCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDOztvSEF6TVUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsbUxDcEJwQyxnOUhBMkdBLG0wRkRoR2M7UUFDVixPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ2QsVUFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNyQixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO2FBQ2xDLENBQUM7U0FDSCxDQUFDO0tBQ0g7MkZBRVUsdUJBQXVCO2tCQWJuQyxTQUFTOytCQUNFLHNCQUFzQixjQUdwQjt3QkFDVixPQUFPLENBQUMsTUFBTSxFQUFFOzRCQUNkLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0NBQ3RCLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQ0FDckIsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzs2QkFDbEMsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIOzJKQUdRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJEYXNoYm9hcmRScSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3VzZXIvdXNlci1ycS5tb2RlbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9wYXJhbWV0ZXJzLXNlcnZpY2UvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy91c2VyLXNlcnZpY2UvdXNlci1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaXB0LWNyZWF0ZS11c2VyLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLXVzZXItZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS11c2VyLWZvcm0uY29tcG9uZW50LmNzcyddLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZmFkZScsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgICBhbmltYXRlKDIwMCwgc3R5bGUoe29wYWNpdHk6IDF9KSlcbiAgICAgIF0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVVc2VyRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHVzZXJUeXBlITogc3RyaW5nO1xuICBASW5wdXQoKSB2aXNpYmlsaXR5OiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB1c2VyQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuICBAT3V0cHV0KCkgb25IaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgY3JlYXRlVXNlckZvcm0hOiBGb3JtR3JvdXA7XG4gIHBob25lTnVtYmVySW5kaWNhdGl2ZXM6IGFueTtcbiAgaWRUeXBlczogYW55O1xuICBzdGF0ZXM6IGFueTtcbiAgbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGNpdGllczogYW55O1xuICBwaG90bzogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBwYXJhbWV0ZXJTZXJ2aWNlOiBQYXJhbWV0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgdGhpcy5nZXRQYXJhbWV0ZXJzKCk7XG4gIH1cblxuICBjbG9zZU1vZGFsKCkge1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IGZhbHNlO1xuICAgIHRoaXMub25IaWRlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBjcmVhdGVVc2VyKCkge1xuICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcblxuICAgIGxldCByZXF1ZXN0OiBSZWdpc3RlckRhc2hib2FyZFJxID0ge1xuICAgICAgbmFtZTogdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snbmFtZSddLnZhbHVlLFxuICAgICAgbGFzdF9uYW1lOiB0aGlzLmNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydsYXN0X25hbWUnXS52YWx1ZSxcbiAgICAgIGlkX2NhcmRfdHlwZTogdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZF90eXBlJ10udmFsdWUsXG4gICAgICBpZF9jYXJkOiB0aGlzLmNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydpZF9jYXJkJ10udmFsdWUsXG4gICAgICBwaG9uZV9pbmRpY2F0aXZlOiB0aGlzLmNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwaG9uZV9pbmRpY2F0aXZlJ10udmFsdWUsXG4gICAgICBwaG9uZV9udW1iZXI6IHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bob25lX251bWJlciddLnZhbHVlLFxuICAgICAgZW1haWw6IHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10udmFsdWUsXG4gICAgICBjaXR5OiB0aGlzLmNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaXR5J10udmFsdWUsXG4gICAgICBzZXJ2aWNlX2hvdXI6IHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3NlcnZpY2VfaG91ciddLnZhbHVlLFxuICAgICAgcm9sZTogdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1sncm9sZSddLnZhbHVlLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bhc3N3b3JkJ10udmFsdWUsXG4gICAgfTtcblxuICAgIHRoaXMudXNlclNlcnZpY2UucmVnaXN0ZXJEYXNoYm9hcmQocmVxdWVzdCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgc3dpdGNoIChyZXNwb25zZS5tZXNzYWdlLmNvZGUpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMudXNlckNyZWF0ZWQuZW1pdCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb3MgZGF0b3MgaW5ncmVzYWRvcyBubyBjb3JyZXNwb25kZW4gYSB1biB1c3VhcmlvIHJlZ2lzdHJhZG8gZW4gbnVlc3RybyBzaXN0ZW1hLCBwb3IgZmF2b3IgcmV2aXNlbG9zLlwiKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvcyBkYXRvcyBpbmdyZXNhZG9zIG5vIGN1bXBsZW4gbG9zIHBhcsOhbWV0cm9zIGVzdGFibGVjaWRvc1wiKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBnZXRQYXJhbWV0ZXJzKCkge1xuICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5nZXRJbmRpY2F0aXZlcygpLnN1YnNjcmliZSgocmVzcG9uc2U6IHsgZGF0YTogYW55OyB9KSA9PiB7XG4gICAgICB0aGlzLnBob25lTnVtYmVySW5kaWNhdGl2ZXMgPSByZXNwb25zZS5kYXRhO1xuICAgIH0pO1xuICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5nZXRDYXJkVHlwZXMoJ2NvbCcpLnN1YnNjcmliZSgocmVzcG9uc2U6IHsgZGF0YTogYW55OyB9KSA9PiB7XG4gICAgICB0aGlzLmlkVHlwZXMgPSByZXNwb25zZS5kYXRhO1xuICAgIH0pO1xuICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5nZXRTdGF0ZXNCeUNvdW50cnkoJ2NvbCcpLnN1YnNjcmliZSgocmVzcG9uc2UpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuc3RhdGVzID0gcmVzcG9uc2UuZGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFJvbGVzT3B0aW9ucygpOiBhbnkge1xuICAgIC8vIEVzdHVkaWFudGVcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3N0dWRlbnQnKSB7XG4gICAgICB0aGlzLnNldFBob3RvKCdzdHVkZW50Jyk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGNvZGU6ICcxMycsIG5hbWU6ICdTdHVkZW50JyB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBBY2Fkw6ltaWNvXG4gICAgaWYgKHRoaXMudXNlclR5cGUgPT09ICdhY2FkZW1pYycpIHtcbiAgICAgIHRoaXMuc2V0UGhvdG8oJ2FjYWRlbWljJyk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGNvZGU6ICcxMScsIG5hbWU6ICdBY2FkZW1pYyBDb29yZGluYXRvcicgfSxcbiAgICAgICAgeyBjb2RlOiAnMTInLCBuYW1lOiAnVGVhY2hlcicgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gQWRtaW5pc3RyYXRpdm9cbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ2FkbWluaXN0cmF0aXZlJykge1xuICAgICAgdGhpcy5zZXRQaG90bygnYWRtaW5pc3RyYXRpdmUnKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsgY29kZTogJzMxJywgbmFtZTogJ0FkbWluaXN0cmF0aXZlIENvb3JkaW5hdG9yJyB9LFxuICAgICAgICB7IGNvZGU6ICczMicsIG5hbWU6ICdBZG1pbmlzdHJhdGl2ZSBBZHZpc29yJyB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBNYXJrZXRpbmdcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ21hcmtldGluZycpIHtcbiAgICAgIHRoaXMuc2V0UGhvdG8oJ21hcmtldGluZycpO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBjb2RlOiAnMjEnLCBuYW1lOiAnTWFya2V0aW5nIENvb3JkaW5hdG9yJyB9LFxuICAgICAgICB7IGNvZGU6ICcyMicsIG5hbWU6ICdNYXJrZXRpbmcgQWR2aXNvcicgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gQ29tZXJjaWFsXG4gICAgaWYgKHRoaXMudXNlclR5cGUgPT09ICdjb21tZXJjaWFsJykge1xuICAgICAgdGhpcy5zZXRQaG90bygnY29tbWVyY2lhbCcpO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBjb2RlOiAnNDEnLCBuYW1lOiAnQ29tbWVyY2lhbCBDb29yZGluYXRvcicgfSxcbiAgICAgICAgeyBjb2RlOiAnNDInLCBuYW1lOiAnQ29tbWVyY2lhbCBBZHZpc29yJyB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBDYXJ0ZXJhXG4gICAgaWYgKHRoaXMudXNlclR5cGUgPT09ICd0cmVhc3VyZScpIHtcbiAgICAgIHRoaXMuc2V0UGhvdG8oJ3RyZWFzdXJlJyk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGNvZGU6ICc1MScsIG5hbWU6ICdUcmVhdXNlciBDb29yZGluYXRvcicgfSxcbiAgICAgICAgeyBjb2RlOiAnNTInLCBuYW1lOiAnVHJlYXVzZXIgQWR2aXNvcicgfSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaW5pdEZvcm0oKSB7XG4gICAgdGhpcy5jcmVhdGVVc2VyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbmFtZTogWycnLFtWYWxpZGF0b3JzLnJlcXVpcmVkLFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV0sXSxcbiAgICAgIGxhc3RfbmFtZTogWycnLFtWYWxpZGF0b3JzLnJlcXVpcmVkLFZhbGlkYXRvcnMubWluTGVuZ3RoKDUpLFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKSxdLF0sXG4gICAgICBlbWFpbDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzAwKV1dLFxuICAgICAgaWRfY2FyZF90eXBlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBpZF9jYXJkOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg1KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjApLF1dLFxuICAgICAgcGhvbmVfaW5kaWNhdGl2ZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY2l0eTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcm9sZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgc2VydmljZV9ob3VyOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBwaG9uZV9udW1iZXI6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTUpXV0sXG4gICAgICBwYXNzd29yZDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNyksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV1dLFxuICAgICAgcmVfcGFzc3dvcmQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDcpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgzMildXSxcbiAgICAgIHN0YXRlOiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0UGhvdG8odHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGUgPT09ICdzdHVkZW50JykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vYWNhZGVtaWMvYXNzZXRzL3N0dWRlbnQuanBnJ1xuICAgIGlmICh0eXBlID09PSAnYWNhZGVtaWMnKSB0aGlzLnBob3RvID0gJy9wbGF0Zm9ybS9hY2FkZW1pYy9hc3NldHMvYWNhZGVtaWNvLnBuZydcbiAgICBpZiAodHlwZSA9PT0gJ2FkbWluaXN0cmF0aXZlJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vYWRtaW5pc3RyYXRpdmUvYXNzZXRzL2FkbWluaXN0cmF0aXZvLmpwZydcbiAgICBpZiAodHlwZSA9PT0gJ21hcmtldGluZycpIHRoaXMucGhvdG8gPSAnL3BsYXRmb3JtL21hcmtldGluZy9hc3NldHMvL21hcmtldGluZy5qcGcnXG4gICAgaWYgKHR5cGUgPT09ICdjb21tZXJjaWFsJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vY29tbWVyY2lhbC9hc3NldHMvdXNlci1mb3JtLWFzc2V0cy9jb21lcmNpYWwuanBnJ1xuICAgIGlmICh0eXBlID09PSAndHJlYXN1cmUnKSB0aGlzLnBob3RvID0gJy9wbGF0Zm9ybS90cmVhc3VyZS9hc3NldHMvYWRtaW5pc3RyYXRpdm8uanBnJ1xuICB9XG5cbiAgc2VsZWN0Um9sKHJvbGU6IGFueSkge1xuICAgIGlmIChyb2xlICE9PSAnU2VsZWNjaW9uZSBlbCByb2wnKSB7XG4gICAgICB0aGlzLmNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydyb2xlJ10uc2V0VmFsdWUocm9sZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3JvbGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RJbmRpY2F0aXZlcyhpbmRpY2F0aXZlOiBhbnkpIHtcbiAgICBpZiAoaW5kaWNhdGl2ZSAhPT0gJ1NlbGVjY2lvbmUgZWwgaW5kaWNhdGl2bycpIHtcbiAgICAgIHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bob25lX2luZGljYXRpdmUnXS5zZXRWYWx1ZShpbmRpY2F0aXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1sncGhvbmVfaW5kaWNhdGl2ZSddLnNldFZhbHVlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdElkVHlwZShpZFR5cGU6IGFueSkge1xuICAgIGlmIChpZFR5cGUgIT09ICdJbmdyZXNlIGVsIHRpcG8gZGUgZG9jdW1lbnRvJykge1xuICAgICAgdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZF90eXBlJ10uc2V0VmFsdWUoaWRUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZF90eXBlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0U3RhdGUoc3RhdGU6IGFueSkge1xuICAgIGlmIChzdGF0ZSAhPT0gJ1NlbGVjY2lvbmUgZWwgZGVwYXJ0YW1lbnRvJykge1xuICAgICAgdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS5zZXRWYWx1ZShzdGF0ZSk7XG4gICAgICB0aGlzLnBhcmFtZXRlclNlcnZpY2UuZ2V0Q2l0aWVzQnlTdGF0ZShzdGF0ZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmNpdGllcyA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q2l0eShjaXR5OiBhbnkpIHtcbiAgICBpZiAoY2l0eSAhPT0gJ0NpdWRhZCBkZSByZXNpZGVuY2lhJykge1xuICAgICAgdGhpcy5jcmVhdGVVc2VyRm9ybS5jb250cm9sc1snY2l0eSddLnNldFZhbHVlKGNpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaXR5J10uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG59XG4iLCI8bWFpbiAqbmdJZj1cInZpc2liaWxpdHlcIj5cbiAgPGRpdiBAZmFkZSBjbGFzcz1cIm1vZGFsX2NvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJfbW9kYWxcIj5cbiAgICAgIDxoMT5DcmVhciB1c3VhcmlvIGRlIHt7IHVzZXJUeXBlIHwgdGl0bGVjYXNlfX08L2gxPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+eDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJncmlkX2NvbnRhaW5lclwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Zvcm1Hcm91cF09XCJjcmVhdGVVc2VyRm9ybVwiPlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInTm9tYnJlcydcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIGVsIG5vbWJyZSdcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0FwZWxsaWRvcydcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ2xhc3RfbmFtZSddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgbG9zIGFwZWxsaWRvcydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VtYWlsJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJjcmVhdGVVc2VyRm9ybS5jb250cm9sc1snZW1haWwnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIHRlbmVyIGRvbWluaW8gQGluZ2xlc3BhcmF0b2Rvcy5lZHUuY28nXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgPGlwdC1zZWxlY3RcbiAgICAgICAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXh0XT1cIidSb2wnXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RSb2woJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGF0YV09XCJnZXRSb2xlc09wdGlvbnMoKVwiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LXNlbGVjdFxuICAgICAgICAgICAgW2lzUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGF0YV09XCJwaG9uZU51bWJlckluZGljYXRpdmVzXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RJbmRpY2F0aXZlcygkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkZWZhdWx0VGV4dF09XCInSW5kaWNhdGl2bydcIlxuICAgICAgICAgID48L2lwdC1zZWxlY3Q+XG4gICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgW2lucHV0VHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ1RlbMOpZm9ubydcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bob25lX251bWJlciddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgdW4gbsO6bWVybyBkZSB0ZWzDqWZvbm8gdsOhbGlkbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LXNlbGVjdFxuICAgICAgICAgICAgW2lzUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGF0YV09XCJpZFR5cGVzXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RJZFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1RpcG8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInRG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJjcmVhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgZWwgbsO6bWVybyBkZSBkb2N1bWVudG8nXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgPGlwdC1zZWxlY3RcbiAgICAgICAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgKGV2ZW50U2VsZWN0KT1cInNlbGVjdFN0YXRlKCRldmVudClcIlxuICAgICAgICAgICAgW2RhdGFdPVwic3RhdGVzXCJcbiAgICAgICAgICAgIFtkZWZhdWx0VGV4dF09XCInRGVwYXJ0YW1lbnRvJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LXNlbGVjdFxuICAgICAgICAgICAgW2lzUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0Q2l0eSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImNpdGllc1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ0NpdWRhZCdcIlxuICAgICAgICAgID48L2lwdC1zZWxlY3Q+XG4gICAgICAgICAgPGlwdC1pbnB1dCAqbmdJZj1cIiEodXNlclR5cGUgPT09ICdzdHVkZW50JylcIlxuICAgICAgICAgICAgW2lucHV0VHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0hvcmFzIGRlIHNlcnZpY2lvJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJjcmVhdGVVc2VyRm9ybS5jb250cm9sc1snc2VydmljZV9ob3VyJ11cIlxuICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBsYXMgaG9yYXMgZGUgc2VydmljaW8nXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgW2lucHV0VHlwZV09XCIncGFzc3dvcmQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInQ29udHJhc2XDsWEnXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cImNyZWF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXNzd29yZCddXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9pcHQtaW5wdXQ+XG4gICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgW2lucHV0VHlwZV09XCIncGFzc3dvcmQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInUmVwZXRpciBjb250cmFzZcOxYSdcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiY3JlYXRlVXNlckZvcm0uY29udHJvbHNbJ3JlX3Bhc3N3b3JkJ11cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2lwdC1pbnB1dD5cbiAgICAgICAgPC9mb3JtPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxpcHQtYnV0dG9uXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ0NyZWFyIHVzdWFyaW8nXCJcbiAgICAgICAgICAgIFtpc0VuYWJsZWRdPVwiXG4gICAgICAgICAgICAgICFsb2FkZXIgJiZcbiAgICAgICAgICAgICAgY3JlYXRlVXNlckZvcm0udmFsdWVbJ3JlX3Bhc3N3b3JkJ10gPT09XG4gICAgICAgICAgICAgIGNyZWF0ZVVzZXJGb3JtLnZhbHVlWydwYXNzd29yZCddXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG9uQ2xpY2spPVwiY3JlYXRlVXNlcigpXCJcbiAgICAgICAgICAgIFtwcmltYXJ5XT1cInRydWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2lwdC1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIHBob3RvICsgJyknfVwiIGNsYXNzPVwidXNlcl90eXBlX2ltYWdlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9tYWluPlxuIl19