@adins/ucsearch 2.2.14 → 2.2.16

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.
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { Component, Input, ViewChild, ElementRef, Inject, Renderer2, EventEmitter, Output } from '@angular/core';
6
6
  import { HttpClient } from '@angular/common/http';
7
+ import { NgForm } from '@angular/forms';
7
8
  import { formatDate } from '@angular/common';
8
9
  import { InputSearchObj } from './model/InputSearchObj.Model';
9
10
  import { CriteriaObj } from './model/CriteriaObj.model';
@@ -14,6 +15,8 @@ import { ExcelService } from './services/excel-service/excel-service';
14
15
  import { trigger, transition, style, animate, state } from '@angular/animations';
15
16
  import { ToastrService } from 'ngx-toastr';
16
17
  import { ExportTypeConstant } from './model/KeyValueReport.model';
18
+ import { CookieService } from 'ngx-cookie';
19
+ import * as CryptoJS from 'crypto-js';
17
20
  export class UCSearchComponent {
18
21
  /**
19
22
  * @param {?} http
@@ -21,13 +24,15 @@ export class UCSearchComponent {
21
24
  * @param {?} _renderer2
22
25
  * @param {?} _document
23
26
  * @param {?} toastr
27
+ * @param {?} cookieService
24
28
  */
25
- constructor(http, excelService, _renderer2, _document, toastr) {
29
+ constructor(http, excelService, _renderer2, _document, toastr, cookieService) {
26
30
  this.http = http;
27
31
  this.excelService = excelService;
28
32
  this._renderer2 = _renderer2;
29
33
  this._document = _document;
30
34
  this.toastr = toastr;
35
+ this.cookieService = cookieService;
31
36
  this.searchInput = new InputSearchObj();
32
37
  this.pageSize = 10;
33
38
  this.isReport = false;
@@ -64,6 +69,18 @@ export class UCSearchComponent {
64
69
  this.formattedAmount = '';
65
70
  this.amount = 0;
66
71
  }
72
+ // trus nad, bisa ga kalo misalkan gw mau bikin
73
+ // kalo login di cabang IsSelectOne: true
74
+ // kalo login di HO, IsSelectOne: false
75
+ /**
76
+ * @param {?} content
77
+ * @return {?}
78
+ */
79
+ set content(content) {
80
+ if (content) { // initially setter gets called with undefined
81
+ this.searchForm = content;
82
+ }
83
+ }
67
84
  /**
68
85
  * @return {?}
69
86
  */
@@ -88,6 +105,9 @@ export class UCSearchComponent {
88
105
  });
89
106
  `;
90
107
  this._renderer2.appendChild(this._document.body, js);
108
+ /** @type {?} */
109
+ let value = this.cookieService.get('BusinessDateRaw');
110
+ this.BisDt = this.DecryptString(value, "AdInsFOU12345678");
91
111
  this.initiateForm();
92
112
  }
93
113
  /**
@@ -161,12 +181,10 @@ export class UCSearchComponent {
161
181
  //pengecekan tanggal
162
182
  if (data.component[i].type == "datepicker") {
163
183
  if (data.component[i].value.includes("BD")) {
164
- /** @type {?} */
165
- let llsBD = localStorage.getItem("BusinessDateRaw");
166
184
  /** @type {?} */
167
185
  let businessDate = new Date();
168
- if (llsBD != null) {
169
- businessDate = new Date(llsBD);
186
+ if (this.BisDt != null) {
187
+ businessDate = new Date(this.BisDt);
170
188
  }
171
189
  /** @type {?} */
172
190
  var operator = data.component[i].value.charAt(2);
@@ -228,11 +246,10 @@ export class UCSearchComponent {
228
246
  this.search(this.apiUrl, this.pageNow, this.pageSize, order, this.arrCrit);
229
247
  }
230
248
  /**
231
- * @param {?} ev
232
249
  * @return {?}
233
250
  */
234
- reset(ev) {
235
- ev.resetForm();
251
+ reset() {
252
+ this.searchForm.resetForm();
236
253
  this.ExportType = this.ExportTypeList[0].key;
237
254
  this.initiateForm();
238
255
  }
@@ -682,11 +699,31 @@ export class UCSearchComponent {
682
699
  }
683
700
  return condition;
684
701
  }
702
+ /**
703
+ * @private
704
+ * @param {?} chipperText
705
+ * @param {?} chipperKey
706
+ * @return {?}
707
+ */
708
+ DecryptString(chipperText, chipperKey) {
709
+ if (chipperKey == undefined || chipperKey.trim() == '' ||
710
+ chipperText == undefined || chipperText.trim() == '')
711
+ return chipperText;
712
+ /** @type {?} */
713
+ var chipperKeyArr = CryptoJS.enc.Utf8.parse(chipperKey);
714
+ /** @type {?} */
715
+ var iv = CryptoJS.lib.WordArray.create([0x00, 0x00, 0x00, 0x00]);
716
+ /** @type {?} */
717
+ var decrypted = CryptoJS.AES.decrypt(chipperText, chipperKeyArr, { iv: iv });
718
+ /** @type {?} */
719
+ var plainText = decrypted.toString(CryptoJS.enc.Utf8);
720
+ return plainText;
721
+ }
685
722
  }
686
723
  UCSearchComponent.decorators = [
687
724
  { type: Component, args: [{
688
725
  selector: 'lib-UCSearch',
689
- template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\" ngModel\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n ngModel name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n value=\"{{question.value}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"text\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformAmount($event)\" class=\"form-control search-form-control\" ngModel\r\n name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" (keyup.enter)=\"searchClick()\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [name]=\"question.name\" (keyup.enter)=\"searchClick()\"\r\n attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask ngModel\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [name]=\"question.name\" (keyup.enter)=\"searchClick()\"\r\n attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask ngModel\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"date\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name}}\" ngModel\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <!-- Ini kalau datanya tidak di load dari URL -->\r\n <div *ngIf=\"!question.isFromURL\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" ngModel\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n [hidden]=\"question?.items.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.items.length != 1\" value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.items.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.items\" value=\"{{item.key}}\">\r\n {{item.value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.items.length == 1\">{{question.items[0].value}}</label>\r\n </div>\r\n <!-- Ini kalau datanya di load dari URL -->\r\n <div *ngIf=\"question.isFromURL\">\r\n <div *ngIf=\"question.isEvent\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n (change)=\"onChangeEvent($event.target.value, question)\"\r\n [hidden]=\"question?.items.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"!question.isEvent\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.label=\"{{question.label}}\"\r\n [hidden]=\"question?.itemsUrl.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n <lib-uc-show-errors [control]=\"enjiForm.form.controls[question.name]\"\r\n [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i> Export Excel\r\n </button>\r\n <button type=\"button\" (click)=\"reset(enjiForm)\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i> Reset\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick translate>\r\n <i class=\"fa fa-search\"></i> Search\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport()\"\r\n class=\"btn btn-raised btn-primary\" translate>\r\n <i class=\"fa ft-download\"></i> Generate Report\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->",
726
+ template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\" ngModel\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n ngModel name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n value=\"{{question.value}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"text\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformAmount($event)\" class=\"form-control search-form-control\" ngModel\r\n name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" (keyup.enter)=\"searchClick()\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [name]=\"question.name\" (keyup.enter)=\"searchClick()\"\r\n attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask ngModel\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [name]=\"question.name\" (keyup.enter)=\"searchClick()\"\r\n attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask ngModel\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"date\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name}}\" ngModel\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <!-- Ini kalau datanya tidak di load dari URL -->\r\n <div *ngIf=\"!question.isFromURL\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" ngModel\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n [hidden]=\"question?.items.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.items.length != 1\" value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.items.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.items\" value=\"{{item.key}}\">\r\n {{item.value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.items.length == 1\">{{question.items[0].value}}</label>\r\n </div>\r\n <!-- Ini kalau datanya di load dari URL -->\r\n <div *ngIf=\"question.isFromURL\">\r\n <div *ngIf=\"question.isEvent\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n (change)=\"onChangeEvent($event.target.value, question)\"\r\n [hidden]=\"question?.items.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"!question.isEvent\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.label=\"{{question.label}}\"\r\n [hidden]=\"question?.itemsUrl.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n <lib-uc-show-errors [control]=\"enjiForm.form.controls[question.name]\"\r\n [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i> Export Excel\r\n </button>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i> Reset\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick translate>\r\n <i class=\"fa fa-search\"></i> Search\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport()\"\r\n class=\"btn btn-raised btn-primary\" translate>\r\n <i class=\"fa ft-download\"></i> Generate Report\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->",
690
727
  providers: [ExcelService],
691
728
  animations: [
692
729
  trigger('changeDivSize', [
@@ -712,9 +749,11 @@ UCSearchComponent.ctorParameters = () => [
712
749
  { type: ExcelService },
713
750
  { type: Renderer2 },
714
751
  { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
715
- { type: ToastrService }
752
+ { type: ToastrService },
753
+ { type: CookieService }
716
754
  ];
717
755
  UCSearchComponent.propDecorators = {
756
+ content: [{ type: ViewChild, args: ['enjiForm',] }],
718
757
  myForm: [{ type: ViewChild, args: ['formIdSearch',] }],
719
758
  searchInput: [{ type: Input }],
720
759
  pageSize: [{ type: Input }],
@@ -752,6 +791,8 @@ if (false) {
752
791
  /** @type {?} */
753
792
  UCSearchComponent.prototype.isHidden;
754
793
  /** @type {?} */
794
+ UCSearchComponent.prototype.BisDt;
795
+ /** @type {?} */
755
796
  UCSearchComponent.prototype.currentState;
756
797
  /** @type {?} */
757
798
  UCSearchComponent.prototype.form;
@@ -765,6 +806,8 @@ if (false) {
765
806
  UCSearchComponent.prototype.apiUrl;
766
807
  /** @type {?} */
767
808
  UCSearchComponent.prototype.arrCrit;
809
+ /** @type {?} */
810
+ UCSearchComponent.prototype.searchForm;
768
811
  /**
769
812
  * @type {?}
770
813
  * @private
@@ -787,5 +830,10 @@ if (false) {
787
830
  UCSearchComponent.prototype._document;
788
831
  /** @type {?} */
789
832
  UCSearchComponent.prototype.toastr;
833
+ /**
834
+ * @type {?}
835
+ * @private
836
+ */
837
+ UCSearchComponent.prototype.cookieService;
790
838
  }
791
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFkaW5zL3Vjc2VhcmNoLyIsInNvdXJjZXMiOlsibGliL3Vjc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQXFCLE1BQU0sOEJBQThCLENBQUM7QUF1QnJGLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7O0lBbUQ1QixZQUFvQixJQUFnQixFQUFVLFlBQTBCLEVBQVUsVUFBcUIsRUFDM0UsU0FBUyxFQUFTLE1BQXFCO1FBRC9DLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxp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QUNyRyxzQ0FBbUM7O0lBQUUsbUNBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEluamVjdCwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5wdXRTZWFyY2hPYmogfSBmcm9tICcuL21vZGVsL0lucHV0U2VhcmNoT2JqLk1vZGVsJztcclxuaW1wb3J0IHsgQ3JpdGVyaWFPYmogfSBmcm9tICcuL21vZGVsL0NyaXRlcmlhT2JqLm1vZGVsJztcclxuaW1wb3J0IHsgUmVxdWVzdENyaXRlcmlhT2JqIH0gZnJvbSAnLi9tb2RlbC9SZXF1ZXN0Q3JpdGVyaWFPYmoubW9kZWwnO1xyXG5pbXBvcnQgeyBBZEluc0NvbnN0YW50IH0gZnJvbSAnLi9tb2RlbC9BZEluc3RDb25zdGFudCc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEV4Y2VsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZXhjZWwtc2VydmljZS9leGNlbC1zZXJ2aWNlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgc3R5bGUsIGFuaW1hdGUsIHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgRXhwb3J0VHlwZUNvbnN0YW50LCBLZXlWYWx1ZVJlcG9ydE9iaiB9IGZyb20gJy4vbW9kZWwvS2V5VmFsdWVSZXBvcnQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItVUNTZWFyY2gnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91Y3NlYXJjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdWNzZWFyY2guY29tcG9uZW50LmNzcyddLFxyXG4gIHByb3ZpZGVyczogW0V4Y2VsU2VydmljZV0sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignY2hhbmdlRGl2U2l6ZScsIFtcclxuICAgICAgc3RhdGUoJ2luaXRpYWwnLCBzdHlsZSh7XHJcbiAgICAgICAgaGVpZ2h0OiAnKicsXHJcbiAgICAgICAgb3BhY2l0eTogJzEnLFxyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdmaW5hbCcsIHN0eWxlKHtcclxuICAgICAgICBoZWlnaHQ6ICcwcHgnLFxyXG4gICAgICAgIG9wYWNpdHk6ICcwJyxcclxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXHJcbiAgICAgIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaW5pdGlhbD0+ZmluYWwnLCBhbmltYXRlKCczMDBtcycpKSxcclxuICAgICAgdHJhbnNpdGlvbignZmluYWw9PmluaXRpYWwnLCBhbmltYXRlKCczMDBtcycpKVxyXG4gICAgXSksXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVUNTZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8vIHRydXMgbmFkLCBiaXNhIGdhIGthbG8gbWlzYWxrYW4gZ3cgbWF1IGJpa2luXHJcbiAgLy8ga2FsbyBsb2dpbiBkaSBjYWJhbmcgSXNTZWxlY3RPbmU6IHRydWVcclxuICAvLyBrYWxvIGxvZ2luIGRpIEhPLCBJc1NlbGVjdE9uZTogZmFsc2VcclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybUlkU2VhcmNoJykgbXlGb3JtOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIHNlYXJjaElucHV0OiBJbnB1dFNlYXJjaE9iaiA9IG5ldyBJbnB1dFNlYXJjaE9iaigpO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBASW5wdXQoKSBpc1JlcG9ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSByZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBnZW5ScHQ6IEV2ZW50RW1pdHRlcjx7IEV4cG9ydFR5cGU6IG51bWJlciwgRWxSZWY6IEVsZW1lbnRSZWYgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgRXhwb3J0VHlwZTogbnVtYmVyLCBFbFJlZjogRWxlbWVudFJlZiB9PigpO1xyXG4gIEV4cG9ydFR5cGVMaXN0OiBBcnJheTxLZXlWYWx1ZVJlcG9ydE9iaj4gPSBbXHJcbiAgICB7XHJcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX1BERixcclxuICAgICAgdmFsdWU6IFwiUERGXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX1hMUyxcclxuICAgICAgdmFsdWU6IFwiRXhjZWwgMjAwM1wiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9YTFNYLFxyXG4gICAgICB2YWx1ZTogXCJFeGNlbCAyMDA3XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX0RPQyxcclxuICAgICAgdmFsdWU6IFwiRG9jdW1lbnRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfRE9DWCxcclxuICAgICAgdmFsdWU6IFwiRG9jdW1lbnQgWE1MXCJcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgRXhwb3J0VHlwZTogbnVtYmVyID0gMDtcclxuXHJcbiAgcGFnZU5vdzogYW55ID0gMTtcclxuICBjb25maWd1cmF0aW9uOiBhbnk7XHJcbiAgZXhwb3J0RGF0YTogYW55O1xyXG4gIEV4Y2VsRGF0YTogYW55O1xyXG4gIGlzRGF0YUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGN1cnJlbnRTdGF0ZSA9ICdpbml0aWFsJztcclxuXHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG4gIGNvdW50Rm9ybSA9IDA7XHJcbiAgZm9ybWF0dGVkQW1vdW50ID0gJyc7XHJcbiAgYW1vdW50ID0gMDtcclxuICBhcGlVcmw6IHN0cmluZztcclxuICBhcnJDcml0OiBhbnk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlLCBwcml2YXRlIF9yZW5kZXJlcjI6IFJlbmRlcmVyMixcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50LCBwdWJsaWMgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTdGF0ZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jdXJyZW50U3RhdGUgPT09ICdpbml0aWFsJyA/ICdmaW5hbCcgOiAnaW5pdGlhbCc7XHJcbiAgICB0aGlzLmlzSGlkZGVuID0gdGhpcy5pc0hpZGRlbiA9PT0gZmFsc2UgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKFwidWNzZWFyY2hcIik7XHJcbiAgICB0aGlzLmFwaVVybCA9IHRoaXMuc2VhcmNoSW5wdXQuZW52aXJvbWVudFVybCArIHRoaXMuc2VhcmNoSW5wdXQuYXBpUXJ5UGFnaW5nO1xyXG4gICAgdGhpcy5hcnJDcml0ID0gdGhpcy5zZWFyY2hJbnB1dC5hcnJDcml0T2JqO1xyXG4gICAgbGV0IGpzID0gdGhpcy5fcmVuZGVyZXIyLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAganMudGV4dCA9IGBcclxuICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICQoXCIjZmxpcFwiKS5jbGljayhmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICQoXCIjcGFuZWxcIikuc2xpZGVUb2dnbGUoXCJzbG93XCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGA7XHJcbiAgICB0aGlzLl9yZW5kZXJlcjIuYXBwZW5kQ2hpbGQodGhpcy5fZG9jdW1lbnQuYm9keSwganMpO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhdGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBpbml0aWF0ZUZvcm0oKSB7XHJcbiAgICB0aGlzLmdldEpTT04odGhpcy5zZWFyY2hJbnB1dC5fdXJsKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGRhdGE7XHJcbiAgICAgIHRoaXMuZXhwb3J0RGF0YSA9IGRhdGEuZXhwb3J0RXhjZWw7XHJcbiAgICAgIGlmIChkYXRhLmV4cG9ydFR5cGVMaXN0ICE9IHVuZGVmaW5lZCAmJiBkYXRhLmV4cG9ydFR5cGVMaXN0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgdGhpcy5FeHBvcnRUeXBlTGlzdCA9IGRhdGEuZXhwb3J0VHlwZUxpc3Q7XHJcbiAgICAgICAgdGhpcy5FeHBvcnRUeXBlID0gdGhpcy5FeHBvcnRUeXBlTGlzdFswXS5rZXk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY291bnRGb3JtID0gZGF0YS5jb21wb25lbnQubGVuZ3RoO1xyXG4gICAgICB0aGlzLmlzRGF0YUxvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC50aXRsZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC50aXRsZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnRpdGxlID0gdGhpcy5zZWFyY2hJbnB1dC50aXRsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvdW50Rm9ybTsgaSsrKSB7XHJcbiAgICAgICAgLy9pbmkga2FsYXUgZGF0YW55YSBkaSBsb2FkIGRhcmkgVVJMXHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmlzRnJvbVVSTCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIHZhciBhcnJheUNyaXQgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgIHZhciBjcml0ZXJpYU9iamVjdCA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgY3JpdGVyaWFPYmplY3QuRGF0YVR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LnByb3BOYW1lID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wTmFtZTtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LnZhbHVlID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wVmFsdWU7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC5yZXN0cmljdGlvbiA9IFwiZXFcIjtcclxuICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRlcmlhT2JqZWN0KTtcclxuICAgICAgICAgIHJlcXVlc3QuY3JpdGVyaWEgPSBhcnJheUNyaXQ7XHJcbiAgICAgICAgICByZXF1ZXN0W2RhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWVdID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wVmFsdWU7XHJcblxyXG4gICAgICAgICAgLy8gUGVuZ2VjZWthbiBwZW5nZ3VuYWFuIHVybCBhdGF1IHBhdGhcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50cy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5kZGxFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5uYW1lID09IHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzW3ldLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50c1t5XS5lbnZpcm9ubWVudCArIGRhdGEuY29tcG9uZW50W2ldLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aDsgeSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZW52aXJvbm1lbnQgPT0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLnVybCArIGRhdGEuY29tcG9uZW50W2ldLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IGRhdGEuY29tcG9uZW50W2ldLnVybDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gZGF0YS5jb21wb25lbnRbaV0udXJsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9sZW1wYXIgb2JqZWN0bnlhIHNla2FsaWFuIHNhbWEgdXJsbnlhLCBubnRpIGRpIGJpbmQgZGkgZGFsZW0ga2FyZW5hIG1hc2FsYWggZGkgYXN5bmNueWFcclxuICAgICAgICAgIC8vYmlhciB0aWFwIGZ1bmN0aW9uIGFkYSBzdGF0ZTJueWEgc2VuZGlyaVxyXG4gICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0KGRhdGEuY29tcG9uZW50W2ldLCBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCwgcmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcIm51bWVyaWNcIikge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBwYXJzZUZsb2F0KGRhdGEuY29tcG9uZW50W2ldLnZhbHVlKS50b0xvY2FsZVN0cmluZygnZW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcGVuZ2VjZWthbiB0YW5nZ2FsXHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkYXRlcGlja2VyXCIpIHtcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgIGxldCBsbHNCRCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQnVzaW5lc3NEYXRlUmF3XCIpO1xyXG4gICAgICAgICAgICBsZXQgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKGxsc0JEICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZShsbHNCRCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuY2hhckF0KDIpO1xyXG4gICAgICAgICAgICB2YXIgZGF0ZVNob3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgICAgICAgICB2YXIgdGVtcE1pbnVzID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCItXCIsIDIpO1xyXG4gICAgICAgICAgICAgIHZhciBudW1EYXkgPSBwYXJzZUludCh0ZW1wTWludXNbMV0pO1xyXG4gICAgICAgICAgICAgIGRhdGVTaG93LnNldERhdGUoYnVzaW5lc3NEYXRlLmdldERhdGUoKSAtIG51bURheSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcclxuICAgICAgICAgICAgICB2YXIgdGVtcE1pbnVzID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCIrXCIsIDIpO1xyXG4gICAgICAgICAgICAgIHZhciBudW1EYXkgPSBwYXJzZUludCh0ZW1wTWludXNbMV0pO1xyXG4gICAgICAgICAgICAgIGRhdGVTaG93LnNldERhdGUoYnVzaW5lc3NEYXRlLmdldERhdGUoKSArIG51bURheSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGF0ZVNob3cgPSBidXNpbmVzc0RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGRhdGVUZXh0ID0gZm9ybWF0RGF0ZShkYXRlU2hvdywgJ3l5eXktTU0tZGQnLCAnZW4tVVMnKVxyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IGRhdGVUZXh0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SlNPTih1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHBvc3RKU09OKHVybDogc3RyaW5nLCBjcml0ZXJpYTogYW55ID0gbnVsbCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCBjcml0ZXJpYSk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hDbGljaygpIHtcclxuICAgIGxldCBvcmRlciA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkgIT0gbnVsbCkge1xyXG4gICAgICBvcmRlciA9IHtcclxuICAgICAgICBrZXk6IHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LmtleSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkudmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wYWdlTm93ID0gMTtcclxuICAgIHRoaXMuc2VhcmNoKHRoaXMuYXBpVXJsLCB0aGlzLnBhZ2VOb3csIHRoaXMucGFnZVNpemUsIG9yZGVyLCB0aGlzLmFyckNyaXQpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXQoZXY6IE5nRm9ybSkge1xyXG4gICAgZXYucmVzZXRGb3JtKCk7XHJcbiAgICB0aGlzLkV4cG9ydFR5cGUgPSB0aGlzLkV4cG9ydFR5cGVMaXN0WzBdLmtleTtcclxuICAgIHRoaXMuaW5pdGlhdGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2goYXBpVXJsOiBzdHJpbmcsIHBhZ2VObzogbnVtYmVyLCByb3dQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk6IGFueSwgYWRkQ3JpdDogQ3JpdGVyaWFPYmpbXSA9IG5ldyBBcnJheSgpKSB7XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgIGxldCBhcnJDcml0ID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgSXNRdWVyeUluID0gZmFsc2U7XHJcbiAgICBsZXQgSXNCcmVhayA9IGZhbHNlO1xyXG5cclxuICAgIC8vIEluamVjdCB3aGVyZVF1ZXJ5IGZvciB3aGVyZSBjcml0ZXJpYVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy53aGVyZVF1ZXJ5ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeS5wdXNoKHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZVt4XS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJlcXVlc3QucGFnZU5vID0gcGFnZU5vO1xyXG4gICAgcmVxdWVzdC5yb3dQZXJQYWdlID0gcm93UGVyUGFnZTtcclxuICAgIHJlcXVlc3Qub3JkZXJCeSA9IG9yZGVyQnk7XHJcbiAgICByZXF1ZXN0LnF1ZXJ5U3RyaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudEZvcm07IGkrKykge1xyXG4gICAgICBsZXQgY3JpdE9iaiA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtpXTtcclxuXHJcbiAgICAgIC8vIC8vIHBvcHVwIG1lc3NhZ2UgaWYgcmVxdWlyZWRcclxuICAgICAgLy8gaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWQnKSAhPSBudWxsICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWQnKSA9PSBcInRydWVcIikge1xyXG4gICAgICAvLyAgIGxldCB2YWwgPSBjb21wb25lbnQudmFsdWUudHJpbSgpO1xyXG4gICAgICAvLyAgIGlmICh2YWwgPT0gXCJcIikge1xyXG4gICAgICAvLyAgICAgSXNCcmVhayA9IHRydWU7XHJcbiAgICAgIC8vICAgICBsZXQgbGFiZWwgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdsYWJlbCcpO1xyXG4gICAgICAvLyAgICAgdGhpcy50b2FzdHIud2FybmluZyhcIlBsZWFzZSBpbnB1dCBcIiArIGxhYmVsKTtcclxuICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgY3JpdE9iai5EYXRhVHlwZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xyXG4gICAgICAvL0luaSBraHVzdXMga2FsYXUgZGFyaSBEcm9wIERvd25cclxuICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ3F1ZXJ5LWluJykgIT0gbnVsbCAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdxdWVyeS1pbicpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgSXNRdWVyeUluID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBJc1F1ZXJ5SW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29tcG9uZW50LnZhbHVlICE9IFwiXCIpIHtcclxuICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVOYW1lID09ICdTRUxFQ1QnKSB7XHJcbiAgICAgICAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICAgICAgICBsZXQgdGV4dCA9IGRkbFtkZGwuc2VsZWN0ZWRJbmRleF0udmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgaWYgKHRleHQgPT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICBJc0JyZWFrID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGxhYmVsID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhcIlBsZWFzZSBzZWxlY3QgXCIgKyBsYWJlbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRleHQgIT0gXCJhbGxcIiAmJiB0ZXh0ICE9IFwib25lXCIpIHtcclxuICAgICAgICAgICAgLy9LYWxhdSBEYXJpIERyb3Bkb3duIHVkYWggcGFzdGkgcGFrZSBFcVxyXG4gICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxO1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gXCJhbGxcIiAmJiBJc1F1ZXJ5SW4gPT0gdHJ1ZSAmJiBjb21wb25lbnQub3B0aW9ucy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICBsZXQgZGRsTGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNvbXBvbmVudC5vcHRpb25zLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHggIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZGRsTGlzdC5wdXNoKGNvbXBvbmVudC5vcHRpb25zW3hdLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRkbExpc3QubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkluO1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQubmFtZTtcclxuICAgICAgICAgICAgICBjcml0T2JqLmxpc3RWYWx1ZSA9IGRkbExpc3Q7XHJcbiAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy9LYWxhdSBhZGEgUGVyY2VudCBtYWthIHlhbmcgZGlwYWtlIG5udGkgYWRhbGFoIFJlc3RyaWN0aW9ucyBMaWtlXHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjcml0T2JqLnZhbHVlID0gY29tcG9uZW50LnZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgIGlmIChjb21wb25lbnQudmFsdWUuaW5jbHVkZXMoXCIlXCIpKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uTGlrZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8va2FsYXUgY29tcG9uZW50bnlhIERhdGUsIHJlc3RyaWN0aW9uc255YSBsZ3NnIGFtYmlsIGRhcmkgcHJvcGVydHkgSlNPTm55YVxyXG4gICAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXN0cmljdGlvbicpICE9IFwiXCIgJiYgY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXN0cmljdGlvbicpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKTtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpID09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBwYXJzZUZsb2F0KGNvbXBvbmVudC52YWx1ZS5yZXBsYWNlKC8sL2csICcnKSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3JpdE9iai5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTElLRVwiKSB7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IFwiJVwiICsgY29tcG9uZW50LnZhbHVlLnRyaW0oKSArIFwiJVwiO1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uTGlrZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25FcVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChJc0JyZWFrKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWRkQ3JpdCAhPSBudWxsICYmIGFkZENyaXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChhZGRDcml0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZGRDcml0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhcnJDcml0LnB1c2goYWRkQ3JpdFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IG51bGwgfHwgdGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXJyQ3JpdC5wdXNoKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0W2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IG51bGwgfHwgdGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBhcnJDcml0LnB1c2godGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXRbaV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFyckNyaXQ7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlYXJjaElucHV0LmlzSm9pbkV4QVBJKSB7XHJcbiAgICAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QoYXBpVXJsLCByZXF1ZXN0KS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGxldCBxcnlQYWdpbmcgPSB7XHJcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxyXG4gICAgICAgIHBhZ2VOb3c6IHBhZ2VOb1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKHFyeVBhZ2luZyk7XHJcbiAgICAgIHRoaXMucmVzdWx0LmVtaXQocXJ5UGFnaW5nKTtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBHZW5lcmF0ZVJlcG9ydCgpIHtcclxuICAgIHRoaXMuZ2VuUnB0LmVtaXQoeyBFeHBvcnRUeXBlOiB0aGlzLkV4cG9ydFR5cGUsIEVsUmVmOiB0aGlzLm15Rm9ybSB9KTtcclxuICB9XHJcblxyXG4gIGxlc3NUaGFuRm91cigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvdW50Rm9ybSA+IDMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZU9iamVjdChvYmo6IGFueSwgdXJsOiBzdHJpbmcsIGNyaXQ6IFJlcXVlc3RDcml0ZXJpYU9iaiA9IG51bGwpIHtcclxuICAgIGNvbnN0IHZhbCA9IHRoaXMucG9zdEpTT04odXJsLCBjcml0KTtcclxuICAgIHZhbC5zdWJzY3JpYmUodGVtcERhdGEgPT4ge1xyXG4gICAgICBvYmouaXRlbXNVcmwgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgb2JqLml0ZW1zVXJsID0gdGVtcERhdGEuUmV0dXJuT2JqZWN0O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm1BbW91bnQoZWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLmZvcm1hdHRlZEFtb3VudCA9IHBhcnNlRmxvYXQoZWxlbWVudC50YXJnZXQudmFsdWUpLnRvTG9jYWxlU3RyaW5nKCdlbicpO1xyXG4gICAgLy8gdG8gc2hvdyB0aGUgZm9ybWF0dGVkIGFtb3VudCBpbiB0aGUgdGV4dGJveC5cclxuICAgIGVsZW1lbnQudGFyZ2V0LnZhbHVlID0gdGhpcy5mb3JtYXR0ZWRBbW91bnQ7XHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm1Ub0RlY2ltYWwoZWxlbWVudDogYW55KSB7XHJcbiAgICBlbGVtZW50LnRhcmdldC52YWx1ZSA9IHBhcnNlRmxvYXQoZWxlbWVudC50YXJnZXQudmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcnKSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnRBc1hMU1goKTogdm9pZCB7XHJcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgIHJlcXVlc3QucGFnZU5vID0gMTtcclxuICAgIHJlcXVlc3Qucm93UGVyUGFnZSA9IDk5OTk7XHJcbiAgICByZXF1ZXN0Lm9yZGVyQnkgPSBudWxsO1xyXG4gICAgcmVxdWVzdC5jcml0ZXJpYSA9IFtdO1xyXG4gICAgcmVxdWVzdC5xdWVyeVN0cmluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZztcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaVVybCwgcmVxdWVzdCkuc3Vic2NyaWJlKFxyXG4gICAgICByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgdGhpcy5FeGNlbERhdGEgPSByZXNwb25zZVtcIkRhdGFcIl07XHJcbiAgICAgICAgdGhpcy5leGNlbFNlcnZpY2UuZXhwb3J0QXNFeGNlbEZpbGUodGhpcy5FeGNlbERhdGEsICdzYW1wbGUnKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlRXZlbnQob3B0VmFsdWUsIGFmRmlsdGVyKSB7XHJcbiAgICB2YXIganNvbkNvbXAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50O1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWZGaWx0ZXIuYWZmZWN0ZWRGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBqc29uQ29tcC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmIChqc29uQ29tcFtqXS5uYW1lID09IGFmRmlsdGVyLmFmZmVjdGVkRmlsdGVyW2ldKSB7XHJcbiAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIHZhciBhcnJheUNyaXQgPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICAgICAgICBpZiAob3B0VmFsdWUgIT0gXCJhbGxcIiAmJiBvcHRWYWx1ZSAhPSBcIm9uZVwiKSB7XHJcbiAgICAgICAgICAgIHZhciBjcml0T2JqID0gbmV3IENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICAgIGNyaXRPYmouRGF0YVR5cGUgPSBhZkZpbHRlci5kYXRhdHlwZTtcclxuICAgICAgICAgICAgaWYgKGFmRmlsdGVyLmZpbHRlclByb3BOYW1lICE9IHVuZGVmaW5lZCB8fCBhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgcmVxdWVzdFthZkZpbHRlci5maWx0ZXJQcm9wTmFtZV0gPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGFmRmlsdGVyLm5hbWU7XHJcbiAgICAgICAgICAgICAgcmVxdWVzdFthZkZpbHRlci5uYW1lXSA9IG9wdFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25FcTtcclxuICAgICAgICAgICAgYXJyYXlDcml0LnB1c2goY3JpdE9iaik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyYXlDcml0O1xyXG4gICAgICAgICAgaWYgKGpzb25Db21wW2pdLnBhdGggIT0gdW5kZWZpbmVkICYmIGpzb25Db21wW2pdLnBhdGggIT0gXCJcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5kZGxFbnZpcm9ubWVudHMgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50cy5sZW5ndGg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGpzb25Db21wW2pdLm5hbWUgPT0gdGhpcy5zZWFyY2hJbnB1dC5kZGxFbnZpcm9ubWVudHNbeV0ubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBqc29uQ29tcFtqXS5mdWxscGF0aCA9IHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50ICsganNvbkNvbXBbal0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqc29uQ29tcC5jb21wb25lbnRbal0uZW52aXJvbm1lbnQgPT0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIGpzb25Db21wLmNvbXBvbmVudFtqXS5mdWxscGF0aCA9IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS51cmwgKyBqc29uQ29tcC5jb21wb25lbnRbal0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID0ganNvbkNvbXBbal0udXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSBqc29uQ29tcFtqXS51cmw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3QoanNvbkNvbXBbal0sIGpzb25Db21wW2pdLmZ1bGxwYXRoLCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN3aXRjaENhc2UoY29uZExpc3QpIHtcclxuICAgIHZhciBjb25kaXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRMaXN0LmNvbmRpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGlkeCA9IHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWUuZmluZEluZGV4KHggPT4geC5wcm9wZXJ0eSA9PSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnByb3BlcnR5KTtcclxuICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJFUVwiKSB7XHJcbiAgICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyICE9IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA9PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTkVRXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSAhPSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhciB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlICE9IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyICE9IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPiBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhciB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID4gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIkdURVwiKSB7XHJcbiAgICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyICE9IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTFRcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDwgY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJMVEVcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDw9IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFyIHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPD0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb25kaXRpb247XHJcblxyXG4gIH1cclxufVxyXG4iXX0=
839
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFkaW5zL3Vjc2VhcmNoLyIsInNvdXJjZXMiOlsibGliL3Vjc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFxQixNQUFNLDhCQUE4QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUF1QnRD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Q0FBZTs7SUFDZixvQ0FBYTs7SUFDYix1Q0FBbUI7Ozs7O0lBRVAsaUNBQXdCOzs7OztJQUFFLHlDQUFrQzs7Ozs7SUFBRSx1Q0FBNkI7Ozs7O0lBQ3JHLHNDQUFtQzs7SUFBRSxtQ0FBNEI7Ozs7O0lBQUUsMENBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEluamVjdCwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5wdXRTZWFyY2hPYmogfSBmcm9tICcuL21vZGVsL0lucHV0U2VhcmNoT2JqLk1vZGVsJztcclxuaW1wb3J0IHsgQ3JpdGVyaWFPYmogfSBmcm9tICcuL21vZGVsL0NyaXRlcmlhT2JqLm1vZGVsJztcclxuaW1wb3J0IHsgUmVxdWVzdENyaXRlcmlhT2JqIH0gZnJvbSAnLi9tb2RlbC9SZXF1ZXN0Q3JpdGVyaWFPYmoubW9kZWwnO1xyXG5pbXBvcnQgeyBBZEluc0NvbnN0YW50IH0gZnJvbSAnLi9tb2RlbC9BZEluc3RDb25zdGFudCc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEV4Y2VsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZXhjZWwtc2VydmljZS9leGNlbC1zZXJ2aWNlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgc3R5bGUsIGFuaW1hdGUsIHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgRXhwb3J0VHlwZUNvbnN0YW50LCBLZXlWYWx1ZVJlcG9ydE9iaiB9IGZyb20gJy4vbW9kZWwvS2V5VmFsdWVSZXBvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZSc7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1VQ1NlYXJjaCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Vjc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91Y3NlYXJjaC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbRXhjZWxTZXJ2aWNlXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdjaGFuZ2VEaXZTaXplJywgW1xyXG4gICAgICBzdGF0ZSgnaW5pdGlhbCcsIHN0eWxlKHtcclxuICAgICAgICBoZWlnaHQ6ICcqJyxcclxuICAgICAgICBvcGFjaXR5OiAnMScsXHJcbiAgICAgIH0pKSxcclxuICAgICAgc3RhdGUoJ2ZpbmFsJywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJzBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogJzAnLFxyXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcclxuICAgICAgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdpbml0aWFsPT5maW5hbCcsIGFuaW1hdGUoJzMwMG1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdmaW5hbD0+aW5pdGlhbCcsIGFuaW1hdGUoJzMwMG1zJykpXHJcbiAgICBdKSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVQ1NlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gdHJ1cyBuYWQsIGJpc2EgZ2Ega2FsbyBtaXNhbGthbiBndyBtYXUgYmlraW5cclxuICAvLyBrYWxvIGxvZ2luIGRpIGNhYmFuZyBJc1NlbGVjdE9uZTogdHJ1ZVxyXG4gIC8vIGthbG8gbG9naW4gZGkgSE8sIElzU2VsZWN0T25lOiBmYWxzZVxyXG4gIEBWaWV3Q2hpbGQoJ2VuamlGb3JtJykgc2V0IGNvbnRlbnQoY29udGVudDogTmdGb3JtKSB7XHJcbiAgICBpZiAoY29udGVudCkgeyAvLyBpbml0aWFsbHkgc2V0dGVyIGdldHMgY2FsbGVkIHdpdGggdW5kZWZpbmVkXHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IGNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdmb3JtSWRTZWFyY2gnKSBteUZvcm06IEVsZW1lbnRSZWY7XHJcbiAgQElucHV0KCkgc2VhcmNoSW5wdXQ6IElucHV0U2VhcmNoT2JqID0gbmV3IElucHV0U2VhcmNoT2JqKCk7XHJcbiAgQElucHV0KCkgcGFnZVNpemU6IG51bWJlciA9IDEwO1xyXG4gIEBJbnB1dCgpIGlzUmVwb3J0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHJlc3VsdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGdlblJwdDogRXZlbnRFbWl0dGVyPHsgRXhwb3J0VHlwZTogbnVtYmVyLCBFbFJlZjogRWxlbWVudFJlZiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBFeHBvcnRUeXBlOiBudW1iZXIsIEVsUmVmOiBFbGVtZW50UmVmIH0+KCk7XHJcbiAgRXhwb3J0VHlwZUxpc3Q6IEFycmF5PEtleVZhbHVlUmVwb3J0T2JqPiA9IFtcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfUERGLFxyXG4gICAgICB2YWx1ZTogXCJQREZcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfWExTLFxyXG4gICAgICB2YWx1ZTogXCJFeGNlbCAyMDAzXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX1hMU1gsXHJcbiAgICAgIHZhbHVlOiBcIkV4Y2VsIDIwMDdcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfRE9DLFxyXG4gICAgICB2YWx1ZTogXCJEb2N1bWVudFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9ET0NYLFxyXG4gICAgICB2YWx1ZTogXCJEb2N1bWVudCBYTUxcIlxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBFeHBvcnRUeXBlOiBudW1iZXIgPSAwO1xyXG5cclxuICBwYWdlTm93OiBhbnkgPSAxO1xyXG4gIGNvbmZpZ3VyYXRpb246IGFueTtcclxuICBleHBvcnREYXRhOiBhbnk7XHJcbiAgRXhjZWxEYXRhOiBhbnk7XHJcbiAgaXNEYXRhTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBCaXNEdDogc3RyaW5nO1xyXG5cclxuICBjdXJyZW50U3RhdGUgPSAnaW5pdGlhbCc7XHJcblxyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBjb3VudEZvcm0gPSAwO1xyXG4gIGZvcm1hdHRlZEFtb3VudCA9ICcnO1xyXG4gIGFtb3VudCA9IDA7XHJcbiAgYXBpVXJsOiBzdHJpbmc7XHJcbiAgYXJyQ3JpdDogYW55O1xyXG4gIHNlYXJjaEZvcm06IE5nRm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlLCBwcml2YXRlIF9yZW5kZXJlcjI6IFJlbmRlcmVyMixcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50LCBwdWJsaWMgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLCBwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIGNoYW5nZVN0YXRlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gJ2luaXRpYWwnID8gJ2ZpbmFsJyA6ICdpbml0aWFsJztcclxuICAgIHRoaXMuaXNIaWRkZW4gPSB0aGlzLmlzSGlkZGVuID09PSBmYWxzZSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc29sZS5sb2coXCJ1Y3NlYXJjaFwiKTtcclxuICAgIHRoaXMuYXBpVXJsID0gdGhpcy5zZWFyY2hJbnB1dC5lbnZpcm9tZW50VXJsICsgdGhpcy5zZWFyY2hJbnB1dC5hcGlRcnlQYWdpbmc7XHJcbiAgICB0aGlzLmFyckNyaXQgPSB0aGlzLnNlYXJjaElucHV0LmFyckNyaXRPYmo7XHJcbiAgICBsZXQganMgPSB0aGlzLl9yZW5kZXJlcjIuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICBqcy50ZXh0ID0gYFxyXG4gICAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgJChcIiNmbGlwXCIpLmNsaWNrKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgJChcIiNwYW5lbFwiKS5zbGlkZVRvZ2dsZShcInNsb3dcIik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYDtcclxuICAgIHRoaXMuX3JlbmRlcmVyMi5hcHBlbmRDaGlsZCh0aGlzLl9kb2N1bWVudC5ib2R5LCBqcyk7XHJcblxyXG4gICAgbGV0IHZhbHVlID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldCgnQnVzaW5lc3NEYXRlUmF3Jyk7XHJcbiAgICB0aGlzLkJpc0R0ID0gdGhpcy5EZWNyeXB0U3RyaW5nKHZhbHVlLCBcIkFkSW5zRk9VMTIzNDU2NzhcIik7XHJcbiAgICB0aGlzLmluaXRpYXRlRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhdGVGb3JtKCkge1xyXG4gICAgdGhpcy5nZXRKU09OKHRoaXMuc2VhcmNoSW5wdXQuX3VybCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBkYXRhO1xyXG4gICAgICB0aGlzLmV4cG9ydERhdGEgPSBkYXRhLmV4cG9ydEV4Y2VsO1xyXG4gICAgICBpZiAoZGF0YS5leHBvcnRUeXBlTGlzdCAhPSB1bmRlZmluZWQgJiYgZGF0YS5leHBvcnRUeXBlTGlzdC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIHRoaXMuRXhwb3J0VHlwZUxpc3QgPSBkYXRhLmV4cG9ydFR5cGVMaXN0O1xyXG4gICAgICAgIHRoaXMuRXhwb3J0VHlwZSA9IHRoaXMuRXhwb3J0VHlwZUxpc3RbMF0ua2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvdW50Rm9ybSA9IGRhdGEuY29tcG9uZW50Lmxlbmd0aDtcclxuICAgICAgdGhpcy5pc0RhdGFMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQudGl0bGUgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQudGl0bGUgIT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi50aXRsZSA9IHRoaXMuc2VhcmNoSW5wdXQudGl0bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb3VudEZvcm07IGkrKykge1xyXG4gICAgICAgIC8vaW5pIGthbGF1IGRhdGFueWEgZGkgbG9hZCBkYXJpIFVSTFxyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICB2YXIgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICB2YXIgY3JpdGVyaWFPYmplY3QgPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LkRhdGFUeXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC5wcm9wTmFtZSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWU7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC52YWx1ZSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG4gICAgICAgICAgY3JpdGVyaWFPYmplY3QucmVzdHJpY3Rpb24gPSBcImVxXCI7XHJcbiAgICAgICAgICBhcnJheUNyaXQucHVzaChjcml0ZXJpYU9iamVjdCk7XHJcbiAgICAgICAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyYXlDcml0O1xyXG4gICAgICAgICAgcmVxdWVzdFtkYXRhLmNvbXBvbmVudFtpXS5jcml0ZXJpYVByb3BOYW1lXSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIFBlbmdlY2VrYW4gcGVuZ2d1bmFhbiB1cmwgYXRhdSBwYXRoXHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSB1bmRlZmluZWQgJiYgZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5kZGxFbnZpcm9ubWVudHMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzLmxlbmd0aDsgeSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ubmFtZSA9PSB0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50c1t5XS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gdGhpcy5zZWFyY2hJbnB1dC5kZGxFbnZpcm9ubWVudHNbeV0uZW52aXJvbm1lbnQgKyBkYXRhLmNvbXBvbmVudFtpXS5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cy5sZW5ndGg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmVudmlyb25tZW50ID09IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS5lbnZpcm9ubWVudCkge1xyXG4gICAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS51cmwgKyBkYXRhLmNvbXBvbmVudFtpXS5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZnVsbHBhdGggPSBkYXRhLmNvbXBvbmVudFtpXS51cmw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IGRhdGEuY29tcG9uZW50W2ldLnVybDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vbGVtcGFyIG9iamVjdG55YSBzZWthbGlhbiBzYW1hIHVybG55YSwgbm50aSBkaSBiaW5kIGRpIGRhbGVtIGthcmVuYSBtYXNhbGFoIGRpIGFzeW5jbnlhXHJcbiAgICAgICAgICAvL2JpYXIgdGlhcCBmdW5jdGlvbiBhZGEgc3RhdGUybnlhIHNlbmRpcmlcclxuICAgICAgICAgIHRoaXMucmVzb2x2ZU9iamVjdChkYXRhLmNvbXBvbmVudFtpXSwgZGF0YS5jb21wb25lbnRbaV0uZnVsbHBhdGgsIHJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJudW1lcmljXCIpIHtcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gcGFyc2VGbG9hdChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3BlbmdlY2VrYW4gdGFuZ2dhbFxyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZGF0ZXBpY2tlclwiKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJCRFwiKSkge1xyXG4gICAgICAgICAgICBsZXQgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQmlzRHQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGJ1c2luZXNzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuQmlzRHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmNoYXJBdCgyKTtcclxuICAgICAgICAgICAgdmFyIGRhdGVTaG93ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKG9wZXJhdG9yID09IFwiLVwiKSB7XHJcbiAgICAgICAgICAgICAgdmFyIHRlbXBNaW51cyA9IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLnNwbGl0KFwiLVwiLCAyKTtcclxuICAgICAgICAgICAgICB2YXIgbnVtRGF5ID0gcGFyc2VJbnQodGVtcE1pbnVzWzFdKTtcclxuICAgICAgICAgICAgICBkYXRlU2hvdy5zZXREYXRlKGJ1c2luZXNzRGF0ZS5nZXREYXRlKCkgLSBudW1EYXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09IFwiK1wiKSB7XHJcbiAgICAgICAgICAgICAgdmFyIHRlbXBNaW51cyA9IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLnNwbGl0KFwiK1wiLCAyKTtcclxuICAgICAgICAgICAgICB2YXIgbnVtRGF5ID0gcGFyc2VJbnQodGVtcE1pbnVzWzFdKTtcclxuICAgICAgICAgICAgICBkYXRlU2hvdy5zZXREYXRlKGJ1c2luZXNzRGF0ZS5nZXREYXRlKCkgKyBudW1EYXkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGVTaG93ID0gYnVzaW5lc3NEYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBkYXRlVGV4dCA9IGZvcm1hdERhdGUoZGF0ZVNob3csICd5eXl5LU1NLWRkJywgJ2VuLVVTJylcclxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBkYXRlVGV4dDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEpTT04odXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwb3N0SlNPTih1cmw6IHN0cmluZywgY3JpdGVyaWE6IGFueSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgY3JpdGVyaWEpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ2xpY2soKSB7XHJcbiAgICBsZXQgb3JkZXIgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5ICE9IG51bGwpIHtcclxuICAgICAgb3JkZXIgPSB7XHJcbiAgICAgICAga2V5OiB0aGlzLmNvbmZpZ3VyYXRpb24ub3JkZXJieS5rZXksXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LnZhbHVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucGFnZU5vdyA9IDE7XHJcbiAgICB0aGlzLnNlYXJjaCh0aGlzLmFwaVVybCwgdGhpcy5wYWdlTm93LCB0aGlzLnBhZ2VTaXplLCBvcmRlciwgdGhpcy5hcnJDcml0KTtcclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnJlc2V0Rm9ybSgpO1xyXG4gICAgdGhpcy5FeHBvcnRUeXBlID0gdGhpcy5FeHBvcnRUeXBlTGlzdFswXS5rZXk7XHJcbiAgICB0aGlzLmluaXRpYXRlRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoKGFwaVVybDogc3RyaW5nLCBwYWdlTm86IG51bWJlciwgcm93UGVyUGFnZTogbnVtYmVyLCBvcmRlckJ5OiBhbnksIGFkZENyaXQ6IENyaXRlcmlhT2JqW10gPSBuZXcgQXJyYXkoKSkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICBsZXQgYXJyQ3JpdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGV0IElzUXVlcnlJbiA9IGZhbHNlO1xyXG4gICAgbGV0IElzQnJlYWsgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJbmplY3Qgd2hlcmVRdWVyeSBmb3Igd2hlcmUgY3JpdGVyaWFcclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZS5sZW5ndGggIT0gMCkge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nLndoZXJlUXVlcnkucHVzaCh0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWVbeF0udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXF1ZXN0LnBhZ2VObyA9IHBhZ2VObztcclxuICAgIHJlcXVlc3Qucm93UGVyUGFnZSA9IHJvd1BlclBhZ2U7XHJcbiAgICByZXF1ZXN0Lm9yZGVyQnkgPSBvcmRlckJ5O1xyXG4gICAgcmVxdWVzdC5xdWVyeVN0cmluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnRGb3JtOyBpKyspIHtcclxuICAgICAgbGV0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbaV07XHJcblxyXG4gICAgICAvLyAvLyBwb3B1cCBtZXNzYWdlIGlmIHJlcXVpcmVkXHJcbiAgICAgIC8vIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVkJykgIT0gbnVsbCAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVkJykgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgLy8gICBsZXQgdmFsID0gY29tcG9uZW50LnZhbHVlLnRyaW0oKTtcclxuICAgICAgLy8gICBpZiAodmFsID09IFwiXCIpIHtcclxuICAgICAgLy8gICAgIElzQnJlYWsgPSB0cnVlO1xyXG4gICAgICAvLyAgICAgbGV0IGxhYmVsID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcclxuICAgICAgLy8gICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXCJQbGVhc2UgaW5wdXQgXCIgKyBsYWJlbCk7XHJcbiAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGNyaXRPYmouRGF0YVR5cGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKTtcclxuICAgICAgLy9Jbmkga2h1c3VzIGthbGF1IGRhcmkgRHJvcCBEb3duXHJcbiAgICAgIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdxdWVyeS1pbicpICE9IG51bGwgJiYgY29tcG9uZW50LmdldEF0dHJpYnV0ZSgncXVlcnktaW4nKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgIElzUXVlcnlJbiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgSXNRdWVyeUluID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbXBvbmVudC52YWx1ZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudC5ub2RlTmFtZSA9PSAnU0VMRUNUJykge1xyXG4gICAgICAgICAgbGV0IGRkbCA9IGNvbXBvbmVudC5vcHRpb25zO1xyXG4gICAgICAgICAgbGV0IHRleHQgPSBkZGxbZGRsLnNlbGVjdGVkSW5kZXhdLnZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgIGlmICh0ZXh0ID09IFwib25lXCIpIHtcclxuICAgICAgICAgICAgSXNCcmVhayA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXCJQbGVhc2Ugc2VsZWN0IFwiICsgbGFiZWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0ZXh0ICE9IFwiYWxsXCIgJiYgdGV4dCAhPSBcIm9uZVwiKSB7XHJcbiAgICAgICAgICAgIC8vS2FsYXUgRGFyaSBEcm9wZG93biB1ZGFoIHBhc3RpIHBha2UgRXFcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25FcTtcclxuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gdGV4dDtcclxuICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09IFwiYWxsXCIgJiYgSXNRdWVyeUluID09IHRydWUgJiYgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgbGV0IGRkbExpc3QgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjb21wb25lbnQub3B0aW9ucy5sZW5ndGg7IHgrKykge1xyXG4gICAgICAgICAgICAgIGlmICh4ICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGRkbExpc3QucHVzaChjb21wb25lbnQub3B0aW9uc1t4XS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkZGxMaXN0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25JbjtcclxuICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5saXN0VmFsdWUgPSBkZGxMaXN0O1xyXG4gICAgICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vS2FsYXUgYWRhIFBlcmNlbnQgbWFrYSB5YW5nIGRpcGFrZSBubnRpIGFkYWxhaCBSZXN0cmljdGlvbnMgTGlrZVxyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3JpdE9iai52YWx1ZSA9IGNvbXBvbmVudC52YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnZhbHVlLmluY2x1ZGVzKFwiJVwiKSkge1xyXG4gICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkxpa2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL2thbGF1IGNvbXBvbmVudG55YSBEYXRlLCByZXN0cmljdGlvbnNueWEgbGdzZyBhbWJpbCBkYXJpIHByb3BlcnR5IEpTT05ueWFcclxuICAgICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA9PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gcGFyc2VGbG9hdChjb21wb25lbnQudmFsdWUucmVwbGFjZSgvLC9nLCAnJykpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNyaXRPYmoucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxJS0VcIikge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBcIiVcIiArIGNvbXBvbmVudC52YWx1ZS50cmltKCkgKyBcIiVcIjtcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkxpa2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXFcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoSXNCcmVhaykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFkZENyaXQgIT0gbnVsbCAmJiBhZGRDcml0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoYWRkQ3JpdC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkQ3JpdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXJyQ3JpdC5wdXNoKGFkZENyaXRbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSBudWxsIHx8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGFyckNyaXQucHVzaCh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSBudWxsIHx8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYXJyQ3JpdC5wdXNoKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0W2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSBhcnJDcml0O1xyXG5cclxuICAgIGlmICghdGhpcy5zZWFyY2hJbnB1dC5pc0pvaW5FeEFQSSkge1xyXG4gICAgICByZXF1ZXN0LmludGVncmF0aW9uT2JqID0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSB0aGlzLnNlYXJjaElucHV0LmludGVncmF0aW9uT2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KGFwaVVybCwgcmVxdWVzdCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICBsZXQgcXJ5UGFnaW5nID0ge1xyXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcclxuICAgICAgICBwYWdlTm93OiBwYWdlTm9cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhxcnlQYWdpbmcpO1xyXG4gICAgICB0aGlzLnJlc3VsdC5lbWl0KHFyeVBhZ2luZyk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgR2VuZXJhdGVSZXBvcnQoKSB7XHJcbiAgICB0aGlzLmdlblJwdC5lbWl0KHsgRXhwb3J0VHlwZTogdGhpcy5FeHBvcnRUeXBlLCBFbFJlZjogdGhpcy5teUZvcm0gfSk7XHJcbiAgfVxyXG5cclxuICBsZXNzVGhhbkZvdXIoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb3VudEZvcm0gPiAzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc29sdmVPYmplY3Qob2JqOiBhbnksIHVybDogc3RyaW5nLCBjcml0OiBSZXF1ZXN0Q3JpdGVyaWFPYmogPSBudWxsKSB7XHJcbiAgICBjb25zdCB2YWwgPSB0aGlzLnBvc3RKU09OKHVybCwgY3JpdCk7XHJcbiAgICB2YWwuc3Vic2NyaWJlKHRlbXBEYXRhID0+IHtcclxuICAgICAgb2JqLml0ZW1zVXJsID0gbmV3IEFycmF5KCk7XHJcbiAgICAgIG9iai5pdGVtc1VybCA9IHRlbXBEYXRhLlJldHVybk9iamVjdDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtQW1vdW50KGVsZW1lbnQ6IGFueSkge1xyXG4gICAgdGhpcy5mb3JtYXR0ZWRBbW91bnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQudGFyZ2V0LnZhbHVlKS50b0xvY2FsZVN0cmluZygnZW4nKTtcclxuICAgIC8vIHRvIHNob3cgdGhlIGZvcm1hdHRlZCBhbW91bnQgaW4gdGhlIHRleHRib3guXHJcbiAgICBlbGVtZW50LnRhcmdldC52YWx1ZSA9IHRoaXMuZm9ybWF0dGVkQW1vdW50O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtVG9EZWNpbWFsKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgZWxlbWVudC50YXJnZXQudmFsdWUgPSBwYXJzZUZsb2F0KGVsZW1lbnQudGFyZ2V0LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnJykpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0QXNYTFNYKCk6IHZvaWQge1xyXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICByZXF1ZXN0LnBhZ2VObyA9IDE7XHJcbiAgICByZXF1ZXN0LnJvd1BlclBhZ2UgPSA5OTk5O1xyXG4gICAgcmVxdWVzdC5vcmRlckJ5ID0gbnVsbDtcclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSBbXTtcclxuICAgIHJlcXVlc3QucXVlcnlTdHJpbmcgPSB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmc7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGlVcmwsIHJlcXVlc3QpLnN1YnNjcmliZShcclxuICAgICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHRoaXMuRXhjZWxEYXRhID0gcmVzcG9uc2VbXCJEYXRhXCJdO1xyXG4gICAgICAgIHRoaXMuZXhjZWxTZXJ2aWNlLmV4cG9ydEFzRXhjZWxGaWxlKHRoaXMuRXhjZWxEYXRhLCAnc2FtcGxlJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUV2ZW50KG9wdFZhbHVlLCBhZkZpbHRlcikge1xyXG4gICAgdmFyIGpzb25Db21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFmRmlsdGVyLmFmZmVjdGVkRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwganNvbkNvbXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAoanNvbkNvbXBbal0ubmFtZSA9PSBhZkZpbHRlci5hZmZlY3RlZEZpbHRlcltpXSkge1xyXG4gICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICB2YXIgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlICE9IFwiYWxsXCIgJiYgb3B0VmFsdWUgIT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICB2YXIgY3JpdE9iaiA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgICBjcml0T2JqLkRhdGFUeXBlID0gYWZGaWx0ZXIuZGF0YXR5cGU7XHJcbiAgICAgICAgICAgIGlmIChhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSAhPSB1bmRlZmluZWQgfHwgYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWVdID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGFmRmlsdGVyLmZpbHRlclByb3BOYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBhZkZpbHRlci5uYW1lO1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIubmFtZV0gPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XHJcbiAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFycmF5Q3JpdDtcclxuICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBqc29uQ29tcFtqXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50cy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5kZGxFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5uYW1lID09IHRoaXMuc2VhcmNoSW5wdXQuZGRsRW52aXJvbm1lbnRzW3ldLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0LmRkbEVudmlyb25tZW50c1t5XS5lbnZpcm9ubWVudCArIGpzb25Db21wW2pdLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aDsgeSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoanNvbkNvbXAuY29tcG9uZW50W2pdLmVudmlyb25tZW50ID09IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS5lbnZpcm9ubWVudCkge1xyXG4gICAgICAgICAgICAgICAgICBqc29uQ29tcC5jb21wb25lbnRbal0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0udXJsICsganNvbkNvbXAuY29tcG9uZW50W2pdLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBqc29uQ29tcFtqXS5mdWxscGF0aCA9IGpzb25Db21wW2pdLnVybDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID0ganNvbkNvbXBbal0udXJsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0KGpzb25Db21wW2pdLCBqc29uQ29tcFtqXS5mdWxscGF0aCwgcmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hDYXNlKGNvbmRMaXN0KSB7XHJcbiAgICB2YXIgY29uZGl0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kTGlzdC5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBpZHggPSB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlLmZpbmRJbmRleCh4ID0+IHgucHJvcGVydHkgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS5wcm9wZXJ0eSk7XHJcbiAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiRVFcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID09IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFyIHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPT0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIk5FUVwiKSB7XHJcbiAgICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyICE9IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgIT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSAhPSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiR1RcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID4gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVEVcIikge1xyXG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID49IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFyIHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIkxUXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFyIHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPCB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTFRFXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8PSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhciB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDw9IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZGl0aW9uO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgRGVjcnlwdFN0cmluZyhjaGlwcGVyVGV4dDogc3RyaW5nLCBjaGlwcGVyS2V5OiBzdHJpbmcpIHtcclxuICAgIGlmIChcclxuICAgICAgY2hpcHBlcktleSA9PSB1bmRlZmluZWQgfHwgY2hpcHBlcktleS50cmltKCkgPT0gJycgfHxcclxuICAgICAgY2hpcHBlclRleHQgPT0gdW5kZWZpbmVkIHx8IGNoaXBwZXJUZXh0LnRyaW0oKSA9PSAnJ1xyXG4gICAgKSByZXR1cm4gY2hpcHBlclRleHQ7XHJcbiAgICB2YXIgY2hpcHBlcktleUFyciA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKGNoaXBwZXJLZXkpO1xyXG4gICAgdmFyIGl2ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTtcclxuICAgIHZhciBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChjaGlwcGVyVGV4dCwgY2hpcHBlcktleUFyciwgeyBpdjogaXYgfSk7XHJcbiAgICB2YXIgcGxhaW5UZXh0ID0gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcclxuICAgIHJldHVybiBwbGFpblRleHQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==