ctt-babylon 0.1.163 → 0.1.164

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,20 +1,19 @@
1
1
  import { CommonModule, isPlatformBrowser } from '@angular/common';
2
2
  import { Component, Inject, Input, PLATFORM_ID, ViewChild, ViewEncapsulation, } from '@angular/core';
3
- import { FormsModule } from '@angular/forms';
3
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../../../services/color-panel.service";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "@angular/forms";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "@angular/common";
8
8
  export class BabylonColorPickerComponent {
9
- constructor(colorService, renderer, platformId) {
9
+ constructor(colorService, renderer, platformId, fb) {
10
10
  this.colorService = colorService;
11
11
  this.renderer = renderer;
12
12
  this.platformId = platformId;
13
+ this.fb = fb;
13
14
  this.userPanel = '';
14
15
  this.passPanel = '';
15
16
  this.googleFontsApiKey = 'AIzaSyAVbzzOmAJfsAsi951e636ym-ABWy2BOMA';
16
- this.emailInput = '';
17
- this.passInput = '';
18
17
  this.mostrarPanel = false;
19
18
  this.loginHecho = false;
20
19
  this.minimizado = false;
@@ -27,6 +26,10 @@ export class BabylonColorPickerComponent {
27
26
  this.isDragging = false;
28
27
  this.dragStartX = 0;
29
28
  this.dragStartY = 0;
29
+ this.loginForm = this.fb.group({
30
+ email: [''],
31
+ password: ['']
32
+ });
30
33
  }
31
34
  ngOnInit() {
32
35
  if (isPlatformBrowser(this.platformId)) {
@@ -48,8 +51,8 @@ export class BabylonColorPickerComponent {
48
51
  }
49
52
  }
50
53
  async login() {
51
- if (this.emailInput === this.userPanel &&
52
- this.passInput === this.passPanel) {
54
+ const { email, password } = this.loginForm.value;
55
+ if (email === this.userPanel && password === this.passPanel) {
53
56
  this.loginHecho = true;
54
57
  sessionStorage.setItem('panel-login-ok', 'true');
55
58
  const variables = this.colorService.getAllCSSVariables();
@@ -160,15 +163,14 @@ export class BabylonColorPickerComponent {
160
163
  const match = fullValue.match(/^['"]?([^'",]+)['"]?/);
161
164
  return match ? match[1] : fullValue;
162
165
  }
163
- updateFontVariable(variableName, fontName) {
166
+ updateFontVariable(event, variableName) {
167
+ const target = event.target;
168
+ const fontName = target?.value;
169
+ if (!fontName)
170
+ return;
164
171
  const value = `'${fontName}', Helvetica, sans-serif`;
165
172
  this.colorService.changeColor(variableName, value, this.groupedVariables);
166
- const isPredefined = [
167
- 'font-title',
168
- 'font-pretitle',
169
- 'font-text',
170
- 'font-claim',
171
- ].includes(fontName);
173
+ const isPredefined = ['font-title', 'font-pretitle', 'font-text', 'font-claim'].includes(fontName);
172
174
  if (isPredefined)
173
175
  return;
174
176
  const formattedFont = fontName.replace(/ /g, '+');
@@ -186,7 +188,6 @@ export class BabylonColorPickerComponent {
186
188
  .getPropertyValue(variableName)
187
189
  .trim();
188
190
  const clean = raw.replace(/["']/g, '');
189
- // Expande #fff a #ffffff
190
191
  if (/^#([0-9a-fA-F]{3})$/.test(clean)) {
191
192
  return ('#' +
192
193
  clean
@@ -201,13 +202,11 @@ export class BabylonColorPickerComponent {
201
202
  const color = getComputedStyle(document.documentElement)
202
203
  .getPropertyValue(variableName)
203
204
  .trim();
204
- // Creamos un elemento temporal para resolver el color real
205
- const temp = document.createElement('div');
206
- temp.style.color = color;
207
- document.body.appendChild(temp);
208
- const resolved = getComputedStyle(temp).color;
209
- document.body.removeChild(temp);
210
- // Extrae RGB y convierte a #RRGGBB
205
+ const el = document.createElement('div');
206
+ el.style.color = color;
207
+ document.body.appendChild(el);
208
+ const resolved = getComputedStyle(el).color;
209
+ document.body.removeChild(el);
211
210
  const match = resolved.match(/\d+/g);
212
211
  if (!match || match.length < 3)
213
212
  return '#000000';
@@ -217,16 +216,16 @@ export class BabylonColorPickerComponent {
217
216
  parseInt(g).toString(16).padStart(2, '0') +
218
217
  parseInt(b).toString(16).padStart(2, '0'));
219
218
  }
220
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BabylonColorPickerComponent, deps: [{ token: i1.ColorPickerService }, { token: i0.Renderer2 }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
221
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BabylonColorPickerComponent, isStandalone: true, selector: "lib-babylon-color-picker", inputs: { userPanel: "userPanel", passPanel: "passPanel" }, viewQueries: [{ propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: "<!-- Mostrar el panel solo si mostrarPanel es true -->\n@if (mostrarPanel) {\n <!-- LOGIN PANEL -->\n @if (!loginHecho) {\n <div class=\"login-panel\">\n <h2>Panel de estilos</h2>\n <input\n type=\"text\"\n placeholder=\"Usuario\"\n [(ngModel)]=\"emailInput\"\n (keydown.enter)=\"login()\"\n />\n <input\n type=\"password\"\n placeholder=\"Contrase\u00F1a\"\n [(ngModel)]=\"passInput\"\n (keydown.enter)=\"login()\"\n />\n <button (click)=\"login()\">Entrar</button>\n </div>\n } @else {\n <!-- ESTILO PANEL -->\n <div\n #panel\n class=\"color-picker-panel\"\n [class.minimizado]=\"minimizado\"\n (mousedown)=\"onDragStart($event)\"\n >\n <div class=\"drag-header\">\n <h1>Panel de estilos</h1>\n <button\n class=\"minimize-btn\"\n (click)=\"toggleMinimizado()\"\n title=\"Minimizar/Restaurar panel\"\n >\n {{ minimizado ? '\uFF0B' : '\uFF0D' }}\n </button>\n </div>\n\n @if (!minimizado) {\n <!-- TABS -->\n <div class=\"tabs\">\n @for (tab of tabs; track tab) {\n <button\n [class.active]=\"activeTab === tab\"\n (click)=\"setActiveTab(tab)\"\n >\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- RESET & EXPORT -->\n <div class=\"reset-export-container\">\n <button class=\"reset-button\" (click)=\"resetColors()\">\n Resetear estilos\n </button>\n <button class=\"export-button\" (click)=\"exportCSS()\">\n Exportar CSS\n </button>\n </div>\n\n <!-- GRUPOS DE VARIABLES -->\n <div class=\"groups-wrapper\">\n @for (\n group of groupedVariables | keyvalue;\n track group.key\n ) {\n @if (getTabForGroup(group.key) === activeTab) {\n <div class=\"group-box\">\n <div\n class=\"group-header\"\n (click)=\"toggleGroup(group.key)\"\n >\n <h2>{{ group.key }}</h2>\n <span\n class=\"arrow\"\n [class.expanded]=\"\n isGroupExpanded(group.key)\n \"\n >\u2335</span\n >\n </div>\n\n @if (isGroupExpanded(group.key)) {\n <div class=\"group-content\">\n @for (\n variable of group.value;\n track variable.name\n ) {\n <div class=\"color-picker-item\">\n <label>{{\n variable.name.replace(\n '--',\n ''\n )\n }}</label>\n\n @if (isColor(variable.value)) {\n <input\n type=\"color\"\n [value]=\"\n getHexForColorInput(\n variable.name\n )\n \"\n (input)=\"\n changeColor(\n $event,\n variable.name\n )\n \"\n />\n } @else {\n @if (\n group.key ===\n 'Tipograf\u00EDas'\n ) {\n <select\n [ngModel]=\"\n getFontNameOnly(\n variable.value\n )\n \"\n (ngModelChange)=\"\n updateFontVariable(\n variable.name,\n $event\n )\n \"\n >\n <optgroup\n label=\"Fuentes del proyecto\"\n >\n @for (\n font of colorService.projectFonts;\n track font\n ) {\n @if (\n ![\n 'font-title',\n 'font-pretitle',\n 'font-text',\n 'font-claim',\n ].includes(\n font\n )\n ) {\n <option\n [value]=\"\n font\n \"\n >\n {{\n font\n }}\n </option>\n }\n }\n </optgroup>\n\n <optgroup\n label=\"Google Fonts\"\n >\n @for (\n font of colorService.googleFonts;\n track font\n ) {\n <option\n [value]=\"\n font\n \"\n >\n {{\n font\n }}\n </option>\n }\n </optgroup>\n </select>\n } @else {\n <input\n type=\"text\"\n [value]=\"\n variable.value\n \"\n (input)=\"\n changeColor(\n $event,\n variable.name\n )\n \"\n />\n }\n }\n\n <div class=\"tooltip-container\">\n <button\n class=\"copy-btn\"\n (click)=\"\n copyToClipboard(\n variable.value,\n variable.name\n )\n \"\n >\n \uD83D\uDCCB\n </button>\n <span class=\"tooltip-text\"\n >Copiar</span\n >\n </div>\n\n @if (wasCopied(variable.name)) {\n <span class=\"copied-msg\"\n >Copiado \u2714\uFE0F</span\n >\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n}\n", styles: [".login-panel{all:initial;position:fixed;top:50px;left:50px;width:350px;background:#333;box-shadow:0 8px 20px #0000001a;padding:1rem;z-index:100000;display:flex;flex-direction:column;gap:.5rem;font-family:var(--font-text)}.login-panel *{all:revert;font-family:var(--font-text)}.login-panel h2{margin-top:0;font-size:1.2rem;text-align:center;color:#fff;margin-bottom:.2rem}.login-panel input{padding:.5rem;font-size:1rem;border:1px solid #ccc;border-radius:0;font-size:12px;outline-color:#aa8453}.login-panel button{background-color:#aa8453;color:#fff;border:none;border-radius:0;padding:.6rem;cursor:pointer;font-weight:700}.login-panel button:hover{background-color:#6d5639}.color-picker-panel{all:initial;position:fixed;top:50px;left:50px;width:450px;height:400px;max-width:95%;max-height:80vh;overflow-y:auto;overflow-x:hidden;background:#333;border-radius:0;box-shadow:0 8px 20px #0000001a;z-index:100000;-webkit-user-select:none;user-select:none;cursor:grab;scrollbar-gutter:stable;font-family:sans-serif;padding-bottom:20px;color:#fff;font-weight:100;font-family:var(--font-text)}.color-picker-panel *{all:revert;font-family:var(--font-text);font-weight:100}.color-picker-panel:active{cursor:grabbing}.color-picker-panel.minimizado{height:auto;width:450px;overflow:hidden;padding-bottom:.5rem}.drag-header{display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;background:#333;padding:.5rem;border-bottom:0;border-radius:0}.drag-header h1{font-size:1.2rem;margin:0;-webkit-user-select:none;user-select:none;text-align:center;flex-grow:1}.drag-header .minimize-btn{background:none;background-color:#ffffff40;color:#fff;border:none;font-size:1.2rem;cursor:pointer;padding:.2rem .5rem;-webkit-user-select:none;user-select:none}.drag-header .minimize-btn:hover{transform:scale(1.1)}.tabs{display:flex;border-bottom:1px solid #aa8453}.tabs button{flex:1;padding:.5rem;background:#aa9a85;border:none;cursor:pointer;color:#e4d9cb;font-weight:100;font-size:.8rem}.tabs button.active{background:#aa8453;border-bottom:2px solid #6d5639}.tabs button:hover{background:#6d5639}.reset-export-container{display:flex;flex-direction:row;gap:.5rem;padding:.5rem}.reset-button{width:100%;background-color:#aa8453;color:#fff;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.reset-button:hover{background-color:#6d5639}.export-button{width:100%;background-color:#fff;color:#aa8453;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.export-button:hover{background-color:#6d5639;color:#fff}.groups-wrapper{display:flex;flex-direction:column;gap:.5rem;padding:0 .5rem}.group-box{background:#4e4c4cf0;border-radius:0;padding:.2rem .5rem}.group-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.group-header h2{font-size:14px;margin:0;font-weight:100}.group-header .arrow{font-size:1.2rem;transition:transform .3s ease}.group-header .arrow.expanded{transform:rotate(180deg)}.group-content{margin-top:.5rem}.color-picker-item{display:flex;align-items:center;gap:.5rem;margin-bottom:5px}.color-picker-item label{flex:1;font-size:.75rem;color:#fff;white-space:nowrap}.color-picker-item input[type=color]{width:45px;height:28px;padding:0;border:1px solid #ccc;border-radius:4px;flex-shrink:0}.color-picker-item input[type=text],.color-picker-item select{width:140px;height:28px;padding:0 .4rem;font-size:.85rem;border:1px solid #ccc;border-radius:4px}.color-picker-item .tooltip-container{position:relative;display:inline-block;display:none}.color-picker-item .tooltip-container .copy-btn{flex-shrink:0;font-size:1rem;background:none;border:none;cursor:pointer;padding:.3rem}.color-picker-item .tooltip-container .copy-btn:hover{transform:scale(1.1)}.color-picker-item .tooltip-container .copy-btn:hover+.tooltip-text{opacity:1;visibility:visible}.color-picker-item .tooltip-container .tooltip-text{position:absolute;bottom:120%;left:50%;transform:translate(-50%);background-color:#333;color:#fff;padding:.3rem .5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;opacity:0;visibility:hidden;transition:opacity .2s ease;z-index:1000}.color-picker-item .copied-msg{font-size:.75rem;color:green;margin-left:auto;animation:fadeOut 1s ease forwards}@keyframes fadeOut{0%{opacity:1}80%{opacity:1}to{opacity:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
219
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BabylonColorPickerComponent, deps: [{ token: i1.ColorPickerService }, { token: i0.Renderer2 }, { token: PLATFORM_ID }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
220
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BabylonColorPickerComponent, isStandalone: true, selector: "lib-babylon-color-picker", inputs: { userPanel: "userPanel", passPanel: "passPanel" }, viewQueries: [{ propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\">\n <div class=\"login-panel\">\n <h2>Panel de estilos</h2>\n <input\n type=\"text\"\n placeholder=\"Usuario\"\n formControlName=\"email\"\n (keydown.enter)=\"login()\"\n />\n <input\n type=\"password\"\n placeholder=\"Contrase\u00F1a\"\n formControlName=\"password\"\n (keydown.enter)=\"login()\"\n />\n <button type=\"submit\">Entrar</button>\n </div>\n</form>\n\n<!-- ESTILO PANEL -->\n@if (loginHecho) {\n <div\n #panel\n class=\"color-picker-panel\"\n [class.minimizado]=\"minimizado\"\n (mousedown)=\"onDragStart($event)\"\n >\n <div class=\"drag-header\">\n <h1>Panel de estilos</h1>\n <button\n class=\"minimize-btn\"\n (click)=\"toggleMinimizado()\"\n title=\"Minimizar/Restaurar panel\"\n >\n {{ minimizado ? '\uFF0B' : '\uFF0D' }}\n </button>\n </div>\n\n @if (!minimizado) {\n <div class=\"tabs\">\n @for (tab of tabs; track tab) {\n <button\n [class.active]=\"activeTab === tab\"\n (click)=\"setActiveTab(tab)\"\n >\n {{ tab }}\n </button>\n }\n </div>\n\n <div class=\"reset-export-container\">\n <button class=\"reset-button\" (click)=\"resetColors()\">\n Resetear estilos\n </button>\n <button class=\"export-button\" (click)=\"exportCSS()\">\n Exportar CSS\n </button>\n </div>\n\n <div class=\"groups-wrapper\">\n @for (group of groupedVariables | keyvalue; track group.key) {\n @if (getTabForGroup(group.key) === activeTab) {\n <div class=\"group-box\">\n <div\n class=\"group-header\"\n (click)=\"toggleGroup(group.key)\"\n >\n <h2>{{ group.key }}</h2>\n <span\n class=\"arrow\"\n [class.expanded]=\"isGroupExpanded(group.key)\"\n >\u2335</span\n >\n </div>\n\n @if (isGroupExpanded(group.key)) {\n <div class=\"group-content\">\n @for (variable of group.value; track variable.name) {\n <div class=\"color-picker-item\">\n <label>{{ variable.name.replace('--', '') }}</label>\n\n @if (isColor(variable.value)) {\n <input\n type=\"color\"\n [value]=\"getHexForColorInput(variable.name)\"\n (input)=\"changeColor($event, variable.name)\"\n />\n } @else {\n @if (\n ['T\u00EDtulos', 'Pret\u00EDtulos', 'Subt\u00EDtulos', 'Textos', 'Fuentes'].includes(group.key)\n ) {\n <select\n [value]=\"fontValues[variable.name]\"\n (change)=\"updateFontVariable($event, variable.name)\"\n >\n <optgroup label=\"Fuentes del proyecto\">\n @for (font of colorService.projectFonts; track font) {\n @if (!['font-title', 'font-pretitle', 'font-text', 'font-claim'].includes(font)) {\n <option [value]=\"font\">{{ font }}</option>\n }\n }\n </optgroup>\n\n <optgroup label=\"Google Fonts\">\n @for (font of colorService.googleFonts; track font) {\n <option [value]=\"font\">{{ font }}</option>\n }\n </optgroup>\n </select>\n } @else {\n <input\n type=\"text\"\n [value]=\"variable.value\"\n (input)=\"changeColor($event, variable.name)\"\n />\n }\n }\n\n <div class=\"tooltip-container\">\n <button\n class=\"copy-btn\"\n (click)=\"copyToClipboard(variable.value, variable.name)\"\n >\n \uD83D\uDCCB\n </button>\n <span class=\"tooltip-text\">Copiar</span>\n </div>\n\n @if (wasCopied(variable.name)) {\n <span class=\"copied-msg\">Copiado \u2714\uFE0F</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n}\n", styles: [".login-panel{all:initial;position:fixed;top:50px;left:50px;width:350px;background:#333;box-shadow:0 8px 20px #0000001a;padding:1rem;z-index:100000;display:flex;flex-direction:column;gap:.5rem;font-family:var(--font-text)}.login-panel *{all:revert;font-family:var(--font-text)}.login-panel h2{margin-top:0;font-size:1.2rem;text-align:center;color:#fff;margin-bottom:.2rem}.login-panel input{padding:.5rem;font-size:1rem;border:1px solid #ccc;border-radius:0;font-size:12px;outline-color:#aa8453}.login-panel button{background-color:#aa8453;color:#fff;border:none;border-radius:0;padding:.6rem;cursor:pointer;font-weight:700}.login-panel button:hover{background-color:#6d5639}.color-picker-panel{all:initial;position:fixed;top:50px;left:50px;width:450px;height:400px;max-width:95%;max-height:80vh;overflow-y:auto;overflow-x:hidden;background:#333;border-radius:0;box-shadow:0 8px 20px #0000001a;z-index:100000;-webkit-user-select:none;user-select:none;cursor:grab;scrollbar-gutter:stable;font-family:sans-serif;padding-bottom:20px;color:#fff;font-weight:100;font-family:var(--font-text)}.color-picker-panel *{all:revert;font-family:var(--font-text);font-weight:100}.color-picker-panel:active{cursor:grabbing}.color-picker-panel.minimizado{height:auto;width:450px;overflow:hidden;padding-bottom:.5rem}.drag-header{display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;background:#333;padding:.5rem;border-bottom:0;border-radius:0}.drag-header h1{font-size:1.2rem;margin:0;-webkit-user-select:none;user-select:none;text-align:center;flex-grow:1}.drag-header .minimize-btn{background:none;background-color:#ffffff40;color:#fff;border:none;font-size:1.2rem;cursor:pointer;padding:.2rem .5rem;-webkit-user-select:none;user-select:none}.drag-header .minimize-btn:hover{transform:scale(1.1)}.tabs{display:flex;border-bottom:1px solid #aa8453}.tabs button{flex:1;padding:.5rem;background:#aa9a85;border:none;cursor:pointer;color:#e4d9cb;font-weight:100;font-size:.8rem}.tabs button.active{background:#aa8453;border-bottom:2px solid #6d5639}.tabs button:hover{background:#6d5639}.reset-export-container{display:flex;flex-direction:row;gap:.5rem;padding:.5rem}.reset-button{width:100%;background-color:#aa8453;color:#fff;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.reset-button:hover{background-color:#6d5639}.export-button{width:100%;background-color:#fff;color:#aa8453;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.export-button:hover{background-color:#6d5639;color:#fff}.groups-wrapper{display:flex;flex-direction:column;gap:.5rem;padding:0 .5rem}.group-box{background:#4e4c4cf0;border-radius:0;padding:.2rem .5rem}.group-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.group-header h2{font-size:14px;margin:0;font-weight:100}.group-header .arrow{font-size:1.2rem;transition:transform .3s ease}.group-header .arrow.expanded{transform:rotate(180deg)}.group-content{margin-top:.5rem}.color-picker-item{display:flex;align-items:center;gap:.5rem;margin-bottom:5px}.color-picker-item label{flex:1;font-size:.75rem;color:#fff;white-space:nowrap}.color-picker-item input[type=color]{width:45px;height:28px;padding:0;border:1px solid #ccc;border-radius:4px;flex-shrink:0}.color-picker-item input[type=text],.color-picker-item select{width:140px;height:28px;padding:0 .4rem;font-size:.85rem;border:1px solid #ccc;border-radius:4px}.color-picker-item .tooltip-container{position:relative;display:inline-block;display:none}.color-picker-item .tooltip-container .copy-btn{flex-shrink:0;font-size:1rem;background:none;border:none;cursor:pointer;padding:.3rem}.color-picker-item .tooltip-container .copy-btn:hover{transform:scale(1.1)}.color-picker-item .tooltip-container .copy-btn:hover+.tooltip-text{opacity:1;visibility:visible}.color-picker-item .tooltip-container .tooltip-text{position:absolute;bottom:120%;left:50%;transform:translate(-50%);background-color:#333;color:#fff;padding:.3rem .5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;opacity:0;visibility:hidden;transition:opacity .2s ease;z-index:1000}.color-picker-item .copied-msg{font-size:.75rem;color:green;margin-left:auto;animation:fadeOut 1s ease forwards}@keyframes fadeOut{0%{opacity:1}80%{opacity:1}to{opacity:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
222
221
  }
223
222
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BabylonColorPickerComponent, decorators: [{
224
223
  type: Component,
225
- args: [{ selector: 'lib-babylon-color-picker', standalone: true, imports: [CommonModule, FormsModule], encapsulation: ViewEncapsulation.ShadowDom, template: "<!-- Mostrar el panel solo si mostrarPanel es true -->\n@if (mostrarPanel) {\n <!-- LOGIN PANEL -->\n @if (!loginHecho) {\n <div class=\"login-panel\">\n <h2>Panel de estilos</h2>\n <input\n type=\"text\"\n placeholder=\"Usuario\"\n [(ngModel)]=\"emailInput\"\n (keydown.enter)=\"login()\"\n />\n <input\n type=\"password\"\n placeholder=\"Contrase\u00F1a\"\n [(ngModel)]=\"passInput\"\n (keydown.enter)=\"login()\"\n />\n <button (click)=\"login()\">Entrar</button>\n </div>\n } @else {\n <!-- ESTILO PANEL -->\n <div\n #panel\n class=\"color-picker-panel\"\n [class.minimizado]=\"minimizado\"\n (mousedown)=\"onDragStart($event)\"\n >\n <div class=\"drag-header\">\n <h1>Panel de estilos</h1>\n <button\n class=\"minimize-btn\"\n (click)=\"toggleMinimizado()\"\n title=\"Minimizar/Restaurar panel\"\n >\n {{ minimizado ? '\uFF0B' : '\uFF0D' }}\n </button>\n </div>\n\n @if (!minimizado) {\n <!-- TABS -->\n <div class=\"tabs\">\n @for (tab of tabs; track tab) {\n <button\n [class.active]=\"activeTab === tab\"\n (click)=\"setActiveTab(tab)\"\n >\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- RESET & EXPORT -->\n <div class=\"reset-export-container\">\n <button class=\"reset-button\" (click)=\"resetColors()\">\n Resetear estilos\n </button>\n <button class=\"export-button\" (click)=\"exportCSS()\">\n Exportar CSS\n </button>\n </div>\n\n <!-- GRUPOS DE VARIABLES -->\n <div class=\"groups-wrapper\">\n @for (\n group of groupedVariables | keyvalue;\n track group.key\n ) {\n @if (getTabForGroup(group.key) === activeTab) {\n <div class=\"group-box\">\n <div\n class=\"group-header\"\n (click)=\"toggleGroup(group.key)\"\n >\n <h2>{{ group.key }}</h2>\n <span\n class=\"arrow\"\n [class.expanded]=\"\n isGroupExpanded(group.key)\n \"\n >\u2335</span\n >\n </div>\n\n @if (isGroupExpanded(group.key)) {\n <div class=\"group-content\">\n @for (\n variable of group.value;\n track variable.name\n ) {\n <div class=\"color-picker-item\">\n <label>{{\n variable.name.replace(\n '--',\n ''\n )\n }}</label>\n\n @if (isColor(variable.value)) {\n <input\n type=\"color\"\n [value]=\"\n getHexForColorInput(\n variable.name\n )\n \"\n (input)=\"\n changeColor(\n $event,\n variable.name\n )\n \"\n />\n } @else {\n @if (\n group.key ===\n 'Tipograf\u00EDas'\n ) {\n <select\n [ngModel]=\"\n getFontNameOnly(\n variable.value\n )\n \"\n (ngModelChange)=\"\n updateFontVariable(\n variable.name,\n $event\n )\n \"\n >\n <optgroup\n label=\"Fuentes del proyecto\"\n >\n @for (\n font of colorService.projectFonts;\n track font\n ) {\n @if (\n ![\n 'font-title',\n 'font-pretitle',\n 'font-text',\n 'font-claim',\n ].includes(\n font\n )\n ) {\n <option\n [value]=\"\n font\n \"\n >\n {{\n font\n }}\n </option>\n }\n }\n </optgroup>\n\n <optgroup\n label=\"Google Fonts\"\n >\n @for (\n font of colorService.googleFonts;\n track font\n ) {\n <option\n [value]=\"\n font\n \"\n >\n {{\n font\n }}\n </option>\n }\n </optgroup>\n </select>\n } @else {\n <input\n type=\"text\"\n [value]=\"\n variable.value\n \"\n (input)=\"\n changeColor(\n $event,\n variable.name\n )\n \"\n />\n }\n }\n\n <div class=\"tooltip-container\">\n <button\n class=\"copy-btn\"\n (click)=\"\n copyToClipboard(\n variable.value,\n variable.name\n )\n \"\n >\n \uD83D\uDCCB\n </button>\n <span class=\"tooltip-text\"\n >Copiar</span\n >\n </div>\n\n @if (wasCopied(variable.name)) {\n <span class=\"copied-msg\"\n >Copiado \u2714\uFE0F</span\n >\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n}\n", styles: [".login-panel{all:initial;position:fixed;top:50px;left:50px;width:350px;background:#333;box-shadow:0 8px 20px #0000001a;padding:1rem;z-index:100000;display:flex;flex-direction:column;gap:.5rem;font-family:var(--font-text)}.login-panel *{all:revert;font-family:var(--font-text)}.login-panel h2{margin-top:0;font-size:1.2rem;text-align:center;color:#fff;margin-bottom:.2rem}.login-panel input{padding:.5rem;font-size:1rem;border:1px solid #ccc;border-radius:0;font-size:12px;outline-color:#aa8453}.login-panel button{background-color:#aa8453;color:#fff;border:none;border-radius:0;padding:.6rem;cursor:pointer;font-weight:700}.login-panel button:hover{background-color:#6d5639}.color-picker-panel{all:initial;position:fixed;top:50px;left:50px;width:450px;height:400px;max-width:95%;max-height:80vh;overflow-y:auto;overflow-x:hidden;background:#333;border-radius:0;box-shadow:0 8px 20px #0000001a;z-index:100000;-webkit-user-select:none;user-select:none;cursor:grab;scrollbar-gutter:stable;font-family:sans-serif;padding-bottom:20px;color:#fff;font-weight:100;font-family:var(--font-text)}.color-picker-panel *{all:revert;font-family:var(--font-text);font-weight:100}.color-picker-panel:active{cursor:grabbing}.color-picker-panel.minimizado{height:auto;width:450px;overflow:hidden;padding-bottom:.5rem}.drag-header{display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;background:#333;padding:.5rem;border-bottom:0;border-radius:0}.drag-header h1{font-size:1.2rem;margin:0;-webkit-user-select:none;user-select:none;text-align:center;flex-grow:1}.drag-header .minimize-btn{background:none;background-color:#ffffff40;color:#fff;border:none;font-size:1.2rem;cursor:pointer;padding:.2rem .5rem;-webkit-user-select:none;user-select:none}.drag-header .minimize-btn:hover{transform:scale(1.1)}.tabs{display:flex;border-bottom:1px solid #aa8453}.tabs button{flex:1;padding:.5rem;background:#aa9a85;border:none;cursor:pointer;color:#e4d9cb;font-weight:100;font-size:.8rem}.tabs button.active{background:#aa8453;border-bottom:2px solid #6d5639}.tabs button:hover{background:#6d5639}.reset-export-container{display:flex;flex-direction:row;gap:.5rem;padding:.5rem}.reset-button{width:100%;background-color:#aa8453;color:#fff;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.reset-button:hover{background-color:#6d5639}.export-button{width:100%;background-color:#fff;color:#aa8453;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.export-button:hover{background-color:#6d5639;color:#fff}.groups-wrapper{display:flex;flex-direction:column;gap:.5rem;padding:0 .5rem}.group-box{background:#4e4c4cf0;border-radius:0;padding:.2rem .5rem}.group-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.group-header h2{font-size:14px;margin:0;font-weight:100}.group-header .arrow{font-size:1.2rem;transition:transform .3s ease}.group-header .arrow.expanded{transform:rotate(180deg)}.group-content{margin-top:.5rem}.color-picker-item{display:flex;align-items:center;gap:.5rem;margin-bottom:5px}.color-picker-item label{flex:1;font-size:.75rem;color:#fff;white-space:nowrap}.color-picker-item input[type=color]{width:45px;height:28px;padding:0;border:1px solid #ccc;border-radius:4px;flex-shrink:0}.color-picker-item input[type=text],.color-picker-item select{width:140px;height:28px;padding:0 .4rem;font-size:.85rem;border:1px solid #ccc;border-radius:4px}.color-picker-item .tooltip-container{position:relative;display:inline-block;display:none}.color-picker-item .tooltip-container .copy-btn{flex-shrink:0;font-size:1rem;background:none;border:none;cursor:pointer;padding:.3rem}.color-picker-item .tooltip-container .copy-btn:hover{transform:scale(1.1)}.color-picker-item .tooltip-container .copy-btn:hover+.tooltip-text{opacity:1;visibility:visible}.color-picker-item .tooltip-container .tooltip-text{position:absolute;bottom:120%;left:50%;transform:translate(-50%);background-color:#333;color:#fff;padding:.3rem .5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;opacity:0;visibility:hidden;transition:opacity .2s ease;z-index:1000}.color-picker-item .copied-msg{font-size:.75rem;color:green;margin-left:auto;animation:fadeOut 1s ease forwards}@keyframes fadeOut{0%{opacity:1}80%{opacity:1}to{opacity:0}}\n"] }]
224
+ args: [{ selector: 'lib-babylon-color-picker', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule], encapsulation: ViewEncapsulation.ShadowDom, template: "<form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\">\n <div class=\"login-panel\">\n <h2>Panel de estilos</h2>\n <input\n type=\"text\"\n placeholder=\"Usuario\"\n formControlName=\"email\"\n (keydown.enter)=\"login()\"\n />\n <input\n type=\"password\"\n placeholder=\"Contrase\u00F1a\"\n formControlName=\"password\"\n (keydown.enter)=\"login()\"\n />\n <button type=\"submit\">Entrar</button>\n </div>\n</form>\n\n<!-- ESTILO PANEL -->\n@if (loginHecho) {\n <div\n #panel\n class=\"color-picker-panel\"\n [class.minimizado]=\"minimizado\"\n (mousedown)=\"onDragStart($event)\"\n >\n <div class=\"drag-header\">\n <h1>Panel de estilos</h1>\n <button\n class=\"minimize-btn\"\n (click)=\"toggleMinimizado()\"\n title=\"Minimizar/Restaurar panel\"\n >\n {{ minimizado ? '\uFF0B' : '\uFF0D' }}\n </button>\n </div>\n\n @if (!minimizado) {\n <div class=\"tabs\">\n @for (tab of tabs; track tab) {\n <button\n [class.active]=\"activeTab === tab\"\n (click)=\"setActiveTab(tab)\"\n >\n {{ tab }}\n </button>\n }\n </div>\n\n <div class=\"reset-export-container\">\n <button class=\"reset-button\" (click)=\"resetColors()\">\n Resetear estilos\n </button>\n <button class=\"export-button\" (click)=\"exportCSS()\">\n Exportar CSS\n </button>\n </div>\n\n <div class=\"groups-wrapper\">\n @for (group of groupedVariables | keyvalue; track group.key) {\n @if (getTabForGroup(group.key) === activeTab) {\n <div class=\"group-box\">\n <div\n class=\"group-header\"\n (click)=\"toggleGroup(group.key)\"\n >\n <h2>{{ group.key }}</h2>\n <span\n class=\"arrow\"\n [class.expanded]=\"isGroupExpanded(group.key)\"\n >\u2335</span\n >\n </div>\n\n @if (isGroupExpanded(group.key)) {\n <div class=\"group-content\">\n @for (variable of group.value; track variable.name) {\n <div class=\"color-picker-item\">\n <label>{{ variable.name.replace('--', '') }}</label>\n\n @if (isColor(variable.value)) {\n <input\n type=\"color\"\n [value]=\"getHexForColorInput(variable.name)\"\n (input)=\"changeColor($event, variable.name)\"\n />\n } @else {\n @if (\n ['T\u00EDtulos', 'Pret\u00EDtulos', 'Subt\u00EDtulos', 'Textos', 'Fuentes'].includes(group.key)\n ) {\n <select\n [value]=\"fontValues[variable.name]\"\n (change)=\"updateFontVariable($event, variable.name)\"\n >\n <optgroup label=\"Fuentes del proyecto\">\n @for (font of colorService.projectFonts; track font) {\n @if (!['font-title', 'font-pretitle', 'font-text', 'font-claim'].includes(font)) {\n <option [value]=\"font\">{{ font }}</option>\n }\n }\n </optgroup>\n\n <optgroup label=\"Google Fonts\">\n @for (font of colorService.googleFonts; track font) {\n <option [value]=\"font\">{{ font }}</option>\n }\n </optgroup>\n </select>\n } @else {\n <input\n type=\"text\"\n [value]=\"variable.value\"\n (input)=\"changeColor($event, variable.name)\"\n />\n }\n }\n\n <div class=\"tooltip-container\">\n <button\n class=\"copy-btn\"\n (click)=\"copyToClipboard(variable.value, variable.name)\"\n >\n \uD83D\uDCCB\n </button>\n <span class=\"tooltip-text\">Copiar</span>\n </div>\n\n @if (wasCopied(variable.name)) {\n <span class=\"copied-msg\">Copiado \u2714\uFE0F</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n}\n", styles: [".login-panel{all:initial;position:fixed;top:50px;left:50px;width:350px;background:#333;box-shadow:0 8px 20px #0000001a;padding:1rem;z-index:100000;display:flex;flex-direction:column;gap:.5rem;font-family:var(--font-text)}.login-panel *{all:revert;font-family:var(--font-text)}.login-panel h2{margin-top:0;font-size:1.2rem;text-align:center;color:#fff;margin-bottom:.2rem}.login-panel input{padding:.5rem;font-size:1rem;border:1px solid #ccc;border-radius:0;font-size:12px;outline-color:#aa8453}.login-panel button{background-color:#aa8453;color:#fff;border:none;border-radius:0;padding:.6rem;cursor:pointer;font-weight:700}.login-panel button:hover{background-color:#6d5639}.color-picker-panel{all:initial;position:fixed;top:50px;left:50px;width:450px;height:400px;max-width:95%;max-height:80vh;overflow-y:auto;overflow-x:hidden;background:#333;border-radius:0;box-shadow:0 8px 20px #0000001a;z-index:100000;-webkit-user-select:none;user-select:none;cursor:grab;scrollbar-gutter:stable;font-family:sans-serif;padding-bottom:20px;color:#fff;font-weight:100;font-family:var(--font-text)}.color-picker-panel *{all:revert;font-family:var(--font-text);font-weight:100}.color-picker-panel:active{cursor:grabbing}.color-picker-panel.minimizado{height:auto;width:450px;overflow:hidden;padding-bottom:.5rem}.drag-header{display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;background:#333;padding:.5rem;border-bottom:0;border-radius:0}.drag-header h1{font-size:1.2rem;margin:0;-webkit-user-select:none;user-select:none;text-align:center;flex-grow:1}.drag-header .minimize-btn{background:none;background-color:#ffffff40;color:#fff;border:none;font-size:1.2rem;cursor:pointer;padding:.2rem .5rem;-webkit-user-select:none;user-select:none}.drag-header .minimize-btn:hover{transform:scale(1.1)}.tabs{display:flex;border-bottom:1px solid #aa8453}.tabs button{flex:1;padding:.5rem;background:#aa9a85;border:none;cursor:pointer;color:#e4d9cb;font-weight:100;font-size:.8rem}.tabs button.active{background:#aa8453;border-bottom:2px solid #6d5639}.tabs button:hover{background:#6d5639}.reset-export-container{display:flex;flex-direction:row;gap:.5rem;padding:.5rem}.reset-button{width:100%;background-color:#aa8453;color:#fff;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.reset-button:hover{background-color:#6d5639}.export-button{width:100%;background-color:#fff;color:#aa8453;padding:.5rem;border:none;border-radius:0;cursor:pointer;margin:.5rem 0;font-size:.95rem;transition:all .5s ease}.export-button:hover{background-color:#6d5639;color:#fff}.groups-wrapper{display:flex;flex-direction:column;gap:.5rem;padding:0 .5rem}.group-box{background:#4e4c4cf0;border-radius:0;padding:.2rem .5rem}.group-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.group-header h2{font-size:14px;margin:0;font-weight:100}.group-header .arrow{font-size:1.2rem;transition:transform .3s ease}.group-header .arrow.expanded{transform:rotate(180deg)}.group-content{margin-top:.5rem}.color-picker-item{display:flex;align-items:center;gap:.5rem;margin-bottom:5px}.color-picker-item label{flex:1;font-size:.75rem;color:#fff;white-space:nowrap}.color-picker-item input[type=color]{width:45px;height:28px;padding:0;border:1px solid #ccc;border-radius:4px;flex-shrink:0}.color-picker-item input[type=text],.color-picker-item select{width:140px;height:28px;padding:0 .4rem;font-size:.85rem;border:1px solid #ccc;border-radius:4px}.color-picker-item .tooltip-container{position:relative;display:inline-block;display:none}.color-picker-item .tooltip-container .copy-btn{flex-shrink:0;font-size:1rem;background:none;border:none;cursor:pointer;padding:.3rem}.color-picker-item .tooltip-container .copy-btn:hover{transform:scale(1.1)}.color-picker-item .tooltip-container .copy-btn:hover+.tooltip-text{opacity:1;visibility:visible}.color-picker-item .tooltip-container .tooltip-text{position:absolute;bottom:120%;left:50%;transform:translate(-50%);background-color:#333;color:#fff;padding:.3rem .5rem;border-radius:4px;font-size:.75rem;white-space:nowrap;opacity:0;visibility:hidden;transition:opacity .2s ease;z-index:1000}.color-picker-item .copied-msg{font-size:.75rem;color:green;margin-left:auto;animation:fadeOut 1s ease forwards}@keyframes fadeOut{0%{opacity:1}80%{opacity:1}to{opacity:0}}\n"] }]
226
225
  }], ctorParameters: () => [{ type: i1.ColorPickerService }, { type: i0.Renderer2 }, { type: Object, decorators: [{
227
226
  type: Inject,
228
227
  args: [PLATFORM_ID]
229
- }] }], propDecorators: { userPanel: [{
228
+ }] }, { type: i2.FormBuilder }], propDecorators: { userPanel: [{
230
229
  type: Input
231
230
  }], passPanel: [{
232
231
  type: Input
@@ -234,4 +233,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
234
233
  type: ViewChild,
235
234
  args: ['panel', { static: false }]
236
235
  }] } });
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1jb2xvci1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFieWxvbi9zcmMvbGliL2NvbXBvbmVudHMvY29yZS9iYWJ5bG9uLWNvbG9yLXBpY2tlci9iYWJ5bG9uLWNvbG9yLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2JhYnlsb24tY29sb3ItcGlja2VyL2JhYnlsb24tY29sb3ItcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsU0FBUyxFQUVULE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUVYLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQVc3QyxNQUFNLE9BQU8sMkJBQTJCO0lBd0JwQyxZQUNXLFlBQWdDLEVBQy9CLFFBQW1CLEVBQ1csVUFBa0I7UUFGakQsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBQy9CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDVyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBMUJuRCxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUd4QixzQkFBaUIsR0FBRyx5Q0FBeUMsQ0FBQztRQUM5RCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFF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QixLQUFLO2dCQUNpQyxRQUFRO3NCQUE5QyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBQTEFURk9STV9JRCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29sb3ItcGFuZWwuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWJhYnlsb24tY29sb3ItcGlja2VyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFieWxvbi1jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2JhYnlsb24tY29sb3ItcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxufSlcbmV4cG9ydCBjbGFzcyBCYWJ5bG9uQ29sb3JQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHVzZXJQYW5lbCA9ICcnO1xuICAgIEBJbnB1dCgpIHBhc3NQYW5lbCA9ICcnO1xuICAgIEBWaWV3Q2hpbGQoJ3BhbmVsJywgeyBzdGF0aWM6IGZhbHNlIH0pIHBhbmVsUmVmITogRWxlbWVudFJlZjtcblxuICAgIGdvb2dsZUZvbnRzQXBpS2V5ID0gJ0FJemFTeUFWYnp6T21BSmZzQXNpOTUxZTYzNnltLUFCV3kyQk9NQSc7XG4gICAgZW1haWxJbnB1dCA9ICcnO1xuICAgIHBhc3NJbnB1dCA9ICcnO1xuICAgIG1vc3RyYXJQYW5lbCA9IGZhbHNlO1xuICAgIGxvZ2luSGVjaG8gPSBmYWxzZTtcbiAgICBtaW5pbWl6YWRvID0gZmFsc2U7XG5cbiAgICB0YWJzID0gWydDb2xvcmVzJywgJ1RleHRvcycsICdCb3RvbmVzJywgJ0NvbXVuZXMnLCAnT3Ryb3MnXTtcbiAgICBhY3RpdmVUYWIgPSAnQ29sb3Jlcyc7XG5cbiAgICBncm91cGVkVmFyaWFibGVzID0gbmV3IE1hcDxzdHJpbmcsIHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXT4oKTtcbiAgICBjb3BpZWRTdGF0dXMgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBleHBhbmRlZEdyb3VwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvbnRWYWx1ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBkcmFnU3RhcnRYID0gMDtcbiAgICBkcmFnU3RhcnRZID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY29sb3JTZXJ2aWNlOiBDb2xvclBpY2tlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSByZWFkb25seSBwbGF0Zm9ybUlkOiBPYmplY3RcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgICAgICB0aGlzLm1vc3RyYXJQYW5lbCA9IHBhcmFtcy5oYXMoJ2FjdGl2YXJfcGFuZWwnKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFiID0gdGhpcy5jb2xvclNlcnZpY2UuZ2V0U3RvcmVkVGFiKHRoaXMudGFicyk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IHN0b3JlZFRhYjtcblxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkU2Vzc2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3BhbmVsLWxvZ2luLW9rJyk7XG4gICAgICAgICAgICBpZiAoc3RvcmVkU2Vzc2lvbiA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkhlY2hvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNvbG9yU2VydmljZS5nZXRBbGxDU1NWYXJpYWJsZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXMgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5ncm91cEJ5Q2F0ZWdvcnkodmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5mZXRjaEdvb2dsZUZvbnRzKHRoaXMuZ29vZ2xlRm9udHNBcGlLZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbEZvbnRWYWx1ZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdtb3VzZW1vdmUnLCAoZSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ01vdmUoZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ21vdXNldXAnLCAoKSA9PiB0aGlzLm9uRHJhZ0VuZCgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGxvZ2luKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmVtYWlsSW5wdXQgPT09IHRoaXMudXNlclBhbmVsICYmXG4gICAgICAgICAgICB0aGlzLnBhc3NJbnB1dCA9PT0gdGhpcy5wYXNzUGFuZWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luSGVjaG8gPSB0cnVlO1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgncGFuZWwtbG9naW4tb2snLCAndHJ1ZScpO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jb2xvclNlcnZpY2UuZ2V0QWxsQ1NTVmFyaWFibGVzKCk7XG4gICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXMgPVxuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmdyb3VwQnlDYXRlZ29yeSh2YXJpYWJsZXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb2xvclNlcnZpY2UuZmV0Y2hHb29nbGVGb250cyh0aGlzLmdvb2dsZUZvbnRzQXBpS2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbEZvbnRWYWx1ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsZXJ0KCdVc3VhcmlvIG8gY29udHJhc2XDsWEgaW5jb3JyZWN0b3MnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEluaXRpYWxGb250VmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtncm91cCwgdmFyaWFibGVzXSBvZiB0aGlzLmdyb3VwZWRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGlmIChncm91cCA9PT0gJ1RpcG9ncmFmw61hcycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKHZhcmlhYmxlLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250TmFtZSA9IHRoaXMuZ2V0Rm9udE5hbWVPbmx5KGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9udFZhbHVlc1t2YXJpYWJsZS5uYW1lXSA9IGZvbnROYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNJbnRlcmFjdGl2ZSA9IFtcbiAgICAgICAgICAgICdJTlBVVCcsXG4gICAgICAgICAgICAnQlVUVE9OJyxcbiAgICAgICAgICAgICdMQUJFTCcsXG4gICAgICAgICAgICAnU1BBTicsXG4gICAgICAgICAgICAnU0VMRUNUJyxcbiAgICAgICAgXS5pbmNsdWRlcyh0YXJnZXQudGFnTmFtZSk7XG4gICAgICAgIGlmIChpc0ludGVyYWN0aXZlIHx8ICF0aGlzLnBhbmVsUmVmKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRYID1cbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnBhbmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdDtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMucGFuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgb25EcmFnTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZyB8fCAhdGhpcy5wYW5lbFJlZikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5kcmFnU3RhcnRYO1xuICAgICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuZHJhZ1N0YXJ0WTtcblxuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucGFuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgcGFuZWwuc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgICAgICBwYW5lbC5zdHlsZS50b3AgPSBgJHt5fXB4YDtcbiAgICB9XG5cbiAgICBvbkRyYWdFbmQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRvZ2dsZUdyb3VwKGdyb3VwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWRHcm91cHMuaGFzKGdyb3VwKSkge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5kZWxldGUoZ3JvdXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5hZGQoZ3JvdXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNHcm91cEV4cGFuZGVkKGdyb3VwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRHcm91cHMuaGFzKGdyb3VwKTtcbiAgICB9XG5cbiAgICBpc0NvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JTZXJ2aWNlLmlzQ29sb3IodmFsdWUpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbG9yKGV2ZW50OiBFdmVudCwgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0Py52YWx1ZTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGlzRm9udFZhcmlhYmxlID1cbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZS5zdGFydHNXaXRoKCctLWZvbnQtJykgJiZcbiAgICAgICAgICAgICF2YXJpYWJsZU5hbWUuaW5jbHVkZXMoJy0tZm9udC1zaXplJyk7XG5cbiAgICAgICAgaWYgKGlzRm9udFZhcmlhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZvbnRWYWx1ZXNbdmFyaWFibGVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgbmV3Rm9udFZhbHVlID0gYCcke3ZhbHVlfScsIEhlbHZldGljYSwgc2Fucy1zZXJpZmA7XG4gICAgICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5jaGFuZ2VDb2xvcihcbiAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbmV3Rm9udFZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBlZFZhcmlhYmxlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmNoYW5nZUNvbG9yKFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldENvbG9ycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2xvclNlcnZpY2UucmVzZXRDb2xvcnModGhpcy5ncm91cGVkVmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBjb3B5VG9DbGlwYm9hcmQodmFsdWU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZCh2YWx1ZSwgbmFtZSwgdGhpcy5jb3BpZWRTdGF0dXMpO1xuICAgIH1cblxuICAgIHdhc0NvcGllZCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3BpZWRTdGF0dXMuZ2V0KHZhcmlhYmxlTmFtZSkgPT09IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0VGFiRm9yR3JvdXAoZ3JvdXA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yU2VydmljZS5nZXRUYWJGb3JHcm91cChncm91cCk7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlVGFiKHRhYjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFuZWwtZXN0aWxvcy10YWInLCB0YWIpO1xuICAgIH1cblxuICAgIHRvZ2dsZU1pbmltaXphZG8oKSB7XG4gICAgICAgIHRoaXMubWluaW1pemFkbyA9ICF0aGlzLm1pbmltaXphZG87XG4gICAgfVxuXG4gICAgZXhwb3J0Q1NTKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5leHBvcnRDdXN0b21WYXJpYWJsZXModGhpcy5ncm91cGVkVmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBnZXRGb250TmFtZU9ubHkoZnVsbFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGZ1bGxWYWx1ZS5tYXRjaCgvXlsnXCJdPyhbXidcIixdKylbJ1wiXT8vKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBmdWxsVmFsdWU7XG4gICAgfVxuXG4gICAgdXBkYXRlRm9udFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCBmb250TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYCcke2ZvbnROYW1lfScsIEhlbHZldGljYSwgc2Fucy1zZXJpZmA7XG4gICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmNoYW5nZUNvbG9yKFxuICAgICAgICAgICAgdmFyaWFibGVOYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXNcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpc1ByZWRlZmluZWQgPSBbXG4gICAgICAgICAgICAnZm9udC10aXRsZScsXG4gICAgICAgICAgICAnZm9udC1wcmV0aXRsZScsXG4gICAgICAgICAgICAnZm9udC10ZXh0JyxcbiAgICAgICAgICAgICdmb250LWNsYWltJyxcbiAgICAgICAgXS5pbmNsdWRlcyhmb250TmFtZSk7XG4gICAgICAgIGlmIChpc1ByZWRlZmluZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRGb250ID0gZm9udE5hbWUucmVwbGFjZSgvIC9nLCAnKycpO1xuICAgICAgICBjb25zdCBpZCA9IGBmb250LSR7Zm9ybWF0dGVkRm9udH1gO1xuXG4gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgbGluay5pZCA9IGlkO1xuICAgICAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgICAgICBsaW5rLmhyZWYgPSBgaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT0ke2Zvcm1hdHRlZEZvbnR9JmRpc3BsYXk9c3dhcGA7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q29tcHV0ZWRDb2xvcih2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUodmFyaWFibGVOYW1lKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgY29uc3QgY2xlYW4gPSByYXcucmVwbGFjZSgvW1wiJ10vZywgJycpO1xuXG4gICAgICAgIC8vIEV4cGFuZGUgI2ZmZiBhICNmZmZmZmZcbiAgICAgICAgaWYgKC9eIyhbMC05YS1mQS1GXXszfSkkLy50ZXN0KGNsZWFuKSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAnIycgK1xuICAgICAgICAgICAgICAgIGNsZWFuXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb2xvclNlcnZpY2UuaXNDb2xvcihjbGVhbikgPyBjbGVhbiA6ICcjMDAwMDAwJztcbiAgICB9XG5cbiAgICBnZXRIZXhGb3JDb2xvcklucHV0KHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKHZhcmlhYmxlTmFtZSlcbiAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgLy8gQ3JlYW1vcyB1biBlbGVtZW50byB0ZW1wb3JhbCBwYXJhIHJlc29sdmVyIGVsIGNvbG9yIHJlYWxcbiAgICAgICAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZW1wLnN0eWxlLmNvbG9yID0gY29sb3I7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh0ZW1wKS5jb2xvcjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wKTtcblxuICAgICAgICAvLyBFeHRyYWUgUkdCIHkgY29udmllcnRlIGEgI1JSR0dCQlxuICAgICAgICBjb25zdCBtYXRjaCA9IHJlc29sdmVkLm1hdGNoKC9cXGQrL2cpO1xuICAgICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoLmxlbmd0aCA8IDMpIHJldHVybiAnIzAwMDAwMCc7XG5cbiAgICAgICAgY29uc3QgW3IsIGcsIGJdID0gbWF0Y2g7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnIycgK1xuICAgICAgICAgICAgcGFyc2VJbnQocikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykgK1xuICAgICAgICAgICAgcGFyc2VJbnQoZykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykgK1xuICAgICAgICAgICAgcGFyc2VJbnQoYikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8IS0tIE1vc3RyYXIgZWwgcGFuZWwgc29sbyBzaSBtb3N0cmFyUGFuZWwgZXMgdHJ1ZSAtLT5cbkBpZiAobW9zdHJhclBhbmVsKSB7XG4gICAgPCEtLSBMT0dJTiBQQU5FTCAtLT5cbiAgICBAaWYgKCFsb2dpbkhlY2hvKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dpbi1wYW5lbFwiPlxuICAgICAgICAgICAgPGgyPlBhbmVsIGRlIGVzdGlsb3M8L2gyPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVXN1YXJpb1wiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbWFpbElucHV0XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJsb2dpbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29udHJhc2XDsWFcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGFzc0lucHV0XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJsb2dpbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2dpbigpXCI+RW50cmFyPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgICA8IS0tIEVTVElMTyBQQU5FTCAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgI3BhbmVsXG4gICAgICAgICAgICBjbGFzcz1cImNvbG9yLXBpY2tlci1wYW5lbFwiXG4gICAgICAgICAgICBbY2xhc3MubWluaW1pemFkb109XCJtaW5pbWl6YWRvXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25EcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxoMT5QYW5lbCBkZSBlc3RpbG9zPC9oMT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWluaW1pemUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1pbmltaXphZG8oKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiTWluaW1pemFyL1Jlc3RhdXJhciBwYW5lbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBtaW5pbWl6YWRvID8gJ++8iycgOiAn77yNJyB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIEBpZiAoIW1pbmltaXphZG8pIHtcbiAgICAgICAgICAgICAgICA8IS0tIFRBQlMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIHRhYnM7IHRyYWNrIHRhYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSB0YWJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRBY3RpdmVUYWIodGFiKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGFiIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBSRVNFVCAmIEVYUE9SVCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzZXQtZXhwb3J0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVzZXQtYnV0dG9uXCIgKGNsaWNrKT1cInJlc2V0Q29sb3JzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc2V0ZWFyIGVzdGlsb3NcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnQtYnV0dG9uXCIgKGNsaWNrKT1cImV4cG9ydENTUygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRhciBDU1NcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdSVVBPUyBERSBWQVJJQUJMRVMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3Vwcy13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgb2YgZ3JvdXBlZFZhcmlhYmxlcyB8IGtleXZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgZ3JvdXAua2V5XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChnZXRUYWJGb3JHcm91cChncm91cC5rZXkpID09PSBhY3RpdmVUYWIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JvdXAtaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVHcm91cChncm91cC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7IGdyb3VwLmtleSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcm91cEV4cGFuZGVkKGdyb3VwLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID7ijLU8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpc0dyb3VwRXhwYW5kZWQoZ3JvdXAua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb2YgZ3JvdXAudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHZhcmlhYmxlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLXBpY2tlci1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGlzQ29sb3IodmFyaWFibGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEhleEZvckNvbG9ySW5wdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VDb2xvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5rZXkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaXBvZ3JhZsOtYXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvbnROYW1lT25seShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRm9udFZhcmlhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkZ1ZW50ZXMgZGVsIHByb3llY3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBvZiBjb2xvclNlcnZpY2UucHJvamVjdEZvbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayBmb250XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LXRpdGxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1wcmV0aXRsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbnQtY2xhaW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiR29vZ2xlIEZvbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBvZiBjb2xvclNlcnZpY2UuZ29vZ2xlRm9udHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZvbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUNvbG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvcHktYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVRvQ2xpcGJvYXJkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfk4tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvb2x0aXAtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5Db3BpYXI8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh3YXNDb3BpZWQodmFyaWFibGUubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvcGllZC1tc2dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Q29waWFkbyDinJTvuI88L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxufVxuIl19
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1jb2xvci1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFieWxvbi9zcmMvbGliL2NvbXBvbmVudHMvY29yZS9iYWJ5bG9uLWNvbG9yLXBpY2tlci9iYWJ5bG9uLWNvbG9yLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2JhYnlsb24tY29sb3ItcGlja2VyL2JhYnlsb24tY29sb3ItcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsU0FBUyxFQUVULE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUVYLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBMEIsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFXMUYsTUFBTSxPQUFPLDJCQUEyQjtJQXdCcEMsWUFDVyxZQUFnQyxFQUMvQixRQUFtQixFQUNXLFVBQWtCLEVBQ2hELEVBQWU7UUFIaEIsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBQy9CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDVyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2hELE9BQUUsR0FBRixFQUFFLENBQWE7UUEzQmxCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBR3hCLHNCQUFpQixHQUFHLHlDQUF5QyxDQUFDO1FBQzlELGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUlu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QzsrR0F6UVEsMkJBQTJCLDZFQTJCeEIsV0FBVzttR0EzQmQsMkJBQTJCLG1QQ3ZCeEMsazZKQThJQSxpMklENUhjLFlBQVkseUZBQUUsV0FBVyx3MkJBQUUsbUJBQW1COzs0RkFLL0MsMkJBQTJCO2tCQVJ2QyxTQUFTOytCQUNJLDBCQUEwQixjQUN4QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLGlCQUcxQyxpQkFBaUIsQ0FBQyxTQUFTOzswQkE2QnJDLE1BQU07MkJBQUMsV0FBVzttRUExQmQsU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNpQyxRQUFRO3NCQUE5QyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBQTEFURk9STV9JRCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29sb3ItcGFuZWwuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWJhYnlsb24tY29sb3ItcGlja2VyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFieWxvbi1jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2JhYnlsb24tY29sb3ItcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxufSlcbmV4cG9ydCBjbGFzcyBCYWJ5bG9uQ29sb3JQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHVzZXJQYW5lbCA9ICcnO1xuICAgIEBJbnB1dCgpIHBhc3NQYW5lbCA9ICcnO1xuICAgIEBWaWV3Q2hpbGQoJ3BhbmVsJywgeyBzdGF0aWM6IGZhbHNlIH0pIHBhbmVsUmVmITogRWxlbWVudFJlZjtcblxuICAgIGdvb2dsZUZvbnRzQXBpS2V5ID0gJ0FJemFTeUFWYnp6T21BSmZzQXNpOTUxZTYzNnltLUFCV3kyQk9NQSc7XG4gICAgbW9zdHJhclBhbmVsID0gZmFsc2U7XG4gICAgbG9naW5IZWNobyA9IGZhbHNlO1xuICAgIG1pbmltaXphZG8gPSBmYWxzZTtcblxuICAgIGxvZ2luRm9ybTogRm9ybUdyb3VwO1xuXG4gICAgdGFicyA9IFsnQ29sb3JlcycsICdUZXh0b3MnLCAnQm90b25lcycsICdDb211bmVzJywgJ090cm9zJ107XG4gICAgYWN0aXZlVGFiID0gJ0NvbG9yZXMnO1xuXG4gICAgZ3JvdXBlZFZhcmlhYmxlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10+KCk7XG4gICAgY29waWVkU3RhdHVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgZXhwYW5kZWRHcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb250VmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgZHJhZ1N0YXJ0WCA9IDA7XG4gICAgZHJhZ1N0YXJ0WSA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNvbG9yU2VydmljZTogQ29sb3JQaWNrZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlclxuICAgICkge1xuICAgICAgICB0aGlzLmxvZ2luRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgZW1haWw6IFsnJ10sXG4gICAgICAgICAgICBwYXNzd29yZDogWycnXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgICAgICB0aGlzLm1vc3RyYXJQYW5lbCA9IHBhcmFtcy5oYXMoJ2FjdGl2YXJfcGFuZWwnKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFiID0gdGhpcy5jb2xvclNlcnZpY2UuZ2V0U3RvcmVkVGFiKHRoaXMudGFicyk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IHN0b3JlZFRhYjtcblxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkU2Vzc2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3BhbmVsLWxvZ2luLW9rJyk7XG4gICAgICAgICAgICBpZiAoc3RvcmVkU2Vzc2lvbiA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkhlY2hvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNvbG9yU2VydmljZS5nZXRBbGxDU1NWYXJpYWJsZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXMgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5ncm91cEJ5Q2F0ZWdvcnkodmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5mZXRjaEdvb2dsZUZvbnRzKHRoaXMuZ29vZ2xlRm9udHNBcGlLZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbEZvbnRWYWx1ZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdtb3VzZW1vdmUnLCAoZSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ01vdmUoZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ21vdXNldXAnLCAoKSA9PiB0aGlzLm9uRHJhZ0VuZCgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGxvZ2luKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGVtYWlsLCBwYXNzd29yZCB9ID0gdGhpcy5sb2dpbkZvcm0udmFsdWU7XG4gICAgICAgIGlmIChlbWFpbCA9PT0gdGhpcy51c2VyUGFuZWwgJiYgcGFzc3dvcmQgPT09IHRoaXMucGFzc1BhbmVsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luSGVjaG8gPSB0cnVlO1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgncGFuZWwtbG9naW4tb2snLCAndHJ1ZScpO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jb2xvclNlcnZpY2UuZ2V0QWxsQ1NTVmFyaWFibGVzKCk7XG4gICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXMgPVxuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmdyb3VwQnlDYXRlZ29yeSh2YXJpYWJsZXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb2xvclNlcnZpY2UuZmV0Y2hHb29nbGVGb250cyh0aGlzLmdvb2dsZUZvbnRzQXBpS2V5KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbEZvbnRWYWx1ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsZXJ0KCdVc3VhcmlvIG8gY29udHJhc2XDsWEgaW5jb3JyZWN0b3MnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEluaXRpYWxGb250VmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtncm91cCwgdmFyaWFibGVzXSBvZiB0aGlzLmdyb3VwZWRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGlmIChncm91cCA9PT0gJ1RpcG9ncmFmw61hcycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKHZhcmlhYmxlLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250TmFtZSA9IHRoaXMuZ2V0Rm9udE5hbWVPbmx5KGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9udFZhbHVlc1t2YXJpYWJsZS5uYW1lXSA9IGZvbnROYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNJbnRlcmFjdGl2ZSA9IFtcbiAgICAgICAgICAgICdJTlBVVCcsXG4gICAgICAgICAgICAnQlVUVE9OJyxcbiAgICAgICAgICAgICdMQUJFTCcsXG4gICAgICAgICAgICAnU1BBTicsXG4gICAgICAgICAgICAnU0VMRUNUJyxcbiAgICAgICAgXS5pbmNsdWRlcyh0YXJnZXQudGFnTmFtZSk7XG4gICAgICAgIGlmIChpc0ludGVyYWN0aXZlIHx8ICF0aGlzLnBhbmVsUmVmKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRYID1cbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnBhbmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdDtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMucGFuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgb25EcmFnTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZyB8fCAhdGhpcy5wYW5lbFJlZikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gdGhpcy5kcmFnU3RhcnRYO1xuICAgICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuZHJhZ1N0YXJ0WTtcblxuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucGFuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgcGFuZWwuc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgICAgICBwYW5lbC5zdHlsZS50b3AgPSBgJHt5fXB4YDtcbiAgICB9XG5cbiAgICBvbkRyYWdFbmQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRvZ2dsZUdyb3VwKGdyb3VwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWRHcm91cHMuaGFzKGdyb3VwKSkge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5kZWxldGUoZ3JvdXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5hZGQoZ3JvdXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNHcm91cEV4cGFuZGVkKGdyb3VwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRHcm91cHMuaGFzKGdyb3VwKTtcbiAgICB9XG5cbiAgICBpc0NvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JTZXJ2aWNlLmlzQ29sb3IodmFsdWUpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbG9yKGV2ZW50OiBFdmVudCwgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0Py52YWx1ZTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGlzRm9udFZhcmlhYmxlID1cbiAgICAgICAgICAgIHZhcmlhYmxlTmFtZS5zdGFydHNXaXRoKCctLWZvbnQtJykgJiZcbiAgICAgICAgICAgICF2YXJpYWJsZU5hbWUuaW5jbHVkZXMoJy0tZm9udC1zaXplJyk7XG5cbiAgICAgICAgaWYgKGlzRm9udFZhcmlhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZvbnRWYWx1ZXNbdmFyaWFibGVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgbmV3Rm9udFZhbHVlID0gYCcke3ZhbHVlfScsIEhlbHZldGljYSwgc2Fucy1zZXJpZmA7XG4gICAgICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5jaGFuZ2VDb2xvcihcbiAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbmV3Rm9udFZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBlZFZhcmlhYmxlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmNoYW5nZUNvbG9yKFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwZWRWYXJpYWJsZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldENvbG9ycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2xvclNlcnZpY2UucmVzZXRDb2xvcnModGhpcy5ncm91cGVkVmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBjb3B5VG9DbGlwYm9hcmQodmFsdWU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29sb3JTZXJ2aWNlLmNvcHlUb0NsaXBib2FyZCh2YWx1ZSwgbmFtZSwgdGhpcy5jb3BpZWRTdGF0dXMpO1xuICAgIH1cblxuICAgIHdhc0NvcGllZCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3BpZWRTdGF0dXMuZ2V0KHZhcmlhYmxlTmFtZSkgPT09IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0VGFiRm9yR3JvdXAoZ3JvdXA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yU2VydmljZS5nZXRUYWJGb3JHcm91cChncm91cCk7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlVGFiKHRhYjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFuZWwtZXN0aWxvcy10YWInLCB0YWIpO1xuICAgIH1cblxuICAgIHRvZ2dsZU1pbmltaXphZG8oKSB7XG4gICAgICAgIHRoaXMubWluaW1pemFkbyA9ICF0aGlzLm1pbmltaXphZG87XG4gICAgfVxuXG4gICAgZXhwb3J0Q1NTKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbG9yU2VydmljZS5leHBvcnRDdXN0b21WYXJpYWJsZXModGhpcy5ncm91cGVkVmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBnZXRGb250TmFtZU9ubHkoZnVsbFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGZ1bGxWYWx1ZS5tYXRjaCgvXlsnXCJdPyhbXidcIixdKylbJ1wiXT8vKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBmdWxsVmFsdWU7XG4gICAgfVxuXG4gICAgdXBkYXRlRm9udFZhcmlhYmxlKGV2ZW50OiBFdmVudCwgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCBmb250TmFtZSA9IHRhcmdldD8udmFsdWU7XG4gICAgICBpZiAoIWZvbnROYW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gYCcke2ZvbnROYW1lfScsIEhlbHZldGljYSwgc2Fucy1zZXJpZmA7XG4gICAgICB0aGlzLmNvbG9yU2VydmljZS5jaGFuZ2VDb2xvcih2YXJpYWJsZU5hbWUsIHZhbHVlLCB0aGlzLmdyb3VwZWRWYXJpYWJsZXMpO1xuXG4gICAgICBjb25zdCBpc1ByZWRlZmluZWQgPSBbJ2ZvbnQtdGl0bGUnLCAnZm9udC1wcmV0aXRsZScsICdmb250LXRleHQnLCAnZm9udC1jbGFpbSddLmluY2x1ZGVzKGZvbnROYW1lKTtcbiAgICAgIGlmIChpc1ByZWRlZmluZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgZm9ybWF0dGVkRm9udCA9IGZvbnROYW1lLnJlcGxhY2UoLyAvZywgJysnKTtcbiAgICAgIGNvbnN0IGlkID0gYGZvbnQtJHtmb3JtYXR0ZWRGb250fWA7XG5cbiAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmsuaWQgPSBpZDtcbiAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmsuaHJlZiA9IGBodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PSR7Zm9ybWF0dGVkRm9udH0mZGlzcGxheT1zd2FwYDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDb21wdXRlZENvbG9yKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmF3ID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSh2YXJpYWJsZU5hbWUpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBjbGVhbiA9IHJhdy5yZXBsYWNlKC9bXCInXS9nLCAnJyk7XG5cbiAgICAgICAgaWYgKC9eIyhbMC05YS1mQS1GXXszfSkkLy50ZXN0KGNsZWFuKSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAnIycgK1xuICAgICAgICAgICAgICAgIGNsZWFuXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb2xvclNlcnZpY2UuaXNDb2xvcihjbGVhbikgPyBjbGVhbiA6ICcjMDAwMDAwJztcbiAgICB9XG5cbiAgICBnZXRIZXhGb3JDb2xvcklucHV0KHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKHZhcmlhYmxlTmFtZSlcbiAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWwuc3R5bGUuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuY29sb3I7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoID0gcmVzb2x2ZWQubWF0Y2goL1xcZCsvZyk7XG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2gubGVuZ3RoIDwgMykgcmV0dXJuICcjMDAwMDAwJztcblxuICAgICAgICBjb25zdCBbciwgZywgYl0gPSBtYXRjaDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcjJyArXG4gICAgICAgICAgICBwYXJzZUludChyKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSArXG4gICAgICAgICAgICBwYXJzZUludChnKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSArXG4gICAgICAgICAgICBwYXJzZUludChiKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwibG9naW5Gb3JtXCIgKG5nU3VibWl0KT1cImxvZ2luKClcIj5cbiAgPGRpdiBjbGFzcz1cImxvZ2luLXBhbmVsXCI+XG4gICAgPGgyPlBhbmVsIGRlIGVzdGlsb3M8L2gyPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJVc3VhcmlvXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImxvZ2luKClcIlxuICAgIC8+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJDb250cmFzZcOxYVwiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJsb2dpbigpXCJcbiAgICAvPlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiPkVudHJhcjwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cblxuPCEtLSBFU1RJTE8gUEFORUwgLS0+XG5AaWYgKGxvZ2luSGVjaG8pIHtcbiAgPGRpdlxuICAgICNwYW5lbFxuICAgIGNsYXNzPVwiY29sb3ItcGlja2VyLXBhbmVsXCJcbiAgICBbY2xhc3MubWluaW1pemFkb109XCJtaW5pbWl6YWRvXCJcbiAgICAobW91c2Vkb3duKT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImRyYWctaGVhZGVyXCI+XG4gICAgICA8aDE+UGFuZWwgZGUgZXN0aWxvczwvaDE+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwibWluaW1pemUtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1pbmltaXphZG8oKVwiXG4gICAgICAgIHRpdGxlPVwiTWluaW1pemFyL1Jlc3RhdXJhciBwYW5lbFwiXG4gICAgICA+XG4gICAgICAgIHt7IG1pbmltaXphZG8gPyAn77yLJyA6ICfvvI0nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIW1pbmltaXphZG8pIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzXCI+XG4gICAgICAgIEBmb3IgKHRhYiBvZiB0YWJzOyB0cmFjayB0YWIpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gdGFiXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRBY3RpdmVUYWIodGFiKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGFiIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicmVzZXQtZXhwb3J0LWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVzZXQtYnV0dG9uXCIgKGNsaWNrKT1cInJlc2V0Q29sb3JzKClcIj5cbiAgICAgICAgICBSZXNldGVhciBlc3RpbG9zXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiIChjbGljayk9XCJleHBvcnRDU1MoKVwiPlxuICAgICAgICAgIEV4cG9ydGFyIENTU1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBzLXdyYXBwZXJcIj5cbiAgICAgICAgQGZvciAoZ3JvdXAgb2YgZ3JvdXBlZFZhcmlhYmxlcyB8IGtleXZhbHVlOyB0cmFjayBncm91cC5rZXkpIHtcbiAgICAgICAgICBAaWYgKGdldFRhYkZvckdyb3VwKGdyb3VwLmtleSkgPT09IGFjdGl2ZVRhYikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJveFwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJncm91cC1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVHcm91cChncm91cC5rZXkpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxoMj57eyBncm91cC5rZXkgfX08L2gyPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFycm93XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJpc0dyb3VwRXhwYW5kZWQoZ3JvdXAua2V5KVwiXG4gICAgICAgICAgICAgICAgICA+4oy1PC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICBAaWYgKGlzR3JvdXBFeHBhbmRlZChncm91cC5rZXkpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHZhcmlhYmxlIG9mIGdyb3VwLnZhbHVlOyB0cmFjayB2YXJpYWJsZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1waWNrZXItaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyB2YXJpYWJsZS5uYW1lLnJlcGxhY2UoJy0tJywgJycpIH19PC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXNDb2xvcih2YXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0SGV4Rm9yQ29sb3JJbnB1dCh2YXJpYWJsZS5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VDb2xvcigkZXZlbnQsIHZhcmlhYmxlLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbJ1TDrXR1bG9zJywgJ1ByZXTDrXR1bG9zJywgJ1N1YnTDrXR1bG9zJywgJ1RleHRvcycsICdGdWVudGVzJ10uaW5jbHVkZXMoZ3JvdXAua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9udFZhbHVlc1t2YXJpYWJsZS5uYW1lXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVGb250VmFyaWFibGUoJGV2ZW50LCB2YXJpYWJsZS5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJGdWVudGVzIGRlbCBwcm95ZWN0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZm9udCBvZiBjb2xvclNlcnZpY2UucHJvamVjdEZvbnRzOyB0cmFjayBmb250KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIVsnZm9udC10aXRsZScsICdmb250LXByZXRpdGxlJywgJ2ZvbnQtdGV4dCcsICdmb250LWNsYWltJ10uaW5jbHVkZXMoZm9udCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJmb250XCI+e3sgZm9udCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIkdvb2dsZSBGb250c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZm9udCBvZiBjb2xvclNlcnZpY2UuZ29vZ2xlRm9udHM7IHRyYWNrIGZvbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlQ29sb3IoJGV2ZW50LCB2YXJpYWJsZS5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29weS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKHZhcmlhYmxlLnZhbHVlLCB2YXJpYWJsZS5uYW1lKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIPCfk4tcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sdGlwLXRleHRcIj5Db3BpYXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHdhc0NvcGllZCh2YXJpYWJsZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3BpZWQtbXNnXCI+Q29waWFkbyDinJTvuI88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxufVxuIl19