@dignite-ng/expand.dynamic-form 3.1.8 → 3.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @angular-eslint/component-selector */
2
- import { ChangeDetectorRef, Component, ElementRef, inject, Input, ViewChild } from '@angular/core';
2
+ import { ChangeDetectorRef, Component, ElementRef, inject, Input, ViewChild, } from '@angular/core';
3
3
  import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
4
4
  import { TreeConfig } from './tree-config';
5
5
  import { ToPinyinService } from '@dignite-ng/expand.core';
@@ -26,6 +26,8 @@ export class TreeConfigComponent {
26
26
  this.nodes = [];
27
27
  /**已展开的节点 */
28
28
  this.anExpandedNode = [];
29
+ /**是否全部展开 */
30
+ this.isAllExpanded = false;
29
31
  /**是否创建子节点 */
30
32
  this.isCreateChild = false;
31
33
  /**模态框状态 */
@@ -119,6 +121,48 @@ export class TreeConfigComponent {
119
121
  anExpandedNode.push(event.node.key);
120
122
  }
121
123
  this.anExpandedNode = anExpandedNode;
124
+ // 检查是否所有有子节点的节点都已展开
125
+ // const allKeys = this.getAllNodeKeys(this.nodes);
126
+ this.isAllExpanded = anExpandedNode.length > 0;
127
+ }
128
+ /**切换展开/收缩所有节点 */
129
+ toggleExpandAll() {
130
+ this.isAllExpanded = !this.isAllExpanded;
131
+ this.anExpandedNode = this.isAllExpanded ? this.getAllNodeKeys(this.nodes) : [];
132
+ if (!this.isAllExpanded) {
133
+ this.nodes = [...this.setExpanded(this.nodes, false)];
134
+ }
135
+ this.cdr.detectChanges();
136
+ }
137
+ //递归设置nodes中的expanded值 并且返回一个数组
138
+ setExpanded(nodes, expanded) {
139
+ for (const node of nodes) {
140
+ node.expanded = expanded;
141
+ if (node.children?.length) {
142
+ node.children = this.setExpanded(node.children, expanded);
143
+ }
144
+ }
145
+ return nodes;
146
+ }
147
+ /**获取所有有子节点的节点的key */
148
+ getAllNodeKeys(nodes) {
149
+ const keys = [];
150
+ for (const node of nodes) {
151
+ if (node.children?.length) {
152
+ keys.push(node.key);
153
+ keys.push(...this.getAllNodeKeys(node.children));
154
+ }
155
+ }
156
+ return keys;
157
+ }
158
+ /**检查是否有任何节点包含子节点 */
159
+ hasAnyNodeWithChildren() {
160
+ return this.getAllNodeKeys(this.nodes).length > 0;
161
+ }
162
+ /**更新展开状态 */
163
+ updateExpandedState() {
164
+ const allKeys = this.getAllNodeKeys(this.nodes);
165
+ this.isAllExpanded = allKeys.length > 0 && allKeys.every(key => this.anExpandedNode.includes(key));
122
166
  }
123
167
  /**生成GUID */
124
168
  generateGuid() {
@@ -196,6 +240,7 @@ export class TreeConfigComponent {
196
240
  }
197
241
  this.nodes = [...nodes];
198
242
  this.syncTreeOptionsFromNodes();
243
+ this.updateExpandedState();
199
244
  this.cdr.detectChanges();
200
245
  this.resetModal();
201
246
  }
@@ -233,6 +278,7 @@ export class TreeConfigComponent {
233
278
  this.deleteNode(this.nodes, node.key);
234
279
  this.nodes = [...this.nodes];
235
280
  this.syncTreeOptionsFromNodes();
281
+ this.updateExpandedState();
236
282
  this.cdr.detectChanges();
237
283
  }
238
284
  /**递归删除节点 */
@@ -460,7 +506,8 @@ export class TreeConfigComponent {
460
506
  nodes.splice(insertIndex, 0, newNode);
461
507
  return true;
462
508
  }
463
- if (nodes[i].children?.length && this.insertNodeBeside(nodes[i].children, targetKey, newNode, position)) {
509
+ if (nodes[i].children?.length &&
510
+ this.insertNodeBeside(nodes[i].children, targetKey, newNode, position)) {
464
511
  return true;
465
512
  }
466
513
  }
@@ -511,11 +558,11 @@ export class TreeConfigComponent {
511
558
  });
512
559
  }
513
560
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: TreeConfigComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ToPinyinService }], target: i0.ɵɵFactoryTarget.Component }); }
514
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: TreeConfigComponent, selector: "df-tree-config", inputs: { type: "type", selected: "selected", Entity: "Entity" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }, { propertyName: "nodeModalSubmit", first: true, predicate: ["nodeModalSubmit"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"formEntity\">\r\n <div formGroupName=\"formConfiguration\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{'AbpDynamicForm::Nodes' | abpLocalization}}</label>\r\n <button class=\"btn btn-sm btn-dark soft ms-2 float-end\" type=\"button\"\r\n (click.stop)=\"addNodeBtn()\">{{'AbpDynamicForm::AddNode' |\r\n abpLocalization}}</button>\r\n <abp-tree [nodes]=\"nodes\" [checkable]=\"false\" (dropOver)=\"dropOver($event)\"\r\n (nzExpandChange)=\"nzExpandChange($event)\" [expandedKeys]=\"anExpandedNode\" [draggable]=\"true\">\r\n <ng-template #menu let-node>\r\n <button ngbDropdownItem (click.stop)=\"editItemBtn(node)\"><i\r\n class=\" me-1 fa fa-pencil\"></i>{{'AbpUi::Edit' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"createChildItemBtn(node)\"><i\r\n class=\" me-1 fa fa-plus\"></i>{{'AbpDynamicForm::AddSubNode' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"deleteMenuItemBtn(node)\"><i\r\n class=\" me-1 fa fa-remove\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}</button>\r\n </ng-template>\r\n <ng-template abpTreeNodeTemplate let-node>\r\n <div (click)=\"toggleNodeChecked($event, node)\">\r\n <input type=\"checkbox\" [checked]=\"node.origin?.isChecked\"\r\n [attr.data-indeterminate]=\"hasChildrenChecked(node)\" class=\"form-check-input me-2\">\r\n {{node.title}}\r\n </div>\r\n </ng-template>\r\n <ng-template abpTreeExpandedIconTemplate let-node let-origin=\"origin\">\r\n <i aria-hidden=\"true\" *ngIf=\"node.children.length>0\">\r\n <ng-container *ngTemplateOutlet=\"node.isExpanded ? minusIcon : plusIcon\"></ng-container></i>\r\n </ng-template>\r\n\r\n <ng-template #minusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z\" />\r\n </svg>\r\n </ng-template>\r\n\r\n <ng-template #plusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z\" />\r\n </svg>\r\n </ng-template>\r\n </abp-tree>\r\n <div *ngIf=\"nodes.length === 0\" class=\"text-muted mt-2\">{{'AbpDynamicForm::PleaseAddNode' |\r\n abpLocalization}}</div>\r\n <div *ngIf=\"TreeOptions?.errors?.required\" class=\"invalid-feedback \">\r\n {{'AbpValidation::ThisFieldIsRequired.' | abpLocalization: 'Nodes'}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMultiple($event)\"\r\n formControlName=\"TreeView.Multiple\" id=\"Multiple\">\r\n <label class=\"form-check-label\" for=\"Multiple\">\r\n {{'AbpDynamicForm::Multiple' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\r\n #submitclick></button>\r\n </div>\r\n</form>\r\n\r\n\r\n<!-- [options]=\"{ size: CurrentSelectionTableControlName==='Matrix'?'xl':'' ,scrollable:false }\" (visibleChange)=\"tableSelectVisibleChange($event)\"-->\r\n<abp-modal [(visible)]=\"isVisible\" [busy]=\"modalBusy\">\r\n <ng-template #abpHeader>\r\n <h3>{{isCreateChild ? ('AbpDynamicForm::AddSubNode' | abpLocalization) : (selectTree ? ('AbpUi::Edit' |\r\n abpLocalization) : ('Cms::New' | abpLocalization))}}</h3>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <ng-template #loaderRef>\r\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\r\n </ng-template>\r\n <ng-container *ngIf=\"nodeForm; else loaderRef\">\r\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"nodeForm\" (submit)=\"createOrEditSave()\">\r\n <button type=\"submit\" #nodeModalSubmit style=\"display: none\"></button>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::NodeItemText' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" [placeholder]=\"\"\r\n (blur)=\"disPlayNameInputBlur($event)\" />\r\n </div>\r\n <!-- <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::SelectListItemValue' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"key\" [placeholder]=\"\" />\r\n </div> -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" formControlName=\"isChecked\" id=\"isSelected\">\r\n <label class=\"form-check-label\" for=\"isSelected\">\r\n {{'AbpDynamicForm::Selected' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"!nodeForm.valid\"\r\n (abpClick)=\"nodeModalSubmit.nativeElement.click()\">{{'AbpUi::Save' |\r\n abpLocalization}}</abp-button>\r\n </ng-template>\r\n</abp-modal>", styles: ["input[type=checkbox]:indeterminate{opacity:.5}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i4.InitDirective, selector: "[abpInit]", outputs: ["abpInit"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i6.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i6.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i7.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i7.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i8.TreeNodeTemplateDirective, selector: "[abpTreeNodeTemplate],[abp-tree-node-template]" }, { kind: "directive", type: i8.ExpandedIconTemplateDirective, selector: "[abpTreeExpandedIconTemplate],[abp-tree-expanded-icon-template]" }, { kind: "component", type: i8.TreeComponent, selector: "abp-tree", inputs: ["noAnimation", "draggable", "checkable", "checkStrictly", "checkedKeys", "nodes", "expandedKeys", "selectedNode", "changeCheckboxWithNode", "isNodeSelected", "beforeDrop"], outputs: ["checkedKeysChange", "expandedKeysChange", "selectedNodeChange", "dropOver", "nzExpandChange"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
561
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: TreeConfigComponent, selector: "df-tree-config", inputs: { type: "type", selected: "selected", Entity: "Entity" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }, { propertyName: "nodeModalSubmit", first: true, predicate: ["nodeModalSubmit"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"formEntity\">\r\n <div formGroupName=\"formConfiguration\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label \">{{'AbpDynamicForm::Nodes' | abpLocalization}}</label>\r\n <button *ngIf=\"hasAnyNodeWithChildren()\" class=\"btn btn-sm btn-light ms-2\"\r\n style=\"--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;\" type=\"button\"\r\n (click.stop)=\"toggleExpandAll()\">\r\n <i class=\"fa\" [ngClass]=\"isAllExpanded ? 'fa-compress' : 'fa-expand'\"></i>\r\n </button>\r\n <button class=\"btn btn-sm btn-dark soft ms-2 float-end\" type=\"button\"\r\n (click.stop)=\"addNodeBtn()\">{{'AbpDynamicForm::AddNode' |\r\n abpLocalization}}</button>\r\n <div class=\"border p-2 rounded-2 mt-2\">\r\n <abp-tree class=\"mb-2\" [nodes]=\"nodes\" [checkable]=\"false\" (dropOver)=\"dropOver($event)\"\r\n (nzExpandChange)=\"nzExpandChange($event)\" [expandedKeys]=\"anExpandedNode\" [draggable]=\"true\">\r\n <ng-template #menu let-node>\r\n <button ngbDropdownItem (click.stop)=\"editItemBtn(node)\"><i\r\n class=\" me-1 fa fa-pencil\"></i>{{'AbpUi::Edit' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"createChildItemBtn(node)\"><i\r\n class=\" me-1 fa fa-plus\"></i>{{'AbpDynamicForm::AddSubNode' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"deleteMenuItemBtn(node)\"><i\r\n class=\" me-1 fa fa-remove\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}</button>\r\n </ng-template>\r\n <ng-template abpTreeNodeTemplate let-node>\r\n <div (click)=\"toggleNodeChecked($event, node)\">\r\n <input type=\"checkbox\" [checked]=\"node.origin?.isChecked\"\r\n [attr.data-indeterminate]=\"hasChildrenChecked(node)\" class=\"form-check-input me-2\">\r\n {{node.title}}\r\n </div>\r\n </ng-template>\r\n <ng-template abpTreeExpandedIconTemplate let-node let-origin=\"origin\">\r\n <i aria-hidden=\"true\" *ngIf=\"node.children.length>0\">\r\n <ng-container *ngTemplateOutlet=\"node.isExpanded ? minusIcon : plusIcon\"></ng-container></i>\r\n </ng-template>\r\n\r\n <ng-template #minusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z\" />\r\n </svg>\r\n </ng-template>\r\n\r\n <ng-template #plusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z\" />\r\n </svg>\r\n </ng-template>\r\n </abp-tree>\r\n <div *ngIf=\"nodes.length === 0\" class=\"text-muted \">{{'AbpDynamicForm::PleaseAddNode' |\r\n abpLocalization}}</div>\r\n </div>\r\n <div *ngIf=\"TreeOptions?.errors?.required\" class=\"invalid-feedback \">\r\n {{'AbpValidation::ThisFieldIsRequired.' | abpLocalization: 'Nodes'}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMultiple($event)\"\r\n formControlName=\"TreeView.Multiple\" id=\"Multiple\">\r\n <label class=\"form-check-label\" for=\"Multiple\">\r\n {{'AbpDynamicForm::Multiple' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\r\n #submitclick></button>\r\n </div>\r\n</form>\r\n\r\n\r\n<!-- [options]=\"{ size: CurrentSelectionTableControlName==='Matrix'?'xl':'' ,scrollable:false }\" (visibleChange)=\"tableSelectVisibleChange($event)\"-->\r\n<abp-modal [(visible)]=\"isVisible\" [busy]=\"modalBusy\">\r\n <ng-template #abpHeader>\r\n <h3>{{isCreateChild ? ('AbpDynamicForm::AddSubNode' | abpLocalization) : (selectTree ? ('AbpUi::Edit' |\r\n abpLocalization) : ('Cms::New' | abpLocalization))}}</h3>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <ng-template #loaderRef>\r\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\r\n </ng-template>\r\n <ng-container *ngIf=\"nodeForm; else loaderRef\">\r\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"nodeForm\" (submit)=\"createOrEditSave()\">\r\n <button type=\"submit\" #nodeModalSubmit style=\"display: none\"></button>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::NodeItemText' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" [placeholder]=\"\"\r\n (blur)=\"disPlayNameInputBlur($event)\" />\r\n </div>\r\n <!-- <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::SelectListItemValue' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"key\" [placeholder]=\"\" />\r\n </div> -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" formControlName=\"isChecked\" id=\"isSelected\">\r\n <label class=\"form-check-label\" for=\"isSelected\">\r\n {{'AbpDynamicForm::Selected' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"!nodeForm.valid\"\r\n (abpClick)=\"nodeModalSubmit.nativeElement.click()\">{{'AbpUi::Save' |\r\n abpLocalization}}</abp-button>\r\n </ng-template>\r\n</abp-modal>", styles: ["input[type=checkbox]:indeterminate{opacity:.5}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i4.InitDirective, selector: "[abpInit]", outputs: ["abpInit"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i6.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i6.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i7.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i7.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i8.TreeNodeTemplateDirective, selector: "[abpTreeNodeTemplate],[abp-tree-node-template]" }, { kind: "directive", type: i8.ExpandedIconTemplateDirective, selector: "[abpTreeExpandedIconTemplate],[abp-tree-expanded-icon-template]" }, { kind: "component", type: i8.TreeComponent, selector: "abp-tree", inputs: ["noAnimation", "draggable", "checkable", "checkStrictly", "checkedKeys", "nodes", "expandedKeys", "selectedNode", "changeCheckboxWithNode", "isNodeSelected", "beforeDrop"], outputs: ["checkedKeysChange", "expandedKeysChange", "selectedNodeChange", "dropOver", "nzExpandChange"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
515
562
  }
516
563
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: TreeConfigComponent, decorators: [{
517
564
  type: Component,
518
- args: [{ selector: 'df-tree-config', template: "<form [formGroup]=\"formEntity\">\r\n <div formGroupName=\"formConfiguration\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{'AbpDynamicForm::Nodes' | abpLocalization}}</label>\r\n <button class=\"btn btn-sm btn-dark soft ms-2 float-end\" type=\"button\"\r\n (click.stop)=\"addNodeBtn()\">{{'AbpDynamicForm::AddNode' |\r\n abpLocalization}}</button>\r\n <abp-tree [nodes]=\"nodes\" [checkable]=\"false\" (dropOver)=\"dropOver($event)\"\r\n (nzExpandChange)=\"nzExpandChange($event)\" [expandedKeys]=\"anExpandedNode\" [draggable]=\"true\">\r\n <ng-template #menu let-node>\r\n <button ngbDropdownItem (click.stop)=\"editItemBtn(node)\"><i\r\n class=\" me-1 fa fa-pencil\"></i>{{'AbpUi::Edit' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"createChildItemBtn(node)\"><i\r\n class=\" me-1 fa fa-plus\"></i>{{'AbpDynamicForm::AddSubNode' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"deleteMenuItemBtn(node)\"><i\r\n class=\" me-1 fa fa-remove\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}</button>\r\n </ng-template>\r\n <ng-template abpTreeNodeTemplate let-node>\r\n <div (click)=\"toggleNodeChecked($event, node)\">\r\n <input type=\"checkbox\" [checked]=\"node.origin?.isChecked\"\r\n [attr.data-indeterminate]=\"hasChildrenChecked(node)\" class=\"form-check-input me-2\">\r\n {{node.title}}\r\n </div>\r\n </ng-template>\r\n <ng-template abpTreeExpandedIconTemplate let-node let-origin=\"origin\">\r\n <i aria-hidden=\"true\" *ngIf=\"node.children.length>0\">\r\n <ng-container *ngTemplateOutlet=\"node.isExpanded ? minusIcon : plusIcon\"></ng-container></i>\r\n </ng-template>\r\n\r\n <ng-template #minusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z\" />\r\n </svg>\r\n </ng-template>\r\n\r\n <ng-template #plusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z\" />\r\n </svg>\r\n </ng-template>\r\n </abp-tree>\r\n <div *ngIf=\"nodes.length === 0\" class=\"text-muted mt-2\">{{'AbpDynamicForm::PleaseAddNode' |\r\n abpLocalization}}</div>\r\n <div *ngIf=\"TreeOptions?.errors?.required\" class=\"invalid-feedback \">\r\n {{'AbpValidation::ThisFieldIsRequired.' | abpLocalization: 'Nodes'}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMultiple($event)\"\r\n formControlName=\"TreeView.Multiple\" id=\"Multiple\">\r\n <label class=\"form-check-label\" for=\"Multiple\">\r\n {{'AbpDynamicForm::Multiple' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\r\n #submitclick></button>\r\n </div>\r\n</form>\r\n\r\n\r\n<!-- [options]=\"{ size: CurrentSelectionTableControlName==='Matrix'?'xl':'' ,scrollable:false }\" (visibleChange)=\"tableSelectVisibleChange($event)\"-->\r\n<abp-modal [(visible)]=\"isVisible\" [busy]=\"modalBusy\">\r\n <ng-template #abpHeader>\r\n <h3>{{isCreateChild ? ('AbpDynamicForm::AddSubNode' | abpLocalization) : (selectTree ? ('AbpUi::Edit' |\r\n abpLocalization) : ('Cms::New' | abpLocalization))}}</h3>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <ng-template #loaderRef>\r\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\r\n </ng-template>\r\n <ng-container *ngIf=\"nodeForm; else loaderRef\">\r\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"nodeForm\" (submit)=\"createOrEditSave()\">\r\n <button type=\"submit\" #nodeModalSubmit style=\"display: none\"></button>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::NodeItemText' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" [placeholder]=\"\"\r\n (blur)=\"disPlayNameInputBlur($event)\" />\r\n </div>\r\n <!-- <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::SelectListItemValue' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"key\" [placeholder]=\"\" />\r\n </div> -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" formControlName=\"isChecked\" id=\"isSelected\">\r\n <label class=\"form-check-label\" for=\"isSelected\">\r\n {{'AbpDynamicForm::Selected' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"!nodeForm.valid\"\r\n (abpClick)=\"nodeModalSubmit.nativeElement.click()\">{{'AbpUi::Save' |\r\n abpLocalization}}</abp-button>\r\n </ng-template>\r\n</abp-modal>", styles: ["input[type=checkbox]:indeterminate{opacity:.5}\n"] }]
565
+ args: [{ selector: 'df-tree-config', template: "<form [formGroup]=\"formEntity\">\r\n <div formGroupName=\"formConfiguration\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label \">{{'AbpDynamicForm::Nodes' | abpLocalization}}</label>\r\n <button *ngIf=\"hasAnyNodeWithChildren()\" class=\"btn btn-sm btn-light ms-2\"\r\n style=\"--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;\" type=\"button\"\r\n (click.stop)=\"toggleExpandAll()\">\r\n <i class=\"fa\" [ngClass]=\"isAllExpanded ? 'fa-compress' : 'fa-expand'\"></i>\r\n </button>\r\n <button class=\"btn btn-sm btn-dark soft ms-2 float-end\" type=\"button\"\r\n (click.stop)=\"addNodeBtn()\">{{'AbpDynamicForm::AddNode' |\r\n abpLocalization}}</button>\r\n <div class=\"border p-2 rounded-2 mt-2\">\r\n <abp-tree class=\"mb-2\" [nodes]=\"nodes\" [checkable]=\"false\" (dropOver)=\"dropOver($event)\"\r\n (nzExpandChange)=\"nzExpandChange($event)\" [expandedKeys]=\"anExpandedNode\" [draggable]=\"true\">\r\n <ng-template #menu let-node>\r\n <button ngbDropdownItem (click.stop)=\"editItemBtn(node)\"><i\r\n class=\" me-1 fa fa-pencil\"></i>{{'AbpUi::Edit' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"createChildItemBtn(node)\"><i\r\n class=\" me-1 fa fa-plus\"></i>{{'AbpDynamicForm::AddSubNode' |\r\n abpLocalization}}</button>\r\n <button ngbDropdownItem (click.stop)=\"deleteMenuItemBtn(node)\"><i\r\n class=\" me-1 fa fa-remove\"></i>{{'AbpUi::Delete' |\r\n abpLocalization}}</button>\r\n </ng-template>\r\n <ng-template abpTreeNodeTemplate let-node>\r\n <div (click)=\"toggleNodeChecked($event, node)\">\r\n <input type=\"checkbox\" [checked]=\"node.origin?.isChecked\"\r\n [attr.data-indeterminate]=\"hasChildrenChecked(node)\" class=\"form-check-input me-2\">\r\n {{node.title}}\r\n </div>\r\n </ng-template>\r\n <ng-template abpTreeExpandedIconTemplate let-node let-origin=\"origin\">\r\n <i aria-hidden=\"true\" *ngIf=\"node.children.length>0\">\r\n <ng-container *ngTemplateOutlet=\"node.isExpanded ? minusIcon : plusIcon\"></ng-container></i>\r\n </ng-template>\r\n\r\n <ng-template #minusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z\" />\r\n </svg>\r\n </ng-template>\r\n\r\n <ng-template #plusIcon>\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n fill-rule=\"evenodd\" clip-rule=\"evenodd\">\r\n <path\r\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z\" />\r\n </svg>\r\n </ng-template>\r\n </abp-tree>\r\n <div *ngIf=\"nodes.length === 0\" class=\"text-muted \">{{'AbpDynamicForm::PleaseAddNode' |\r\n abpLocalization}}</div>\r\n </div>\r\n <div *ngIf=\"TreeOptions?.errors?.required\" class=\"invalid-feedback \">\r\n {{'AbpValidation::ThisFieldIsRequired.' | abpLocalization: 'Nodes'}}\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" (change)=\"toggleMultiple($event)\"\r\n formControlName=\"TreeView.Multiple\" id=\"Multiple\">\r\n <label class=\"form-check-label\" for=\"Multiple\">\r\n {{'AbpDynamicForm::Multiple' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\r\n #submitclick></button>\r\n </div>\r\n</form>\r\n\r\n\r\n<!-- [options]=\"{ size: CurrentSelectionTableControlName==='Matrix'?'xl':'' ,scrollable:false }\" (visibleChange)=\"tableSelectVisibleChange($event)\"-->\r\n<abp-modal [(visible)]=\"isVisible\" [busy]=\"modalBusy\">\r\n <ng-template #abpHeader>\r\n <h3>{{isCreateChild ? ('AbpDynamicForm::AddSubNode' | abpLocalization) : (selectTree ? ('AbpUi::Edit' |\r\n abpLocalization) : ('Cms::New' | abpLocalization))}}</h3>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <ng-template #loaderRef>\r\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\r\n </ng-template>\r\n <ng-container *ngIf=\"nodeForm; else loaderRef\">\r\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"nodeForm\" (submit)=\"createOrEditSave()\">\r\n <button type=\"submit\" #nodeModalSubmit style=\"display: none\"></button>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::NodeItemText' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"title\" [placeholder]=\"\"\r\n (blur)=\"disPlayNameInputBlur($event)\" />\r\n </div>\r\n <!-- <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'AbpDynamicForm::SelectListItemValue' | abpLocalization }}</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"key\" [placeholder]=\"\" />\r\n </div> -->\r\n <div class=\"mb-3\">\r\n <div class=\"form-check form-check-inline\">\r\n <input class=\"form-check-input\" type=\"checkbox\" formControlName=\"isChecked\" id=\"isSelected\">\r\n <label class=\"form-check-label\" for=\"isSelected\">\r\n {{'AbpDynamicForm::Selected' | abpLocalization}}\r\n </label>\r\n </div>\r\n </div>\r\n </form>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"!nodeForm.valid\"\r\n (abpClick)=\"nodeModalSubmit.nativeElement.click()\">{{'AbpUi::Save' |\r\n abpLocalization}}</abp-button>\r\n </ng-template>\r\n</abp-modal>", styles: ["input[type=checkbox]:indeterminate{opacity:.5}\n"] }]
519
566
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ToPinyinService }], propDecorators: { type: [{
520
567
  type: Input
521
568
  }], selected: [{
@@ -529,4 +576,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
529
576
  type: ViewChild,
530
577
  args: ['nodeModalSubmit', { static: false }]
531
578
  }] } });
532
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBZSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7QUFPeEQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUFvQixFQUFlLEVBQVMsZUFBK0I7UUFBdkQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQTZCbkUsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBOER4QyxZQUFZO1FBQ1oscUJBQXFCO1FBQ3JCLHlGQUF5RjtRQUN6RiwrQ0FBK0M7UUFDL0MsSUFBSTtRQUVKLFlBQVk7UUFDWixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBRWxCLFlBQVk7UUFDWixtQkFBYyxHQUFVLEVBQUUsQ0FBQztRQWMzQixhQUFhO1FBQ2Isa0JBQWEsR0FBa0IsS0FBSyxDQUFDO1FBQ3JD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TUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLE1BQU0sQ0FBQztZQUM3RSxRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBOWhCVSxtQkFBbUI7a0dBQW5CLG1CQUFtQix1VkNYaEMsNDNOQTRHWTs7MkZEakdDLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7OEdBU2YsSUFBSTtzQkFEZCxLQUFLO2dCQVFLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBUUssTUFBTTtzQkFEaEIsS0FBSztnQkFXc0MsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWtHTyxlQUFlO3NCQUEvRCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLCBBZnRlclZpZXdDaGVja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRyZWVDb25maWcgfSBmcm9tICcuL3RyZWUtY29uZmlnJztcclxuaW1wb3J0IHtUb1BpbnlpblNlcnZpY2V9IGZyb20gJ0BkaWduaXRlLW5nL2V4cGFuZC5jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGYtdHJlZS1jb25maWcnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90cmVlLWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHJlZS1jb25maWcuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyZWVDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixwcml2YXRlIHRvUGlueWluU2VydmljZTpUb1BpbnlpblNlcnZpY2UpIHt9XHJcbiAgLyoq6KGo5Y2V5o6n5Lu257G75Z6LICovXHJcbiAgX3R5cGU6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgdHlwZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3R5cGUgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6YCJ5oup55qE6KGo5Y2V5L+h5oGvICovXHJcbiAgX3NlbGVjdGVkOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6KGo5Y2V5a6e5L2TICovXHJcbiAgZm9ybUVudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBFbnRpdHkodjogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLmZvcm1FbnRpdHkgPSB2O1xyXG4gICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgfVxyXG4gIGdldCBmb3JtQ29uZmlndXJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1FbnRpdHk/LmdldCgnZm9ybUNvbmZpZ3VyYXRpb24nKSBhcyBGb3JtR3JvdXA7XHJcbiAgfVxyXG4gIGdldCBUcmVlT3B0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uPy5jb250cm9sc1snVHJlZVZpZXcuTm9kZXMnXSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XHJcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtRW50aXR5ICYmIHRoaXMuX3R5cGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFmdGVySW5pdCgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgdGhpcy5mb3JtRW50aXR5Py5zZXRDb250cm9sKCdmb3JtQ29uZmlndXJhdGlvbicsIHRoaXMuZmIuZ3JvdXAobmV3IFRyZWVDb25maWcoKSkpO1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKV0pO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIOaJi+WKqOinpuWPkeWPmOabtOajgOa1i1xyXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrPy5uYXRpdmVFbGVtZW50Py5jbGljaygpO1xyXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgJiYgdGhpcy5fc2VsZWN0ZWQuZm9ybUNvbnRyb2xOYW1lID09IHRoaXMuX3R5cGUpIHtcclxuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvblsnVHJlZVZpZXcuTm9kZXMnXTtcclxuICAgICAgICBpZiAodHJlZU5vZGVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXModHJlZU5vZGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICAgICAgLy8gZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uWydUcmVlVmlldy5Ob2RlcyddKSB7XHJcbiAgICAgICAgLy8gICBmb3IgKGNvbnN0IGtleSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50W2tleV07XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNhcGl0YWxpemVkS2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpO1xyXG4gICAgICAgIC8vICAgICBlbGVtZW50W2NhcGl0YWxpemVkS2V5XSA9IGl0ZW07XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAuLi50aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvbixcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5b2T6YCJ5oup6aG555qE5paH5pys5Y+R55Sf5Y+Y5YyW5pe277yM5pu05paw5a+55bqU55qE5YC8XHJcbiAgICogQHBhcmFtIGV2ZW50IOi+k+WFpeS6i+S7tuWvueixoVxyXG4gICAqIEBwYXJhbSBpbmRleCDpgInmi6npobnnmoTntKLlvJXkvY3nva5cclxuICAgKiBAZGVzY3JpcHRpb24g5aaC5p6c6YCJ5oup6aG55bey5pyJVmFsdWXlgLzliJnkuI3lpITnkIbvvIzlkKbliJnlsIbkuK3mlofmlofmnKzovazmjaLkuLrmi7zpn7PkvZzkuLpWYWx1ZeWAvFxyXG4gICAqL1xyXG4gIC8vIHRleHRDaGFuZ2UoZXZlbnQsIGluZGV4KSB7XHJcbiAgLy8gICBjb25zdCBUcmVlT3B0aW9uc0l0ZW0gPSB0aGlzLlRyZWVPcHRpb25zLmF0KGluZGV4KTtcclxuICAvLyAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIC8vICAgaWYgKFRyZWVPcHRpb25zSXRlbS5nZXQoJ1ZhbHVlJyk/LnZhbHVlKSByZXR1cm47XHJcbiAgLy8gICBUcmVlT3B0aW9uc0l0ZW0ucGF0Y2hWYWx1ZSh7XHJcbiAgLy8gICAgIFZhbHVlOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG4gICAvKirlrZfmrrXmoIfnrb5pbnB1dOWkseWOu+agh+eCueeUn+aIkOWtl+auteWQjeWtlyAqL1xyXG4gIGRpc1BsYXlOYW1lSW5wdXRCbHVyKGV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMubm9kZUZvcm0pIHJldHVybjtcclxuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3QgcGlueWluID0gdGhpcy50b1BpbnlpblNlcnZpY2UuZ2V0KHZhbHVlKTtcclxuICAgIGNvbnN0IG5hbWVJbnB1dCA9IHRoaXMubm9kZUZvcm0uZ2V0KCdrZXknKTtcclxuICAgIGlmICghbmFtZUlucHV0IHx8IG5hbWVJbnB1dC52YWx1ZSkgcmV0dXJuO1xyXG4gICAgbmFtZUlucHV0LnBhdGNoVmFsdWUocGlueWluKTtcclxuICB9XHJcblxyXG4gIC8qKuiwg+aVtOihqOagvOS9jee9riAqL1xyXG4gIC8vIGRyb3AoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuVHJlZU9wdGlvbnMuY29udHJvbHMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XHJcbiAgLy8gICB0aGlzLlRyZWVPcHRpb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAvLyB9XHJcblxyXG4gIC8qKnRyZWXmlbDmja4gKi9cclxuICBub2RlczogYW55W10gPSBbXTtcclxuXHJcbiAgLyoq5bey5bGV5byA55qE6IqC54K5ICovXHJcbiAgYW5FeHBhbmRlZE5vZGU6IGFueVtdID0gW107XHJcblxyXG4gIC8qKueCueWHu+WxleW8gOagkeiKgueCueWbvuagh+inpuWPkSAqL1xyXG4gIG56RXhwYW5kQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBhbkV4cGFuZGVkTm9kZSA9IHRoaXMuYW5FeHBhbmRlZE5vZGU7XHJcbiAgICBpZiAoYW5FeHBhbmRlZE5vZGUuaW5jbHVkZXMoZXZlbnQubm9kZS5rZXkpKSB7XHJcbiAgICAgIGFuRXhwYW5kZWROb2RlID0gYW5FeHBhbmRlZE5vZGUuZmlsdGVyKGtleSA9PiBrZXkgIT09IGV2ZW50Lm5vZGUua2V5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFuRXhwYW5kZWROb2RlLnB1c2goZXZlbnQubm9kZS5rZXkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbkV4cGFuZGVkTm9kZSA9IGFuRXhwYW5kZWROb2RlO1xyXG4gIH1cclxuICAvKirmraPlnKjmk43kvZznmoToioLngrnpobkgKi9cclxuICBzZWxlY3RUcmVlOiBhbnk7XHJcbiAgLyoq5piv5ZCm5Yib5bu65a2Q6IqC54K5ICovXHJcbiAgaXNDcmVhdGVDaGlsZDogYm9vbGVhbiB8IGFueSA9IGZhbHNlO1xyXG4gIC8qKuaooeaAgeahhueKtuaAgSAqL1xyXG4gIGlzVmlzaWJsZTogYm9vbGVhbiB8IGFueSA9IGZhbHNlO1xyXG5cclxuICAvKirnlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cclxuICBtb2RhbEJ1c3k6IGJvb2xlYW4gfCBhbnkgPSBmYWxzZTtcclxuICAvKirliJvlu7rooajljZUgKi9cclxuICBub2RlRm9ybTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKirooajljZXmjqfku7bmqKHmnb8t5Yqo5oCB6LWL5YC86KGo5Y2V5o6n5Lu2ICovXHJcbiAgQFZpZXdDaGlsZCgnbm9kZU1vZGFsU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIG5vZGVNb2RhbFN1Ym1pdDogRWxlbWVudFJlZjtcclxuXHJcbiAgLyoq55Sf5oiQR1VJRCAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVHdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxyXG4gIH1cclxuXHJcbiAgLyoq5Yib5bu66IqC54K5ICovXHJcbiAgYWRkTm9kZUJ0bigpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNDcmVhdGVDaGlsZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RUcmVlID0gbnVsbDtcclxuICAgIHRoaXMubm9kZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdGl0bGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGtleTogW3RoaXMuZ2VuZXJhdGVHdWlkKCksIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtmYWxzZV0sXHJcbiAgICAgIGNoaWxkcmVuOiBuZXcgRm9ybUFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKirnvJbovpHoioLngrkgKi9cclxuICBlZGl0SXRlbUJ0bihub2RlOiBhbnkpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNDcmVhdGVDaGlsZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RUcmVlID0gbm9kZTtcclxuICAgIHRoaXMubm9kZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdGl0bGU6IFtub2RlLnRpdGxlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAga2V5OiBbbm9kZS5rZXksIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtub2RlLm9yaWdpbj8uaXNDaGVja2VkID8/IGZhbHNlXSxcclxuICAgICAgY2hpbGRyZW46IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKuWIm+W7uuWtkOiKgueCuSAqL1xyXG4gIGNyZWF0ZUNoaWxkSXRlbUJ0bihub2RlOiBhbnkpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNDcmVhdGVDaGlsZCA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdFRyZWUgPSBub2RlO1xyXG4gICAgdGhpcy5ub2RlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0aXRsZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAga2V5OiBbdGhpcy5nZW5lcmF0ZUd1aWQoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW2ZhbHNlXSxcclxuICAgICAgY2hpbGRyZW46IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKumHjee9ruaooeaAgeahhiAqL1xyXG4gIHJlc2V0TW9kYWwoKSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0NyZWF0ZUNoaWxkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdFRyZWUgPSBudWxsO1xyXG4gIH1cclxuICAvKirliJvlu7rnvJbovpHkv53lrZggKi9cclxuICBjcmVhdGVPckVkaXRTYXZlKCkge1xyXG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5ub2RlRm9ybTtcclxuICAgIGNvbnN0IHsgc2VsZWN0VHJlZSwgaXNDcmVhdGVDaGlsZCwgbm9kZXMsIGFuRXhwYW5kZWROb2RlIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24uY29udHJvbHNbJ1RyZWVWaWV3Lk11bHRpcGxlJ10gYXMgRm9ybUNvbnRyb2w7XHJcblxyXG4gICAgaWYgKHNlbGVjdFRyZWUpIHtcclxuICAgICAgaWYgKGlzQ3JlYXRlQ2hpbGQpIHtcclxuICAgICAgICAvLyDliJvlu7rlrZDoioLngrlcclxuICAgICAgICB0aGlzLmFkZENoaWxkTm9kZShub2Rlcywgc2VsZWN0VHJlZS5rZXksIHZhbHVlKTtcclxuICAgICAgICAvLyDoh6rliqjlsZXlvIDniLboioLngrlcclxuICAgICAgICBpZiAoIWFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKHNlbGVjdFRyZWUua2V5KSkge1xyXG4gICAgICAgICAgdGhpcy5hbkV4cGFuZGVkTm9kZSA9IFsuLi5hbkV4cGFuZGVkTm9kZSwgc2VsZWN0VHJlZS5rZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDnvJbovpHoioLngrlcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGUobm9kZXMsIHNlbGVjdFRyZWUua2V5LCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWIm+W7uuagueiKgueCuVxyXG4gICAgICBub2Rlcy5wdXNoKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDljZXpgInmqKHlvI/kuIvvvIzlpoLmnpzlvZPliY3oioLngrnooqvpgInkuK3vvIzmuIXpmaTlhbbku5boioLngrnnmoTpgInkuK3nirbmgIFcclxuICAgIGlmICghaXNNdWx0aXBsZS52YWx1ZSAmJiB2YWx1ZS5pc0NoZWNrZWQpIHtcclxuICAgICAgdGhpcy5jbGVhckFsbENoZWNrZWQobm9kZXMpO1xyXG4gICAgICB0aGlzLnNldE5vZGVDaGVja2VkT25seShub2RlcywgdmFsdWUua2V5LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnJlc2V0TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIC8qKumAkuW9kua3u+WKoOWtkOiKgueCuSAqL1xyXG4gIHByaXZhdGUgYWRkQ2hpbGROb2RlKG5vZGVzOiBhbnlbXSwgcGFyZW50S2V5OiBzdHJpbmcsIG5ld05vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gcGFyZW50S2V5KSB7XHJcbiAgICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKSBub2RlLmNoaWxkcmVuID0gW107XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5hZGRDaGlsZE5vZGUobm9kZS5jaGlsZHJlbiwgcGFyZW50S2V5LCBuZXdOb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLmm7TmlrDoioLngrkgKi9cclxuICBwcml2YXRlIHVwZGF0ZU5vZGUobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZywgdXBkYXRlZERhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZS50aXRsZSA9IHVwZGF0ZWREYXRhLnRpdGxlO1xyXG4gICAgICAgIG5vZGUuaXNDaGVja2VkID0gdXBkYXRlZERhdGEuaXNDaGVja2VkO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy51cGRhdGVOb2RlKG5vZGUuY2hpbGRyZW4sIHRhcmdldEtleSwgdXBkYXRlZERhdGEpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuWIoOmZpOiKgueCuSAqL1xyXG4gIGRlbGV0ZU1lbnVJdGVtQnRuKG5vZGU6IGFueSkge1xyXG4gICAgdGhpcy5kZWxldGVOb2RlKHRoaXMubm9kZXMsIG5vZGUua2V5KTtcclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgICB0aGlzLnN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5Yig6Zmk6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBkZWxldGVOb2RlKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG5vZGVzW2ldLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuZGVsZXRlTm9kZShub2Rlc1tpXS5jaGlsZHJlbiwgdGFyZ2V0S2V5KSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirlkIzmraUgbm9kZXMg5YiwIFRyZWVPcHRpb25zICovXHJcbiAgcHJpdmF0ZSBzeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKSB7XHJcbiAgICB0aGlzLlRyZWVPcHRpb25zLmNsZWFyKCk7XHJcbiAgICBjb25zdCBjbGVhbmVkTm9kZXMgPSB0aGlzLm5vZGVzLm1hcChub2RlID0+IHRoaXMuY2xlYW5Ob2RlKG5vZGUpKTtcclxuICAgIGNsZWFuZWROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zLnB1c2godGhpcy5jcmVhdGVUcmVlRm9ybUdyb3VwKG5vZGUpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5Yib5bu65qCR6KGo5Y2V57uEICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVUcmVlRm9ybUdyb3VwKG5vZGU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5ldyBGb3JtQXJyYXkoW10pO1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVUcmVlRm9ybUdyb3VwKGNoaWxkKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBUZXh0OiBbbm9kZS50aXRsZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIFZhbHVlOiBbbm9kZS5rZXkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBTZWxlY3RlZDogW25vZGUuaXNDaGVja2VkID8/IGZhbHNlXSxcclxuICAgICAgQ2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKirmuIXnkIboioLngrnkuK3nmoQgbmctem9ycm8g5YaF6YOo5a2X5q61ICovXHJcbiAgcHJpdmF0ZSBjbGVhbk5vZGUobm9kZTogYW55KTogYW55IHtcclxuICAgIGNvbnN0IHsgdGl0bGUsIGtleSwgaXNDaGVja2VkLCBjaGlsZHJlbiB9ID0gbm9kZTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBrZXksXHJcbiAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuPy5sZW5ndGggPyBjaGlsZHJlbi5tYXAoY2hpbGQgPT4gdGhpcy5jbGVhbk5vZGUoY2hpbGQpKSA6IFtdLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKuWwhiBUcmVlT3B0aW9ucyDmlbDmja7nu5PmnoTovazmjaLkuLogbm9kZXMg5pWw5o2u57uT5p6EICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0VHJlZU9wdGlvbnNUb05vZGVzKHRyZWVPcHRpb25zOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdHJlZU9wdGlvbnMpIHtcclxuICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgIHRpdGxlOiBvcHRpb24uVGV4dCxcclxuICAgICAgICBrZXk6IG9wdGlvbi5WYWx1ZSxcclxuICAgICAgICBpc0NoZWNrZWQ6IG9wdGlvbi5TZWxlY3RlZCA/PyBmYWxzZSxcclxuICAgICAgICBjaGlsZHJlbjogb3B0aW9uLkNoaWxkcmVuPy5sZW5ndGggPyB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXMob3B0aW9uLkNoaWxkcmVuKSA6IFtdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKirorr7nva4gKi9cclxuICB0b2dnbGVNdWx0aXBsZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmNsZWFyQWxsQ2hlY2tlZCh0aGlzLm5vZGVzKTtcclxuICAgIHJldHVyblxyXG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24uY29udHJvbHNbJ1RyZWVWaWV3Lk11bHRpcGxlJ10gYXMgRm9ybUNvbnRyb2w7XHJcbiAgICBpZighaXNNdWx0aXBsZS52YWx1ZSl7XHJcbiAgICAgICB0aGlzLmNsZWFyQWxsQ2hlY2tlZCh0aGlzLm5vZGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICB0aGlzLmFwcGx5TXVsdGlwbGVMb2dpYyh0aGlzLm5vZGVzKTtcclxuICAgIH1cclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgICB0aGlzLnN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoq5bqU55So5aSa6YCJ6YC76L6R77ya6YCJ5Lit55qE6IqC54K55ZCM5pe26YCJ5Lit5YW25omA5pyJ5a2Q6IqC54K55ZKM54i26IqC54K5ICovXHJcbiAgcHJpdmF0ZSBhcHBseU11bHRpcGxlTG9naWMobm9kZXM6IGFueVtdKSB7XHJcbiAgICBjb25zdCBjaGVja2VkS2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIHRoaXMuY29sbGVjdENoZWNrZWRLZXlzKG5vZGVzLCBjaGVja2VkS2V5cyk7XHJcbiAgICBjaGVja2VkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0Tm9kZUNoZWNrZWQobm9kZXMsIGtleSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2V0UGFyZW50Tm9kZXNDaGVja2VkKG5vZGVzLCBrZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKirmlLbpm4bmiYDmnInpgInkuK3oioLngrnnmoRrZXkgKi9cclxuICBwcml2YXRlIGNvbGxlY3RDaGVja2VkS2V5cyhub2RlczogYW55W10sIHJlc3VsdDogc3RyaW5nW10pIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5pc0NoZWNrZWQpIHtcclxuICAgICAgICByZXN1bHQucHVzaChub2RlLmtleSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGVjdENoZWNrZWRLZXlzKG5vZGUuY2hpbGRyZW4sIHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKuWIh+aNouiKgueCuemAieS4reeKtuaAgSAqL1xyXG4gIHRvZ2dsZU5vZGVDaGVja2VkKGV2ZW50OiBhbnksIG5vZGU6IGFueSkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBpc011bHRpcGxlID0gdGhpcy5mb3JtQ29uZmlndXJhdGlvbi5jb250cm9sc1snVHJlZVZpZXcuTXVsdGlwbGUnXSBhcyBGb3JtQ29udHJvbDtcclxuICAgIGNvbnN0IG5ld0NoZWNrZWQgPSAhbm9kZS5vcmlnaW4/LmlzQ2hlY2tlZDtcclxuICAgIFxyXG4gICAgaWYgKCFpc011bHRpcGxlLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKHRoaXMubm9kZXMpO1xyXG4gICAgICBpZiAobmV3Q2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0Tm9kZUNoZWNrZWRPbmx5KHRoaXMubm9kZXMsIG5vZGUua2V5LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXROb2RlQ2hlY2tlZCh0aGlzLm5vZGVzLCBub2RlLmtleSwgbmV3Q2hlY2tlZCk7XHJcbiAgICAgIGlmIChuZXdDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRQYXJlbnROb2Rlc0NoZWNrZWQodGhpcy5ub2Rlcywgbm9kZS5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMubm9kZXMgPSBbLi4udGhpcy5ub2Rlc107XHJcbiAgICB0aGlzLnN5bmNUcmVlT3B0aW9uc0Zyb21Ob2RlcygpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoq5riF6Zmk5omA5pyJ6IqC54K555qE6YCJ5Lit54q25oCBICovXHJcbiAgcHJpdmF0ZSBjbGVhckFsbENoZWNrZWQobm9kZXM6IGFueVtdKSB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgbm9kZS5pc0NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKirorr7nva7mjIflrproioLngrnnmoTpgInkuK3nirbmgIEgKi9cclxuICBwcml2YXRlIHNldE5vZGVDaGVja2VkKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcsIGNoZWNrZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIG5vZGUuaXNDaGVja2VkID0gY2hlY2tlZDtcclxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnNldENoaWxkcmVuQ2hlY2tlZChub2RlLmNoaWxkcmVuLCBjaGVja2VkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLnNldE5vZGVDaGVja2VkKG5vZGUuY2hpbGRyZW4sIHRhcmdldEtleSwgY2hlY2tlZCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S6K6+572u5omA5pyJ5a2Q6IqC54K555qE6YCJ5Lit54q25oCBICovXHJcbiAgcHJpdmF0ZSBzZXRDaGlsZHJlbkNoZWNrZWQoY2hpbGRyZW46IGFueVtdLCBjaGVja2VkOiBib29sZWFuKSB7XHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmlzQ2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICAgIGlmIChjaGlsZC5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDaGlsZHJlbkNoZWNrZWQoY2hpbGQuY2hpbGRyZW4sIGNoZWNrZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKirpgInkuK3miYDmnInniLboioLngrkgKi9cclxuICBwcml2YXRlIHNldFBhcmVudE5vZGVzQ2hlY2tlZChub2RlczogYW55W10sIHRhcmdldEtleTogc3RyaW5nLCBwYXJlbnQ6IGFueSA9IG51bGwpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgIHBhcmVudC5pc0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5zZXRQYXJlbnROb2Rlc0NoZWNrZWQodGhpcy5ub2RlcywgcGFyZW50LmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5zZXRQYXJlbnROb2Rlc0NoZWNrZWQobm9kZS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBub2RlKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirku4Xorr7nva7mjIflrproioLngrnnmoTpgInkuK3nirbmgIHvvIzkuI3lvbHlk43lrZDoioLngrnlkozniLboioLngrkgKi9cclxuICBwcml2YXRlIHNldE5vZGVDaGVja2VkT25seShub2RlczogYW55W10sIHRhcmdldEtleTogc3RyaW5nLCBjaGVja2VkOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUua2V5ID09PSB0YXJnZXRLZXkpIHtcclxuICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLnNldE5vZGVDaGVja2VkT25seShub2RlLmNoaWxkcmVuLCB0YXJnZXRLZXksIGNoZWNrZWQpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gICAgLyoq5ouW5ou9ICovXHJcbiAgZHJvcE92ZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZHJhZ05vZGUgPSBldmVudC5kcmFnTm9kZTtcclxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBldmVudC5ub2RlO1xyXG4gICAgY29uc3QgcG9zID0gZXZlbnQucG9zO1xyXG5cclxuICAgIC8vIOenu+mZpOiiq+aLluaLveeahOiKgueCuVxyXG4gICAgY29uc3QgZHJhZ2dlZERhdGEgPSB0aGlzLnJlbW92ZU5vZGVCeUtleSh0aGlzLm5vZGVzLCBkcmFnTm9kZS5rZXkpO1xyXG4gICAgaWYgKCFkcmFnZ2VkRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIHBvczogMD3lhoXpg6gsIC0xPeS4iuaWuSwgMT3kuIvmlrlcclxuICAgIGlmIChwb3MgPT09IDApIHtcclxuICAgICAgLy8g5pS+5YWl55uu5qCH6IqC54K55YaF6YOo5L2c5Li65a2Q6IqC54K5XHJcbiAgICAgIHRoaXMuYWRkQ2hpbGROb2RlKHRoaXMubm9kZXMsIHRhcmdldE5vZGUua2V5LCBkcmFnZ2VkRGF0YSk7XHJcbiAgICAgIGlmICghdGhpcy5hbkV4cGFuZGVkTm9kZS5pbmNsdWRlcyh0YXJnZXROb2RlLmtleSkpIHtcclxuICAgICAgICB0aGlzLmFuRXhwYW5kZWROb2RlID0gWy4uLnRoaXMuYW5FeHBhbmRlZE5vZGUsIHRhcmdldE5vZGUua2V5XTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5pS+5Zyo55uu5qCH6IqC54K55YmN5ZCOXHJcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZUJlc2lkZSh0aGlzLm5vZGVzLCB0YXJnZXROb2RlLmtleSwgZHJhZ2dlZERhdGEsIHBvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub2RlcyA9IFsuLi50aGlzLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKirnp7vpmaTlubbov5Tlm57oioLngrkgKi9cclxuICBwcml2YXRlIHJlbW92ZU5vZGVCeUtleShub2RlczogYW55W10sIHRhcmdldEtleTogc3RyaW5nLCBwYXJlbnQ6IGFueVtdID0gbnVsbCwgaW5kZXg6IG51bWJlciA9IC0xKTogYW55IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG5vZGVzW2ldLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZXNbaV0uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5yZW1vdmVOb2RlQnlLZXkobm9kZXNbaV0uY2hpbGRyZW4sIHRhcmdldEtleSwgbm9kZXNbaV0uY2hpbGRyZW4sIGkpO1xyXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKuWcqOebruagh+iKgueCueaXgei+ueaPkuWFpeiKgueCuSAqL1xyXG4gIHByaXZhdGUgaW5zZXJ0Tm9kZUJlc2lkZShub2RlczogYW55W10sIHRhcmdldEtleTogc3RyaW5nLCBuZXdOb2RlOiBhbnksIHBvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG5vZGVzW2ldLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBwb3NpdGlvbiA9PT0gLTEgPyBpIDogaSArIDE7XHJcbiAgICAgICAgbm9kZXMuc3BsaWNlKGluc2VydEluZGV4LCAwLCBuZXdOb2RlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZXNbaV0uY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLmluc2VydE5vZGVCZXNpZGUobm9kZXNbaV0uY2hpbGRyZW4sIHRhcmdldEtleSwgbmV3Tm9kZSwgcG9zaXRpb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuWIpOaWreiKgueCueeahOWtkOiKgueCueaYr+WQpuacieiiq+mAieS4reeahCAqL1xyXG4gIGhhc0NoaWxkcmVuQ2hlY2tlZChub2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmIChub2RlLm9yaWdpbj8uaXNDaGVja2VkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9yaWdpbk5vZGUgPSB0aGlzLmZpbmROb2RlQnlLZXkodGhpcy5ub2Rlcywgbm9kZS5rZXkpO1xyXG4gICAgaWYgKCFvcmlnaW5Ob2RlPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmhhc0FueUNoaWxkQ2hlY2tlZChvcmlnaW5Ob2RlLmNoaWxkcmVuKTtcclxuICB9XHJcblxyXG4gIC8qKumAkuW9kuajgOafpeWtkOiKgueCueaYr+WQpuacieiiq+mAieS4reeahCAqL1xyXG4gIHByaXZhdGUgaGFzQW55Q2hpbGRDaGVja2VkKGNoaWxkcmVuOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICBpZiAoY2hpbGQuaXNDaGVja2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggJiYgdGhpcy5oYXNBbnlDaGlsZENoZWNrZWQoY2hpbGQuY2hpbGRyZW4pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuagueaNriBrZXkg5p+l5om+6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBmaW5kTm9kZUJ5S2V5KG5vZGVzOiBhbnlbXSwga2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTm9kZUJ5S2V5KG5vZGUuY2hpbGRyZW4sIGtleSk7XHJcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXVtkYXRhLWluZGV0ZXJtaW5hdGVdJyk7XHJcbiAgICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IGluZGV0ZXJtaW5hdGUgPSBjaGVja2JveC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXRlcm1pbmF0ZScpID09PSAndHJ1ZSc7XHJcbiAgICAgIGNoZWNrYm94LmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUVudGl0eVwiPlxyXG4gICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZm9ybUNvbmZpZ3VyYXRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snQWJwRHluYW1pY0Zvcm06Ok5vZGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhcmsgc29mdCBtcy0yIGZsb2F0LWVuZFwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiYWRkTm9kZUJ0bigpXCI+e3snQWJwRHluYW1pY0Zvcm06OkFkZE5vZGUnIHxcclxuICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxhYnAtdHJlZSBbbm9kZXNdPVwibm9kZXNcIiBbY2hlY2thYmxlXT1cImZhbHNlXCIgKGRyb3BPdmVyKT1cImRyb3BPdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG56RXhwYW5kQ2hhbmdlKT1cIm56RXhwYW5kQ2hhbmdlKCRldmVudClcIiBbZXhwYW5kZWRLZXlzXT1cImFuRXhwYW5kZWROb2RlXCIgW2RyYWdnYWJsZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21lbnUgbGV0LW5vZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrLnN0b3ApPVwiZWRpdEl0ZW1CdG4obm9kZSlcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIgbWUtMSBmYSBmYS1wZW5jaWxcIj48L2k+e3snQWJwVWk6OkVkaXQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2suc3RvcCk9XCJjcmVhdGVDaGlsZEl0ZW1CdG4obm9kZSlcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIgbWUtMSBmYSBmYS1wbHVzXCI+PC9pPnt7J0FicER5bmFtaWNGb3JtOjpBZGRTdWJOb2RlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrLnN0b3ApPVwiZGVsZXRlTWVudUl0ZW1CdG4obm9kZSlcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIgbWUtMSBmYSBmYS1yZW1vdmVcIj48L2k+e3snQWJwVWk6OkRlbGV0ZScgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBhYnBUcmVlTm9kZVRlbXBsYXRlIGxldC1ub2RlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInRvZ2dsZU5vZGVDaGVja2VkKCRldmVudCwgbm9kZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIm5vZGUub3JpZ2luPy5pc0NoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pbmRldGVybWluYXRlXT1cImhhc0NoaWxkcmVuQ2hlY2tlZChub2RlKVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7bm9kZS50aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGFicFRyZWVFeHBhbmRlZEljb25UZW1wbGF0ZSBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCJub2RlLmNoaWxkcmVuLmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlLmlzRXhwYW5kZWQgPyBtaW51c0ljb24gOiBwbHVzSWNvblwiPjwvbmctY29udGFpbmVyPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtaW51c0ljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMGM2LjM0NyAwIDExLjUgNS4xNTMgMTEuNSAxMS41cy01LjE1MyAxMS41LTExLjUgMTEuNS0xMS41LTUuMTUzLTExLjUtMTEuNSA1LjE1My0xMS41IDExLjUtMTEuNXptMCAxYzUuNzk1IDAgMTAuNSA0LjcwNSAxMC41IDEwLjVzLTQuNzA1IDEwLjUtMTAuNSAxMC41LTEwLjUtNC43MDUtMTAuNS0xMC41IDQuNzA1LTEwLjUgMTAuNS0xMC41em0tNi41IDEwaDEzdjFoLTEzdi0xelwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGx1c0ljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMGM2LjM0NyAwIDExLjUgNS4xNTMgMTEuNSAxMS41cy01LjE1MyAxMS41LTExLjUgMTEuNS0xMS41LTUuMTUzLTExLjUtMTEuNSA1LjE1My0xMS41IDExLjUtMTEuNXptMCAxYzUuNzk1IDAgMTAuNSA0LjcwNSAxMC41IDEwLjVzLTQuNzA1IDEwLjUtMTAuNSAxMC41LTEwLjUtNC43MDUtMTAuNS0xMC41IDQuNzA1LTEwLjUgMTAuNS0xMC41em0uNSAxMGg2djFoLTZ2NmgtMXYtNmgtNnYtMWg2di02aDF2NnpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9hYnAtdHJlZT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm5vZGVzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZCBtdC0yXCI+e3snQWJwRHluYW1pY0Zvcm06OlBsZWFzZUFkZE5vZGUnIHxcclxuICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJUcmVlT3B0aW9ucz8uZXJyb3JzPy5yZXF1aXJlZFwiIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBcIj5cclxuICAgICAgICAgICAgICAgIHt7J0FicFZhbGlkYXRpb246OlRoaXNGaWVsZElzUmVxdWlyZWQuJyB8IGFicExvY2FsaXphdGlvbjogJ05vZGVzJ319XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2staW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJ0b2dnbGVNdWx0aXBsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJUcmVlVmlldy5NdWx0aXBsZVwiIGlkPVwiTXVsdGlwbGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJNdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J0FicER5bmFtaWNGb3JtOjpNdWx0aXBsZScgfCBhYnBMb2NhbGl6YXRpb259fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGFicEluaXQpPVwic3VibWl0Y2xpY2s/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWNrKClcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCJcclxuICAgICAgICAgICAgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZm9ybT5cclxuXHJcblxyXG48IS0tIFtvcHRpb25zXT1cInsgc2l6ZTogQ3VycmVudFNlbGVjdGlvblRhYmxlQ29udHJvbE5hbWU9PT0nTWF0cml4Jz8neGwnOicnICxzY3JvbGxhYmxlOmZhbHNlIH1cIiAodmlzaWJsZUNoYW5nZSk9XCJ0YWJsZVNlbGVjdFZpc2libGVDaGFuZ2UoJGV2ZW50KVwiLS0+XHJcbjxhYnAtbW9kYWwgWyh2aXNpYmxlKV09XCJpc1Zpc2libGVcIiBbYnVzeV09XCJtb2RhbEJ1c3lcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxyXG4gICAgICAgIDxoMz57e2lzQ3JlYXRlQ2hpbGQgPyAoJ0FicER5bmFtaWNGb3JtOjpBZGRTdWJOb2RlJyB8IGFicExvY2FsaXphdGlvbikgOiAoc2VsZWN0VHJlZSA/ICgnQWJwVWk6OkVkaXQnIHxcclxuICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9uKSA6ICgnQ21zOjpOZXcnIHwgYWJwTG9jYWxpemF0aW9uKSl9fTwvaDM+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVyUmVmPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj48aSBjbGFzcz1cImZhIGZhLXB1bHNlIGZhLXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZUZvcm07IGVsc2UgbG9hZGVyUmVmXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwic2l0ZXMtbW9kYWwtZm9ybVwiICNteUZvcm09XCJuZ0Zvcm1cIiBbZm9ybUdyb3VwXT1cIm5vZGVGb3JtXCIgKHN1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiICNub2RlTW9kYWxTdWJtaXQgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnQWJwRHluYW1pY0Zvcm06Ok5vZGVJdGVtVGV4dCcgfCBhYnBMb2NhbGl6YXRpb24gfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBbcGxhY2Vob2xkZXJdPVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiZGlzUGxheU5hbWVJbnB1dEJsdXIoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sgJ0FicER5bmFtaWNGb3JtOjpTZWxlY3RMaXN0SXRlbVZhbHVlJyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbcGxhY2Vob2xkZXJdPVwiXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQ2hlY2tlZFwiIGlkPVwiaXNTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiaXNTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQWJwRHluYW1pY0Zvcm06OlNlbGVjdGVkJyB8IGFicExvY2FsaXphdGlvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBhYnBDbG9zZT57eydBYnBVaTo6Q2xvc2UnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiIFtkaXNhYmxlZF09XCIhbm9kZUZvcm0udmFsaWRcIlxyXG4gICAgICAgICAgICAoYWJwQ2xpY2spPVwibm9kZU1vZGFsU3VibWl0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKVwiPnt7J0FicFVpOjpTYXZlJyB8XHJcbiAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9hYnAtYnV0dG9uPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9hYnAtbW9kYWw+Il19
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHluYW1pYy1mb3JtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyZWUvdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBZSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7QUFPMUQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUFvQixFQUFlLEVBQVUsZUFBZ0M7UUFBekQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQTZCckUsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBOER4QyxZQUFZO1FBQ1oscUJBQXFCO1FBQ3JCLHlGQUF5RjtRQUN6RiwrQ0FBK0M7UUFDL0MsSUFBSTtRQUVKLFlBQVk7UUFDWixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBRWxCLFlBQVk7UUFDWixtQkFBYyxHQUFVLEVBQUUsQ0FBQztRQUUzQixZQUFZO1FBQ1osa0JBQWEsR0FBRyxLQUFLLENBQUM7UUE2RHRC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QUFJO3NCQURkLEtBQUs7Z0JBUUssUUFBUTtzQkFEbEIsS0FBSztnQkFRSyxNQUFNO3NCQURoQixLQUFLO2dCQVdzQyxXQUFXO3NCQUF0RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBb0pPLGVBQWU7c0JBQS9ELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJlZUNvbmZpZyB9IGZyb20gJy4vdHJlZS1jb25maWcnO1xyXG5pbXBvcnQgeyBUb1BpbnlpblNlcnZpY2UgfSBmcm9tICdAZGlnbml0ZS1uZy9leHBhbmQuY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RmLXRyZWUtY29uZmlnJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyZWUtY29uZmlnLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlQ29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgdG9QaW55aW5TZXJ2aWNlOiBUb1BpbnlpblNlcnZpY2UpIHt9XHJcbiAgLyoq6KGo5Y2V5o6n5Lu257G75Z6LICovXHJcbiAgX3R5cGU6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgdHlwZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3R5cGUgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6YCJ5oup55qE6KGo5Y2V5L+h5oGvICovXHJcbiAgX3NlbGVjdGVkOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHY6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xyXG4gIH1cclxuXHJcbiAgLyoq6KGo5Y2V5a6e5L2TICovXHJcbiAgZm9ybUVudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBFbnRpdHkodjogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLmZvcm1FbnRpdHkgPSB2O1xyXG4gICAgdGhpcy5kYXRhTG9hZGVkKCk7XHJcbiAgfVxyXG4gIGdldCBmb3JtQ29uZmlndXJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1FbnRpdHk/LmdldCgnZm9ybUNvbmZpZ3VyYXRpb24nKSBhcyBGb3JtR3JvdXA7XHJcbiAgfVxyXG4gIGdldCBUcmVlT3B0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uPy5jb250cm9sc1snVHJlZVZpZXcuTm9kZXMnXSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG4gIEBWaWV3Q2hpbGQoJ3N1Ym1pdGNsaWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc3VibWl0Y2xpY2s6IEVsZW1lbnRSZWY7XHJcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIGFzeW5jIGRhdGFMb2FkZWQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtRW50aXR5ICYmIHRoaXMuX3R5cGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFmdGVySW5pdCgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgdGhpcy5mb3JtRW50aXR5Py5zZXRDb250cm9sKCdmb3JtQ29uZmlndXJhdGlvbicsIHRoaXMuZmIuZ3JvdXAobmV3IFRyZWVDb25maWcoKSkpO1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKV0pO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIOaJi+WKqOinpuWPkeWPmOabtOajgOa1i1xyXG4gICAgICB0aGlzLnN1Ym1pdGNsaWNrPy5uYXRpdmVFbGVtZW50Py5jbGljaygpO1xyXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgJiYgdGhpcy5fc2VsZWN0ZWQuZm9ybUNvbnRyb2xOYW1lID09IHRoaXMuX3R5cGUpIHtcclxuICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSB0aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvblsnVHJlZVZpZXcuTm9kZXMnXTtcclxuICAgICAgICBpZiAodHJlZU5vZGVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXModHJlZU5vZGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICAgICAgLy8gZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uWydUcmVlVmlldy5Ob2RlcyddKSB7XHJcbiAgICAgICAgLy8gICBmb3IgKGNvbnN0IGtleSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50W2tleV07XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNhcGl0YWxpemVkS2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpO1xyXG4gICAgICAgIC8vICAgICBlbGVtZW50W2NhcGl0YWxpemVkS2V5XSA9IGl0ZW07XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAuLi50aGlzLl9zZWxlY3RlZC5mb3JtQ29uZmlndXJhdGlvbixcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzLmFkZFRyZWVPcHRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5b2T6YCJ5oup6aG555qE5paH5pys5Y+R55Sf5Y+Y5YyW5pe277yM5pu05paw5a+55bqU55qE5YC8XHJcbiAgICogQHBhcmFtIGV2ZW50IOi+k+WFpeS6i+S7tuWvueixoVxyXG4gICAqIEBwYXJhbSBpbmRleCDpgInmi6npobnnmoTntKLlvJXkvY3nva5cclxuICAgKiBAZGVzY3JpcHRpb24g5aaC5p6c6YCJ5oup6aG55bey5pyJVmFsdWXlgLzliJnkuI3lpITnkIbvvIzlkKbliJnlsIbkuK3mlofmlofmnKzovazmjaLkuLrmi7zpn7PkvZzkuLpWYWx1ZeWAvFxyXG4gICAqL1xyXG4gIC8vIHRleHRDaGFuZ2UoZXZlbnQsIGluZGV4KSB7XHJcbiAgLy8gICBjb25zdCBUcmVlT3B0aW9uc0l0ZW0gPSB0aGlzLlRyZWVPcHRpb25zLmF0KGluZGV4KTtcclxuICAvLyAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIC8vICAgaWYgKFRyZWVPcHRpb25zSXRlbS5nZXQoJ1ZhbHVlJyk/LnZhbHVlKSByZXR1cm47XHJcbiAgLy8gICBUcmVlT3B0aW9uc0l0ZW0ucGF0Y2hWYWx1ZSh7XHJcbiAgLy8gICAgIFZhbHVlOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG4gIC8qKuWtl+auteagh+etvmlucHV05aSx5Y675qCH54K555Sf5oiQ5a2X5q615ZCN5a2XICovXHJcbiAgZGlzUGxheU5hbWVJbnB1dEJsdXIoZXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5ub2RlRm9ybSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBwaW55aW4gPSB0aGlzLnRvUGlueWluU2VydmljZS5nZXQodmFsdWUpO1xyXG4gICAgY29uc3QgbmFtZUlucHV0ID0gdGhpcy5ub2RlRm9ybS5nZXQoJ2tleScpO1xyXG4gICAgaWYgKCFuYW1lSW5wdXQgfHwgbmFtZUlucHV0LnZhbHVlKSByZXR1cm47XHJcbiAgICBuYW1lSW5wdXQucGF0Y2hWYWx1ZShwaW55aW4pO1xyXG4gIH1cclxuXHJcbiAgLyoq6LCD5pW06KGo5qC85L2N572uICovXHJcbiAgLy8gZHJvcChldmVudDogYW55KSB7XHJcbiAgLy8gICBtb3ZlSXRlbUluQXJyYXkodGhpcy5UcmVlT3B0aW9ucy5jb250cm9scywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAvLyAgIHRoaXMuVHJlZU9wdGlvbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLyoqdHJlZeaVsOaNriAqL1xyXG4gIG5vZGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvKirlt7LlsZXlvIDnmoToioLngrkgKi9cclxuICBhbkV4cGFuZGVkTm9kZTogYW55W10gPSBbXTtcclxuXHJcbiAgLyoq5piv5ZCm5YWo6YOo5bGV5byAICovXHJcbiAgaXNBbGxFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICAvKirngrnlh7vlsZXlvIDmoJHoioLngrnlm77moIfop6blj5EgKi9cclxuICBuekV4cGFuZENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgYW5FeHBhbmRlZE5vZGUgPSB0aGlzLmFuRXhwYW5kZWROb2RlO1xyXG4gICAgaWYgKGFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGV2ZW50Lm5vZGUua2V5KSkge1xyXG4gICAgICBhbkV4cGFuZGVkTm9kZSA9IGFuRXhwYW5kZWROb2RlLmZpbHRlcihrZXkgPT4ga2V5ICE9PSBldmVudC5ub2RlLmtleSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbkV4cGFuZGVkTm9kZS5wdXNoKGV2ZW50Lm5vZGUua2V5KTtcclxuICAgIH1cclxuICAgIHRoaXMuYW5FeHBhbmRlZE5vZGUgPSBhbkV4cGFuZGVkTm9kZTtcclxuICAgIFxyXG4gICAgLy8g5qOA5p+l5piv5ZCm5omA5pyJ5pyJ5a2Q6IqC54K555qE6IqC54K56YO95bey5bGV5byAXHJcbiAgICAvLyBjb25zdCBhbGxLZXlzID0gdGhpcy5nZXRBbGxOb2RlS2V5cyh0aGlzLm5vZGVzKTtcclxuICAgIHRoaXMuaXNBbGxFeHBhbmRlZCA9IGFuRXhwYW5kZWROb2RlLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvKirliIfmjaLlsZXlvIAv5pS257yp5omA5pyJ6IqC54K5ICovXHJcbiAgdG9nZ2xlRXhwYW5kQWxsKCkge1xyXG4gICAgdGhpcy5pc0FsbEV4cGFuZGVkID0gIXRoaXMuaXNBbGxFeHBhbmRlZDtcclxuICAgIHRoaXMuYW5FeHBhbmRlZE5vZGUgPSB0aGlzLmlzQWxsRXhwYW5kZWQgPyB0aGlzLmdldEFsbE5vZGVLZXlzKHRoaXMubm9kZXMpIDogW107XHJcbiAgICBpZiAoIXRoaXMuaXNBbGxFeHBhbmRlZCkge1xyXG4gICAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMuc2V0RXhwYW5kZWQodGhpcy5ub2RlcywgZmFsc2UpXTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgLy/pgJLlvZLorr7nva5ub2Rlc+S4reeahGV4cGFuZGVk5YC8IOW5tuS4lOi/lOWbnuS4gOS4quaVsOe7hFxyXG4gIHNldEV4cGFuZGVkKG5vZGVzOiBhbnlbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pOiBzdHJpbmdbXSB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkO1xyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbiA9IHRoaXMuc2V0RXhwYW5kZWQobm9kZS5jaGlsZHJlbiwgZXhwYW5kZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxuICAvKirojrflj5bmiYDmnInmnInlrZDoioLngrnnmoToioLngrnnmoRrZXkgKi9cclxuICBwcml2YXRlIGdldEFsbE5vZGVLZXlzKG5vZGVzOiBhbnlbXSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICAgIGtleXMucHVzaChub2RlLmtleSk7XHJcbiAgICAgICAga2V5cy5wdXNoKC4uLnRoaXMuZ2V0QWxsTm9kZUtleXMobm9kZS5jaGlsZHJlbikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9XHJcblxyXG4gIC8qKuajgOafpeaYr+WQpuacieS7u+S9leiKgueCueWMheWQq+WtkOiKgueCuSAqL1xyXG4gIGhhc0FueU5vZGVXaXRoQ2hpbGRyZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxOb2RlS2V5cyh0aGlzLm5vZGVzKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoq5pu05paw5bGV5byA54q25oCBICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVFeHBhbmRlZFN0YXRlKCkge1xyXG4gICAgY29uc3QgYWxsS2V5cyA9IHRoaXMuZ2V0QWxsTm9kZUtleXModGhpcy5ub2Rlcyk7XHJcbiAgICB0aGlzLmlzQWxsRXhwYW5kZWQgPSBhbGxLZXlzLmxlbmd0aCA+IDAgJiYgYWxsS2V5cy5ldmVyeShrZXkgPT4gdGhpcy5hbkV4cGFuZGVkTm9kZS5pbmNsdWRlcyhrZXkpKTtcclxuICB9XHJcbiAgLyoq5q2j5Zyo5pON5L2c55qE6IqC54K56aG5ICovXHJcbiAgc2VsZWN0VHJlZTogYW55O1xyXG4gIC8qKuaYr+WQpuWIm+W7uuWtkOiKgueCuSAqL1xyXG4gIGlzQ3JlYXRlQ2hpbGQ6IGJvb2xlYW4gfCBhbnkgPSBmYWxzZTtcclxuICAvKirmqKHmgIHmoYbnirbmgIEgKi9cclxuICBpc1Zpc2libGU6IGJvb2xlYW4gfCBhbnkgPSBmYWxzZTtcclxuXHJcbiAgLyoq55So5LqO56Gu5a6a5qih5oCB55qE57mB5b+Z54q25oCB5piv5ZCm5Li655yfICovXHJcbiAgbW9kYWxCdXN5OiBib29sZWFuIHwgYW55ID0gZmFsc2U7XHJcbiAgLyoq5Yib5bu66KGo5Y2VICovXHJcbiAgbm9kZUZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoq6KGo5Y2V5o6n5Lu25qih5p2/LeWKqOaAgei1i+WAvOihqOWNleaOp+S7tiAqL1xyXG4gIEBWaWV3Q2hpbGQoJ25vZGVNb2RhbFN1Ym1pdCcsIHsgc3RhdGljOiBmYWxzZSB9KSBub2RlTW9kYWxTdWJtaXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIC8qKueUn+aIkEdVSUQgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlR3VpZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XHJcbiAgfVxyXG5cclxuICAvKirliJvlu7roioLngrkgKi9cclxuICBhZGROb2RlQnRuKCkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0NyZWF0ZUNoaWxkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdFRyZWUgPSBudWxsO1xyXG4gICAgdGhpcy5ub2RlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0aXRsZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAga2V5OiBbdGhpcy5nZW5lcmF0ZUd1aWQoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW2ZhbHNlXSxcclxuICAgICAgY2hpbGRyZW46IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKue8lui+keiKgueCuSAqL1xyXG4gIGVkaXRJdGVtQnRuKG5vZGU6IGFueSkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0NyZWF0ZUNoaWxkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdFRyZWUgPSBub2RlO1xyXG4gICAgdGhpcy5ub2RlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0aXRsZTogW25vZGUudGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBrZXk6IFtub2RlLmtleSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW25vZGUub3JpZ2luPy5pc0NoZWNrZWQgPz8gZmFsc2VdLFxyXG4gICAgICBjaGlsZHJlbjogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoq5Yib5bu65a2Q6IqC54K5ICovXHJcbiAgY3JlYXRlQ2hpbGRJdGVtQnRuKG5vZGU6IGFueSkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0NyZWF0ZUNoaWxkID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0VHJlZSA9IG5vZGU7XHJcbiAgICB0aGlzLm5vZGVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHRpdGxlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBrZXk6IFt0aGlzLmdlbmVyYXRlR3VpZCgpLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgaXNDaGVja2VkOiBbZmFsc2VdLFxyXG4gICAgICBjaGlsZHJlbjogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoq6YeN572u5qih5oCB5qGGICovXHJcbiAgcmVzZXRNb2RhbCgpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzQ3JlYXRlQ2hpbGQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0VHJlZSA9IG51bGw7XHJcbiAgfVxyXG4gIC8qKuWIm+W7uue8lui+keS/neWtmCAqL1xyXG4gIGNyZWF0ZU9yRWRpdFNhdmUoKSB7XHJcbiAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLm5vZGVGb3JtO1xyXG4gICAgY29uc3QgeyBzZWxlY3RUcmVlLCBpc0NyZWF0ZUNoaWxkLCBub2RlcywgYW5FeHBhbmRlZE5vZGUgfSA9IHRoaXM7XHJcbiAgICBjb25zdCBpc011bHRpcGxlID0gdGhpcy5mb3JtQ29uZmlndXJhdGlvbi5jb250cm9sc1snVHJlZVZpZXcuTXVsdGlwbGUnXSBhcyBGb3JtQ29udHJvbDtcclxuXHJcbiAgICBpZiAoc2VsZWN0VHJlZSkge1xyXG4gICAgICBpZiAoaXNDcmVhdGVDaGlsZCkge1xyXG4gICAgICAgIC8vIOWIm+W7uuWtkOiKgueCuVxyXG4gICAgICAgIHRoaXMuYWRkQ2hpbGROb2RlKG5vZGVzLCBzZWxlY3RUcmVlLmtleSwgdmFsdWUpO1xyXG4gICAgICAgIC8vIOiHquWKqOWxleW8gOeItuiKgueCuVxyXG4gICAgICAgIGlmICghYW5FeHBhbmRlZE5vZGUuaW5jbHVkZXMoc2VsZWN0VHJlZS5rZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmFuRXhwYW5kZWROb2RlID0gWy4uLmFuRXhwYW5kZWROb2RlLCBzZWxlY3RUcmVlLmtleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOe8lui+keiKgueCuVxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZShub2Rlcywgc2VsZWN0VHJlZS5rZXksIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5Yib5bu65qC56IqC54K5XHJcbiAgICAgIG5vZGVzLnB1c2godmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWNlemAieaooeW8j+S4i++8jOWmguaenOW9k+WJjeiKgueCueiiq+mAieS4re+8jOa4hemZpOWFtuS7luiKgueCueeahOmAieS4reeKtuaAgVxyXG4gICAgaWYgKCFpc011bHRpcGxlLnZhbHVlICYmIHZhbHVlLmlzQ2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmNsZWFyQWxsQ2hlY2tlZChub2Rlcyk7XHJcbiAgICAgIHRoaXMuc2V0Tm9kZUNoZWNrZWRPbmx5KG5vZGVzLCB2YWx1ZS5rZXksIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm9kZXMgPSBbLi4ubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRXhwYW5kZWRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5yZXNldE1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLmt7vliqDlrZDoioLngrkgKi9cclxuICBwcml2YXRlIGFkZENoaWxkTm9kZShub2RlczogYW55W10sIHBhcmVudEtleTogc3RyaW5nLCBuZXdOb2RlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IHBhcmVudEtleSkge1xyXG4gICAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgbm9kZS5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuYWRkQ2hpbGROb2RlKG5vZGUuY2hpbGRyZW4sIHBhcmVudEtleSwgbmV3Tm9kZSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5pu05paw6IqC54K5ICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVOb2RlKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcsIHVwZGF0ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIG5vZGUudGl0bGUgPSB1cGRhdGVkRGF0YS50aXRsZTtcclxuICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IHVwZGF0ZWREYXRhLmlzQ2hlY2tlZDtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMudXBkYXRlTm9kZShub2RlLmNoaWxkcmVuLCB0YXJnZXRLZXksIHVwZGF0ZWREYXRhKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirliKDpmaToioLngrkgKi9cclxuICBkZWxldGVNZW51SXRlbUJ0bihub2RlOiBhbnkpIHtcclxuICAgIHRoaXMuZGVsZXRlTm9kZSh0aGlzLm5vZGVzLCBub2RlLmtleSk7XHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMudXBkYXRlRXhwYW5kZWRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5Yig6Zmk6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBkZWxldGVOb2RlKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKG5vZGVzW2ldLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuZGVsZXRlTm9kZShub2Rlc1tpXS5jaGlsZHJlbiwgdGFyZ2V0S2V5KSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirlkIzmraUgbm9kZXMg5YiwIFRyZWVPcHRpb25zICovXHJcbiAgcHJpdmF0ZSBzeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKSB7XHJcbiAgICB0aGlzLlRyZWVPcHRpb25zLmNsZWFyKCk7XHJcbiAgICBjb25zdCBjbGVhbmVkTm9kZXMgPSB0aGlzLm5vZGVzLm1hcChub2RlID0+IHRoaXMuY2xlYW5Ob2RlKG5vZGUpKTtcclxuICAgIGNsZWFuZWROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICB0aGlzLlRyZWVPcHRpb25zLnB1c2godGhpcy5jcmVhdGVUcmVlRm9ybUdyb3VwKG5vZGUpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoq6YCS5b2S5Yib5bu65qCR6KGo5Y2V57uEICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVUcmVlRm9ybUdyb3VwKG5vZGU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5ldyBGb3JtQXJyYXkoW10pO1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVUcmVlRm9ybUdyb3VwKGNoaWxkKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBUZXh0OiBbbm9kZS50aXRsZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIFZhbHVlOiBbbm9kZS5rZXkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBTZWxlY3RlZDogW25vZGUuaXNDaGVja2VkID8/IGZhbHNlXSxcclxuICAgICAgQ2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKirmuIXnkIboioLngrnkuK3nmoQgbmctem9ycm8g5YaF6YOo5a2X5q61ICovXHJcbiAgcHJpdmF0ZSBjbGVhbk5vZGUobm9kZTogYW55KTogYW55IHtcclxuICAgIGNvbnN0IHsgdGl0bGUsIGtleSwgaXNDaGVja2VkLCBjaGlsZHJlbiB9ID0gbm9kZTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBrZXksXHJcbiAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuPy5sZW5ndGggPyBjaGlsZHJlbi5tYXAoY2hpbGQgPT4gdGhpcy5jbGVhbk5vZGUoY2hpbGQpKSA6IFtdLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKuWwhiBUcmVlT3B0aW9ucyDmlbDmja7nu5PmnoTovazmjaLkuLogbm9kZXMg5pWw5o2u57uT5p6EICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0VHJlZU9wdGlvbnNUb05vZGVzKHRyZWVPcHRpb25zOiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdHJlZU9wdGlvbnMpIHtcclxuICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgIHRpdGxlOiBvcHRpb24uVGV4dCxcclxuICAgICAgICBrZXk6IG9wdGlvbi5WYWx1ZSxcclxuICAgICAgICBpc0NoZWNrZWQ6IG9wdGlvbi5TZWxlY3RlZCA/PyBmYWxzZSxcclxuICAgICAgICBjaGlsZHJlbjogb3B0aW9uLkNoaWxkcmVuPy5sZW5ndGggPyB0aGlzLmNvbnZlcnRUcmVlT3B0aW9uc1RvTm9kZXMob3B0aW9uLkNoaWxkcmVuKSA6IFtdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKirorr7nva4gKi9cclxuICB0b2dnbGVNdWx0aXBsZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmNsZWFyQWxsQ2hlY2tlZCh0aGlzLm5vZGVzKTtcclxuICAgIHJldHVybjtcclxuICAgIGNvbnN0IGlzTXVsdGlwbGUgPSB0aGlzLmZvcm1Db25maWd1cmF0aW9uLmNvbnRyb2xzWydUcmVlVmlldy5NdWx0aXBsZSddIGFzIEZvcm1Db250cm9sO1xyXG4gICAgaWYgKCFpc011bHRpcGxlLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKHRoaXMubm9kZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hcHBseU11bHRpcGxlTG9naWModGhpcy5ub2Rlcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVzID0gWy4uLnRoaXMubm9kZXNdO1xyXG4gICAgdGhpcy5zeW5jVHJlZU9wdGlvbnNGcm9tTm9kZXMoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKuW6lOeUqOWkmumAiemAu+i+ke+8mumAieS4reeahOiKgueCueWQjOaXtumAieS4reWFtuaJgOacieWtkOiKgueCueWSjOeItuiKgueCuSAqL1xyXG4gIHByaXZhdGUgYXBwbHlNdWx0aXBsZUxvZ2ljKG5vZGVzOiBhbnlbXSkge1xyXG4gICAgY29uc3QgY2hlY2tlZEtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICB0aGlzLmNvbGxlY3RDaGVja2VkS2V5cyhub2RlcywgY2hlY2tlZEtleXMpO1xyXG4gICAgY2hlY2tlZEtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICB0aGlzLnNldE5vZGVDaGVja2VkKG5vZGVzLCBrZXksIHRydWUpO1xyXG4gICAgICB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZChub2Rlcywga2V5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoq5pS26ZuG5omA5pyJ6YCJ5Lit6IqC54K555qEa2V5ICovXHJcbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2tlZEtleXMobm9kZXM6IGFueVtdLCByZXN1bHQ6IHN0cmluZ1tdKSB7XHJcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgaWYgKG5vZGUuaXNDaGVja2VkKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZS5rZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNvbGxlY3RDaGVja2VkS2V5cyhub2RlLmNoaWxkcmVuLCByZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKirliIfmjaLoioLngrnpgInkuK3nirbmgIEgKi9cclxuICB0b2dnbGVOb2RlQ2hlY2tlZChldmVudDogYW55LCBub2RlOiBhbnkpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMuZm9ybUNvbmZpZ3VyYXRpb24uY29udHJvbHNbJ1RyZWVWaWV3Lk11bHRpcGxlJ10gYXMgRm9ybUNvbnRyb2w7XHJcbiAgICBjb25zdCBuZXdDaGVja2VkID0gIW5vZGUub3JpZ2luPy5pc0NoZWNrZWQ7XHJcblxyXG4gICAgaWYgKCFpc011bHRpcGxlLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJBbGxDaGVja2VkKHRoaXMubm9kZXMpO1xyXG4gICAgICBpZiAobmV3Q2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0Tm9kZUNoZWNrZWRPbmx5KHRoaXMubm9kZXMsIG5vZGUua2V5LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXROb2RlQ2hlY2tlZCh0aGlzLm5vZGVzLCBub2RlLmtleSwgbmV3Q2hlY2tlZCk7XHJcbiAgICAgIGlmIChuZXdDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRQYXJlbnROb2Rlc0NoZWNrZWQodGhpcy5ub2Rlcywgbm9kZS5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub2RlcyA9IFsuLi50aGlzLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKirmuIXpmaTmiYDmnInoioLngrnnmoTpgInkuK3nirbmgIEgKi9cclxuICBwcml2YXRlIGNsZWFyQWxsQ2hlY2tlZChub2RlczogYW55W10pIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBub2RlLmlzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbENoZWNrZWQobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKuiuvue9ruaMh+WumuiKgueCueeahOmAieS4reeKtuaAgSAqL1xyXG4gIHByaXZhdGUgc2V0Tm9kZUNoZWNrZWQobm9kZXM6IGFueVtdLCB0YXJnZXRLZXk6IHN0cmluZywgY2hlY2tlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBjaGVja2VkO1xyXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuc2V0Q2hpbGRyZW5DaGVja2VkKG5vZGUuY2hpbGRyZW4sIGNoZWNrZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuc2V0Tm9kZUNoZWNrZWQobm9kZS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBjaGVja2VkKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLorr7nva7miYDmnInlrZDoioLngrnnmoTpgInkuK3nirbmgIEgKi9cclxuICBwcml2YXRlIHNldENoaWxkcmVuQ2hlY2tlZChjaGlsZHJlbjogYW55W10sIGNoZWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuaXNDaGVja2VkID0gY2hlY2tlZDtcclxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNldENoaWxkcmVuQ2hlY2tlZChjaGlsZC5jaGlsZHJlbiwgY2hlY2tlZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKumAieS4reaJgOacieeItuiKgueCuSAqL1xyXG4gIHByaXZhdGUgc2V0UGFyZW50Tm9kZXNDaGVja2VkKG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcsIHBhcmVudDogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgIGlmIChub2RlLmtleSA9PT0gdGFyZ2V0S2V5KSB7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgcGFyZW50LmlzQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZCh0aGlzLm5vZGVzLCBwYXJlbnQua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCAmJiB0aGlzLnNldFBhcmVudE5vZGVzQ2hlY2tlZChub2RlLmNoaWxkcmVuLCB0YXJnZXRLZXksIG5vZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKuS7heiuvue9ruaMh+WumuiKgueCueeahOmAieS4reeKtuaAge+8jOS4jeW9seWTjeWtkOiKgueCueWSjOeItuiKgueCuSAqL1xyXG4gIHByaXZhdGUgc2V0Tm9kZUNoZWNrZWRPbmx5KG5vZGVzOiBhbnlbXSwgdGFyZ2V0S2V5OiBzdHJpbmcsIGNoZWNrZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIG5vZGUuaXNDaGVja2VkID0gY2hlY2tlZDtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuc2V0Tm9kZUNoZWNrZWRPbmx5KG5vZGUuY2hpbGRyZW4sIHRhcmdldEtleSwgY2hlY2tlZCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoq5ouW5ou9ICovXHJcbiAgZHJvcE92ZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZHJhZ05vZGUgPSBldmVudC5kcmFnTm9kZTtcclxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBldmVudC5ub2RlO1xyXG4gICAgY29uc3QgcG9zID0gZXZlbnQucG9zO1xyXG5cclxuICAgIC8vIOenu+mZpOiiq+aLluaLveeahOiKgueCuVxyXG4gICAgY29uc3QgZHJhZ2dlZERhdGEgPSB0aGlzLnJlbW92ZU5vZGVCeUtleSh0aGlzLm5vZGVzLCBkcmFnTm9kZS5rZXkpO1xyXG4gICAgaWYgKCFkcmFnZ2VkRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIHBvczogMD3lhoXpg6gsIC0xPeS4iuaWuSwgMT3kuIvmlrlcclxuICAgIGlmIChwb3MgPT09IDApIHtcclxuICAgICAgLy8g5pS+5YWl55uu5qCH6IqC54K55YaF6YOo5L2c5Li65a2Q6IqC54K5XHJcbiAgICAgIHRoaXMuYWRkQ2hpbGROb2RlKHRoaXMubm9kZXMsIHRhcmdldE5vZGUua2V5LCBkcmFnZ2VkRGF0YSk7XHJcbiAgICAgIGlmICghdGhpcy5hbkV4cGFuZGVkTm9kZS5pbmNsdWRlcyh0YXJnZXROb2RlLmtleSkpIHtcclxuICAgICAgICB0aGlzLmFuRXhwYW5kZWROb2RlID0gWy4uLnRoaXMuYW5FeHBhbmRlZE5vZGUsIHRhcmdldE5vZGUua2V5XTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5pS+5Zyo55uu5qCH6IqC54K55YmN5ZCOXHJcbiAgICAgIHRoaXMuaW5zZXJ0Tm9kZUJlc2lkZSh0aGlzLm5vZGVzLCB0YXJnZXROb2RlLmtleSwgZHJhZ2dlZERhdGEsIHBvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ub2RlcyA9IFsuLi50aGlzLm5vZGVzXTtcclxuICAgIHRoaXMuc3luY1RyZWVPcHRpb25zRnJvbU5vZGVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKirnp7vpmaTlubbov5Tlm57oioLngrkgKi9cclxuICBwcml2YXRlIHJlbW92ZU5vZGVCeUtleShcclxuICAgIG5vZGVzOiBhbnlbXSxcclxuICAgIHRhcmdldEtleTogc3RyaW5nLFxyXG4gICAgcGFyZW50OiBhbnlbXSA9IG51bGwsXHJcbiAgICBpbmRleDogbnVtYmVyID0gLTFcclxuICApOiBhbnkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobm9kZXNbaV0ua2V5ID09PSB0YXJnZXRLZXkpIHtcclxuICAgICAgICByZXR1cm4gbm9kZXMuc3BsaWNlKGksIDEpWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnJlbW92ZU5vZGVCeUtleShub2Rlc1tpXS5jaGlsZHJlbiwgdGFyZ2V0S2V5LCBub2Rlc1tpXS5jaGlsZHJlbiwgaSk7XHJcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoq5Zyo55uu5qCH6IqC54K55peB6L655o+S5YWl6IqC54K5ICovXHJcbiAgcHJpdmF0ZSBpbnNlcnROb2RlQmVzaWRlKFxyXG4gICAgbm9kZXM6IGFueVtdLFxyXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmcsXHJcbiAgICBuZXdOb2RlOiBhbnksXHJcbiAgICBwb3NpdGlvbjogbnVtYmVyXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChub2Rlc1tpXS5rZXkgPT09IHRhcmdldEtleSkge1xyXG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gcG9zaXRpb24gPT09IC0xID8gaSA6IGkgKyAxO1xyXG4gICAgICAgIG5vZGVzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3Tm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIG5vZGVzW2ldLmNoaWxkcmVuPy5sZW5ndGggJiZcclxuICAgICAgICB0aGlzLmluc2VydE5vZGVCZXNpZGUobm9kZXNbaV0uY2hpbGRyZW4sIHRhcmdldEtleSwgbmV3Tm9kZSwgcG9zaXRpb24pXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirliKTmlq3oioLngrnnmoTlrZDoioLngrnmmK/lkKbmnInooqvpgInkuK3nmoQgKi9cclxuICBoYXNDaGlsZHJlbkNoZWNrZWQobm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAobm9kZS5vcmlnaW4/LmlzQ2hlY2tlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcmlnaW5Ob2RlID0gdGhpcy5maW5kTm9kZUJ5S2V5KHRoaXMubm9kZXMsIG5vZGUua2V5KTtcclxuICAgIGlmICghb3JpZ2luTm9kZT8uY2hpbGRyZW4/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oYXNBbnlDaGlsZENoZWNrZWQob3JpZ2luTm9kZS5jaGlsZHJlbik7XHJcbiAgfVxyXG5cclxuICAvKirpgJLlvZLmo4Dmn6XlrZDoioLngrnmmK/lkKbmnInooqvpgInkuK3nmoQgKi9cclxuICBwcml2YXRlIGhhc0FueUNoaWxkQ2hlY2tlZChjaGlsZHJlbjogYW55W10pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgaWYgKGNoaWxkLmlzQ2hlY2tlZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGlsZC5jaGlsZHJlbj8ubGVuZ3RoICYmIHRoaXMuaGFzQW55Q2hpbGRDaGVja2VkKGNoaWxkLmNoaWxkcmVuKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKirmoLnmja4ga2V5IOafpeaJvuiKgueCuSAqL1xyXG4gIHByaXZhdGUgZmluZE5vZGVCeUtleShub2RlczogYW55W10sIGtleTogc3RyaW5nKTogYW55IHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xyXG4gICAgICBpZiAobm9kZS5rZXkgPT09IGtleSkge1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZE5vZGVCeUtleShub2RlLmNoaWxkcmVuLCBrZXkpO1xyXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl1bZGF0YS1pbmRldGVybWluYXRlXScpO1xyXG4gICAgY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmRldGVybWluYXRlID0gY2hlY2tib3guZ2V0QXR0cmlidXRlKCdkYXRhLWluZGV0ZXJtaW5hdGUnKSA9PT0gJ3RydWUnO1xyXG4gICAgICBjaGVja2JveC5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1FbnRpdHlcIj5cclxuICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImZvcm1Db25maWd1cmF0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBcIj57eydBYnBEeW5hbWljRm9ybTo6Tm9kZXMnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaGFzQW55Tm9kZVdpdGhDaGlsZHJlbigpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodCBtcy0yXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiLS1icy1idG4tcGFkZGluZy15OiAuMjVyZW07IC0tYnMtYnRuLXBhZGRpbmcteDogLjVyZW07IC0tYnMtYnRuLWZvbnQtc2l6ZTogLjc1cmVtO1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwidG9nZ2xlRXhwYW5kQWxsKClcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJpc0FsbEV4cGFuZGVkID8gJ2ZhLWNvbXByZXNzJyA6ICdmYS1leHBhbmQnXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhcmsgc29mdCBtcy0yIGZsb2F0LWVuZFwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiYWRkTm9kZUJ0bigpXCI+e3snQWJwRHluYW1pY0Zvcm06OkFkZE5vZGUnIHxcclxuICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIgcC0yIHJvdW5kZWQtMiBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8YWJwLXRyZWUgY2xhc3M9XCJtYi0yXCIgW25vZGVzXT1cIm5vZGVzXCIgW2NoZWNrYWJsZV09XCJmYWxzZVwiIChkcm9wT3Zlcik9XCJkcm9wT3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobnpFeHBhbmRDaGFuZ2UpPVwibnpFeHBhbmRDaGFuZ2UoJGV2ZW50KVwiIFtleHBhbmRlZEtleXNdPVwiYW5FeHBhbmRlZE5vZGVcIiBbZHJhZ2dhYmxlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21lbnUgbGV0LW5vZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImVkaXRJdGVtQnRuKG5vZGUpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiBtZS0xIGZhIGZhLXBlbmNpbFwiPjwvaT57eydBYnBVaTo6RWRpdCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrLnN0b3ApPVwiY3JlYXRlQ2hpbGRJdGVtQnRuKG5vZGUpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiBtZS0xIGZhIGZhLXBsdXNcIj48L2k+e3snQWJwRHluYW1pY0Zvcm06OkFkZFN1Yk5vZGUnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImRlbGV0ZU1lbnVJdGVtQnRuKG5vZGUpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiBtZS0xIGZhIGZhLXJlbW92ZVwiPjwvaT57eydBYnBVaTo6RGVsZXRlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGFicFRyZWVOb2RlVGVtcGxhdGUgbGV0LW5vZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInRvZ2dsZU5vZGVDaGVja2VkKCRldmVudCwgbm9kZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJub2RlLm9yaWdpbj8uaXNDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV0ZXJtaW5hdGVdPVwiaGFzQ2hpbGRyZW5DaGVja2VkKG5vZGUpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bm9kZS50aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGFicFRyZWVFeHBhbmRlZEljb25UZW1wbGF0ZSBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwibm9kZS5jaGlsZHJlbi5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGUuaXNFeHBhbmRlZCA/IG1pbnVzSWNvbiA6IHBsdXNJY29uXCI+PC9uZy1jb250YWluZXI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWludXNJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuNSAwYzYuMzQ3IDAgMTEuNSA1LjE1MyAxMS41IDExLjVzLTUuMTUzIDExLjUtMTEuNSAxMS41LTExLjUtNS4xNTMtMTEuNS0xMS41IDUuMTUzLTExLjUgMTEuNS0xMS41em0wIDFjNS43OTUgMCAxMC41IDQuNzA1IDEwLjUgMTAuNXMtNC43MDUgMTAuNS0xMC41IDEwLjUtMTAuNS00LjcwNS0xMC41LTEwLjUgNC43MDUtMTAuNSAxMC41LTEwLjV6bS02LjUgMTBoMTN2MWgtMTN2LTF6XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbHVzSWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMGM2LjM0NyAwIDExLjUgNS4xNTMgMTEuNSAxMS41cy01LjE1MyAxMS41LTExLjUgMTEuNS0xMS41LTUuMTUzLTExLjUtMTEuNSA1LjE1My0xMS41IDExLjUtMTEuNXptMCAxYzUuNzk1IDAgMTAuNSA0LjcwNSAxMC41IDEwLjVzLTQuNzA1IDEwLjUtMTAuNSAxMC41LTEwLjUtNC43MDUtMTAuNS0xMC41IDQuNzA1LTEwLjUgMTAuNS0xMC41em0uNSAxMGg2djFoLTZ2NmgtMXYtNmgtNnYtMWg2di02aDF2NnpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9hYnAtdHJlZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJub2Rlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtbXV0ZWQgXCI+e3snQWJwRHluYW1pY0Zvcm06OlBsZWFzZUFkZE5vZGUnIHxcclxuICAgICAgICAgICAgICAgICAgICBhYnBMb2NhbGl6YXRpb259fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlRyZWVPcHRpb25zPy5lcnJvcnM/LnJlcXVpcmVkXCIgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIFwiPlxyXG4gICAgICAgICAgICAgICAge3snQWJwVmFsaWRhdGlvbjo6VGhpc0ZpZWxkSXNSZXF1aXJlZC4nIHwgYWJwTG9jYWxpemF0aW9uOiAnTm9kZXMnfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInRvZ2dsZU11bHRpcGxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIlRyZWVWaWV3Lk11bHRpcGxlXCIgaWQ9XCJNdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cIk11bHRpcGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snQWJwRHluYW1pY0Zvcm06Ok11bHRpcGxlJyB8IGFicExvY2FsaXphdGlvbn19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoYWJwSW5pdCk9XCJzdWJtaXRjbGljaz8ubmF0aXZlRWxlbWVudD8uY2xpY2soKVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxyXG4gICAgICAgICAgICAjc3VibWl0Y2xpY2s+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5cclxuXHJcbjwhLS0gW29wdGlvbnNdPVwieyBzaXplOiBDdXJyZW50U2VsZWN0aW9uVGFibGVDb250cm9sTmFtZT09PSdNYXRyaXgnPyd4bCc6JycgLHNjcm9sbGFibGU6ZmFsc2UgfVwiICh2aXNpYmxlQ2hhbmdlKT1cInRhYmxlU2VsZWN0VmlzaWJsZUNoYW5nZSgkZXZlbnQpXCItLT5cclxuPGFicC1tb2RhbCBbKHZpc2libGUpXT1cImlzVmlzaWJsZVwiIFtidXN5XT1cIm1vZGFsQnVzeVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+XHJcbiAgICAgICAgPGgzPnt7aXNDcmVhdGVDaGlsZCA/ICgnQWJwRHluYW1pY0Zvcm06OkFkZFN1Yk5vZGUnIHwgYWJwTG9jYWxpemF0aW9uKSA6IChzZWxlY3RUcmVlID8gKCdBYnBVaTo6RWRpdCcgfFxyXG4gICAgICAgICAgICBhYnBMb2NhbGl6YXRpb24pIDogKCdDbXM6Ok5ldycgfCBhYnBMb2NhbGl6YXRpb24pKX19PC9oMz5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI2FicEJvZHk+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNsb2FkZXJSZWY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxpIGNsYXNzPVwiZmEgZmEtcHVsc2UgZmEtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlRm9ybTsgZWxzZSBsb2FkZXJSZWZcIj5cclxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJzaXRlcy1tb2RhbC1mb3JtXCIgI215Rm9ybT1cIm5nRm9ybVwiIFtmb3JtR3JvdXBdPVwibm9kZUZvcm1cIiAoc3VibWl0KT1cImNyZWF0ZU9yRWRpdFNhdmUoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgI25vZGVNb2RhbFN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7ICdBYnBEeW5hbWljRm9ybTo6Tm9kZUl0ZW1UZXh0JyB8IGFicExvY2FsaXphdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJkaXNQbGF5TmFtZUlucHV0Qmx1cigkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyAnQWJwRHluYW1pY0Zvcm06OlNlbGVjdExpc3RJdGVtVmFsdWUnIHwgYWJwTG9jYWxpemF0aW9uIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImtleVwiIFtwbGFjZWhvbGRlcl09XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNDaGVja2VkXCIgaWQ9XCJpc1NlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJpc1NlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBYnBEeW5hbWljRm9ybTo6U2VsZWN0ZWQnIHwgYWJwTG9jYWxpemF0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlICNhYnBGb290ZXI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGFicENsb3NlPnt7J0FicFVpOjpDbG9zZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxyXG4gICAgICAgIDxhYnAtYnV0dG9uIGljb25DbGFzcz1cImZhIGZhLWNoZWNrXCIgW2Rpc2FibGVkXT1cIiFub2RlRm9ybS52YWxpZFwiXHJcbiAgICAgICAgICAgIChhYnBDbGljayk9XCJub2RlTW9kYWxTdWJtaXQubmF0aXZlRWxlbWVudC5jbGljaygpXCI+e3snQWJwVWk6OlNhdmUnIHxcclxuICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9ufX08L2FicC1idXR0b24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L2FicC1tb2RhbD4iXX0=