@rangertechnologies/ngnxt 2.1.251 → 2.1.253

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.
Files changed (49) hide show
  1. package/esm2022/environments/version.mjs +2 -2
  2. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +7 -9
  3. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +6 -9
  4. package/esm2022/lib/components/datatable/datatable.component.mjs +3 -3
  5. package/esm2022/lib/components/file-upload/file-upload.component.mjs +6 -9
  6. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +3 -3
  7. package/esm2022/lib/components/pick-location/pick-location.component.mjs +9 -13
  8. package/esm2022/lib/components/search-box/search-box.component.mjs +8 -11
  9. package/esm2022/lib/nxt-app.module.mjs +6 -30
  10. package/esm2022/lib/pages/booklet/booklet.component.mjs +7 -4
  11. package/esm2022/lib/pages/builder/element/element.component.mjs +7 -30
  12. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +3 -3
  13. package/esm2022/lib/pages/builder/properties/properties.component.mjs +24 -3
  14. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +10 -13
  15. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +9 -13
  16. package/esm2022/lib/services/form-builder/form-builder.service.mjs +38 -23
  17. package/esm2022/public-api.mjs +1 -4
  18. package/fesm2022/rangertechnologies-ngnxt.mjs +120 -382
  19. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  20. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +1 -3
  21. package/lib/components/custom-radio/custom-radio.component.d.ts +1 -3
  22. package/lib/components/file-upload/file-upload.component.d.ts +1 -3
  23. package/lib/components/pick-location/pick-location.component.d.ts +1 -3
  24. package/lib/components/search-box/search-box.component.d.ts +1 -3
  25. package/lib/nxt-app.module.d.ts +14 -16
  26. package/lib/pages/builder/properties/properties.component.d.ts +1 -0
  27. package/lib/pages/questionbook/questionbook.component.d.ts +2 -4
  28. package/lib/pages/questionnaire/questionnaire.component.d.ts +1 -3
  29. package/lib/services/form-builder/form-builder.service.d.ts +0 -1
  30. package/package.json +1 -1
  31. package/public-api.d.ts +0 -2
  32. package/rangertechnologies-ngnxt-2.1.253.tgz +0 -0
  33. package/esm2022/lib/ar.i18n.mjs +0 -29
  34. package/esm2022/lib/en.i18n.mjs +0 -29
  35. package/esm2022/lib/i18n-config.service.mjs +0 -4
  36. package/esm2022/lib/i18n.component.mjs +0 -45
  37. package/esm2022/lib/i18n.module.mjs +0 -38
  38. package/esm2022/lib/i18n.pipe.mjs +0 -26
  39. package/esm2022/lib/i18n.service.mjs +0 -56
  40. package/esm2022/lib/tam.i18n.mjs +0 -29
  41. package/lib/ar.i18n.d.ts +0 -24
  42. package/lib/en.i18n.d.ts +0 -24
  43. package/lib/i18n-config.service.d.ts +0 -2
  44. package/lib/i18n.component.d.ts +0 -11
  45. package/lib/i18n.module.d.ts +0 -9
  46. package/lib/i18n.pipe.d.ts +0 -10
  47. package/lib/i18n.service.d.ts +0 -14
  48. package/lib/tam.i18n.d.ts +0 -24
  49. package/rangertechnologies-ngnxt-2.1.251.tgz +0 -0
@@ -766,6 +766,27 @@ export class PropertiesComponent {
766
766
  });
767
767
  this.formBuilderService.elementUpdate(this.selectedElementIndex(), this.selectedElement());
768
768
  }
769
+ optionTranslationUpdate(option, event) {
770
+ //SKS28JUL25 Refresh the book signal from service
771
+ const updatedBook = this.formBuilderService.getBook();
772
+ this.book.set(updatedBook);
773
+ // Work with a mutable copy
774
+ const currentBook = this.book();
775
+ const translationMap = currentBook.translationMap || {};
776
+ const currentLang = this.translationService.getFormBuilderLanguage();
777
+ //SKS28JUL25 Ensure nested structure exists
778
+ if (!translationMap[currentLang])
779
+ translationMap[currentLang] = {};
780
+ if (!translationMap[currentLang][option.id])
781
+ translationMap[currentLang][option.id] = {};
782
+ // Set the translated value
783
+ translationMap[currentLang][option.id]['value'] = event;
784
+ // Update book and re-set the signal
785
+ currentBook.translationMap = translationMap;
786
+ this.book.set(currentBook); // Trigger reactive update
787
+ //SKS28JUL25 Update in service if needed
788
+ this.formBuilderService.updateBook(currentBook);
789
+ }
769
790
  getStyleKeys() {
770
791
  const style = this.selectedElement()?.style;
771
792
  return style && typeof style === 'object' ? Object.keys(style) : [];
@@ -1045,11 +1066,11 @@ export class PropertiesComponent {
1045
1066
  return this.getValueByPath(subProp.key, element);
1046
1067
  }
1047
1068
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, deps: [{ token: i1.FormBuilderService }, { token: i2.TemplateService }, { token: i3.TranslationService }], target: i0.ɵɵFactoryTarget.Component });
1048
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: PropertiesComponent, isStandalone: true, selector: "app-properties", inputs: { templateSelected: "templateSelected", selectedElementType: "selectedElementType" }, outputs: { formButtonHandler: "formButtonHandler", templateSaveHandler: "templateSaveHandler" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'attributes'}\" (click)=\"setActiveTab('attributes')\">{{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'property'}\" (click)=\"setActiveTab('property')\">{{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'appearance'}\" (click)=\"setActiveTab('appearance')\">{{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}</div>\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'attributes'\">\n @defer (when getProperties()) {\n <div>\n @defer (when selectedElement()?.type === 'Image') {\n <image-cropper\n *ngIf=\"selectedElement().imageData\"\n [imageBase64]=\"selectedElement().orgImageData\"\n [disabled]=\"false\"\n [alignImage]=\"alignImage\"\n [roundCropper]=\"roundCropper\"\n [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\"\n [allowMoveImage]=\"false\"\n [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation()\"\n [aspectRatio]=\"aspectRatio\"\n [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\"\n [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\"\n [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\"\n [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\"\n [resetCropOnAspectRatioChange]=\"true\"\n [(cropper)]=\"cropper\"\n [(transform)]=\"transform\"\n [onlyScaleDown]=\"true\"\n output=\"blob\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (cropperReady)=\"cropperReady($event)\"\n ></image-cropper>\n <div *ngIf=\"selectedElement().imageData\" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [ngClass]=\"{'enabled': transform().flipH}\" title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [ngClass]=\"{'enabled': transform().flipV}\" title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n }\n <div *ngIf=\"selectedElement()?.type === 'Book'\">\n <label class=\"text-sm\">{{ 'SEARCH_BOOK' | nxtCustomTranslate : 'Search Book' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box\n [question]=\"selectedElement()\"\n [apiMeta]=\"bookSubtext()\"\n [placeHolderText]=\"'SEARCH' | nxtCustomTranslate : 'Search...'\"\n (searchValueChange)=\"childEventCapture($event.value)\"\n ></nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen()\" #dropdown>\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().endpoint\" (ngModelChange)=\"updateBookSubtext('endpoint', $event)\" />\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().variable\" (ngModelChange)=\"updateBookSubtext('variable', $event)\" />\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString()\" (ngModelChange)=\"updateField($event)\" />\n <label>{{ 'DEFAULT_FIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().defaultField\" (ngModelChange)=\"updateBookSubtext('defaultField', $event)\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.elementProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.key === 'helpText' && selectedElement()?.helpText\">{{ selectedElement()?.helpText }}</div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <input *ngIf=\"prop.type === 'number'\"\n type=\"number\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n <select *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n </div>\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n <div\n *ngIf=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n >\n <div *ngFor=\"let subProp of prop.subQuestion\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName, $event.target.checked)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"radio\"\n [name]=\"subProp.key\"\n [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <input\n *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [ngModel]=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) : (selectedElement() | getValueByPath : subProp.key)) : (selectedElement() | getValueByPath : subProp.key)\"\n (ngModelChange)=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event,false, prop.isTranslate) : setValueByPath(subProp.key, $event)) : setValueByPath(subProp.key, $event, prop.isTranslate)\"\n />\n <input\n *ngIf=\"subProp.type === 'boolean'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n <select\n *ngIf=\"subProp.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? (getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, subProp.isTableColumn)) : (selectedElement() | getValueByPath : subProp.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of subProp.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"subProp.type === 'checkbox'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" [ngClass]=\"{'active': selectedElement()?.textAlign === option.value}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\" [ngClass]=\"{'active': isStyleActive(option.value)}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'color'\">\n <input\n type=\"color\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n </div>\n <div *ngIf=\"prop.key === 'title'\" style=\"margin-top: 15px; border: 1px solid #ddd; padding: 20px; border-radius: 12px; background-color: #f9f9f9;\">\n <div class=\"form-header\">\n <label class=\"form-label\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <button (click)=\"addNewButton()\" class=\"add-button\">+ {{ 'ADD_BUTTON' | nxtCustomTranslate : 'Add Button' }}</button>\n </div>\n <div *ngFor=\"let btn of book()?.questionbook?.action || []; let i = index\" class=\"button-config-card\">\n <div class=\"form-group\">\n <label>{{ 'BUTTON_NAME' | nxtCustomTranslate : 'Button Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.name\" (ngModelChange)=\"onButtonPropertyChange(i, 'name', $event,true)\" placeholder=\"Enter button name\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'EVENT_NAME' | nxtCustomTranslate : 'Event Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.eventtoemit\" (ngModelChange)=\"onButtonPropertyChange(i, 'eventtoemit', $event)\" placeholder=\"Event to emit\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'ALT' | nxtCustomTranslate : 'Alt' }}</label>\n <input type=\"text\" [ngModel]=\"btn.alt\" (ngModelChange)=\"onButtonPropertyChange(i, 'alt', $event)\" placeholder=\"Button alt text\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}</label>\n <input type=\"text\" [ngModel]=\"btn.endpoint\" (ngModelChange)=\"onButtonPropertyChange(i, 'endpoint', $event)\" placeholder=\"API endpoint\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'METHOD' | nxtCustomTranslate : 'Method' }}</label>\n <select [ngModel]=\"btn.method\" (ngModelChange)=\"onButtonPropertyChange(i, 'method', $event)\">\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"DELETE\">DELETE</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BACKGROUND_COLOR' | nxtCustomTranslate : 'Background Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.bgColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'bgColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'BORDER_RADIUS' | nxtCustomTranslate : 'Border Radius' }}</label>\n <input type=\"range\" min=\"0\" max=\"50\" [ngModel]=\"btn.borderRadius\" (ngModelChange)=\"onButtonPropertyChange(i, 'borderRadius', $event)\">\n <span>{{ btn.borderRadius }}px</span>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BUTTON_WIDTH_PX' | nxtCustomTranslate : 'Button Width (px)' }}</label>\n <input type=\"number\" [ngModel]=\"btn.width\" (ngModelChange)=\"onButtonPropertyChange(i, 'width', $event)\" min=\"50\" placeholder=\"Enter width in px\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'TEXT_COLOR' | nxtCustomTranslate : 'Text Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.textColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'textColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'POSITION_PERCENT' | nxtCustomTranslate : 'Position (%)' }}</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"btn.positionPercent\" (ngModelChange)=\"onButtonPropertyChange(i, 'positionPercent', $event)\">\n <span>{{ btn.positionPercent }}%</span>\n </div>\n <button (click)=\"removeButton(btn)\" class=\"remove-button\">\u00D7 {{ 'REMOVE' | nxtCustomTranslate : 'Remove' }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'property'\">\n @defer (when getProperties()) {\n <div>\n <label>Label Id</label>\n <div style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect() ? bookId() : selectedElement()?.id }}\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.fieldProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isOptional')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isOptional', $event)\"\n />\n {{ 'REQUIRED' | nxtCustomTranslate : 'Required' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isReadOnly')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isReadOnly', $event)\"\n />\n {{ 'READ_ONLY' | nxtCustomTranslate : 'Read Only' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isHidden')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isHidden', $event)\"\n />\n {{ 'IS_HIDE' | nxtCustomTranslate : 'Is Hide' }}\n </label>\n </div>\n </div>\n <div *ngIf=\" prop.type === 'checkbox' || prop.type === 'radio' || prop.key === 'options'\" class=\"options-container\">\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key] ; let i = index\" class=\"option-items\" [attr.data-id]=\"option.id\" draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n <input type=\"text\" [ngModel]=\"option.value\" (ngModelChange)=\"option.value = $event\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement()[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n <button (click)=\"addOption(selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>{{ 'ADD' | nxtCustomTranslate : 'Add' }}</span>\n </div>\n </button>\n </div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isExpanded\" style=\"border: 1px solid #ddd; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion; trackBy: trackByProp\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <input *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [value]=\"getOptimizedSubPropValue(subProp)\"\n (input)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event.target.value, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\" />\n \n <!-- AP-02APR25 Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">{{ 'STYLE' | nxtCustomTranslate : 'Style' }}</div>\n <img [src]=\"isStyleExpanded() ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\" alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isStyleExpanded()\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input\n type=\"text\"\n [value]=\"selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(),'style.' + key, true) : (selectedElement() | getValueByPath : 'style.' + key)\"\n (input)=\"(selectedElement()?.type === 'Table' && selectColumn() ) ? updateValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), 'style.' + key, $event.target.value, true) : setValueByPath('style.' + key, $event.target.value)\"\n placeholder=\"Enter {{ key }}\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'appearance'\">\n @defer (when getProperties()) {\n <div>\n <ng-container *ngFor=\"let prop of getProperties()?.appearance; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <select\n *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n\n <div class=\"flex-container\">\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input\n type=\"color\"\n [ngModel]=\"selectedElement()?.fontColor\"\n (ngModelChange)=\"setValueByPath('fontColor', $event, prop.isTranslate)\"\n >\n </div>\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>{{ 'HEX_CODE' | nxtCustomTranslate : 'HEX Code' }}</span>\n <input\n type=\"text\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n </div>\n </div>\n <div *ngIf=\"prop.type === 'button-toggle'\" class=\"button-toggle-wrapper\">\n <button\n type=\"button\"\n class=\"toggle-button\"\n (click)=\"duplicateField(selectedElement())\"\n >\n {{ 'ADD_DUPLICATE' | nxtCustomTranslate : 'Add Duplicate' }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">{{ 'CANCEL' | nxtCustomTranslate : 'Cancel' }}</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">{{ 'SAVE' | nxtCustomTranslate : 'Save' }}</button>\n </div>\n\n <div class=\"button-container\" *ngIf=\"templateSelected\" style=\"margin-top: 20px;\">\n <button class=\"save-btn\" (click)=\"handleTemplateSave()\">{{ 'SAVE_TEMPLATE' | nxtCustomTranslate : 'Save Template' }}</button>\n </div>\n</div>", styles: ["*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.container{width:100%;max-width:500px;margin:0 auto;background:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.toggle-header,.style-toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px;background:#f8f8f8;border:1px solid #ddd;border-radius:6px;margin-bottom:6px}.tabs{display:flex;background:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:80vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:block;font-size:14px;font-weight:500;color:#444;margin-bottom:8px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],input[type=number],select,textarea{width:100%;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:all .3s;background:#f8f8f8}input:focus,select:focus,textarea:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}textarea{min-height:55px;resize:vertical}button,.btn{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:all .3s}button:hover,.btn:hover{background:#0056b3;transform:translateY(-2px)}.add-button{padding:8px 14px;background:#0954c5;border-radius:8px}.remove-button{background:#e74c3c;padding:6px 12px;margin-top:10px}.remove-button:hover{background:#c0392b}.cancel-btn{background:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.save-btn{background:#0052cc}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;gap:10px;padding:8px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.color-picker-row,.color-picker-container{display:flex;align-items:center}.color-picker-container{border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box,.color-selector input[type=color]{width:78px;height:40px;border:none;border-radius:4px;cursor:pointer}.hex-input-container{display:flex;gap:20px;align-items:center;font-size:12px;color:#b0b0b0}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input,.hex-input-container input[type=text]{width:120px;padding:10px 12px;border:1px solid #d1d1d1;color:#28343e}.hex-label{color:#999;margin-right:5px}.select-container,.input-box-field{position:relative;width:100%}.dropdown-arrow,.input-box-field:after{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.input-box-field:after{content:\"\\25bc\";color:#1c1b1f;font-size:10px}.input-box-field select{background:#28343e;color:#fff;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.input-box-field select::-ms-expand{display:none}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}.options-container{display:flex;flex-direction:column;gap:12px}.field-size-controls,.flex-container{display:flex;align-items:center;gap:12px}.flex-container{margin-bottom:1rem}.size-input{width:110px;text-align:center}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background:#4caf50}.view-icon{background:#2196f3}.delete-icon{background:#f44336}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background:#d0d9ff;border-radius:4px}.link-icon{background:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:all .3s}.link-icon:hover{background:#d0e5ff}.link-icon:active{background:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.option-items:active{opacity:.5}.drag-handle{margin-left:10px;cursor:grab}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background:#2c6dd5}.button-config-card{background:#fff;padding:15px;border-radius:12px;border:1px solid #ccc;margin-top:20px;box-shadow:0 2px 8px #0000000d}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.button-container{display:flex;padding:15px;background:#f9f9f9;border-top:1px solid #eee}.button-container .cancel-btn,.button-container .save-btn{flex:1;padding:12px;font-weight:700}.divider{border-top:1px dashed #ddd;margin:20px 0}input{width:auto}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{padding:1rem;font-size:.9rem}.form-group,.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{flex-direction:column;grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [i4.NgClass, i4.NgForOf, i4.NgIf, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.NumberValueAccessor, i5.RangeValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.MinValidator, i5.NgModel, import("../../../components/search-box/search-box.component").then(m => m.NxtSearchBox), GetValueByPathPipe, NxtCustomTranslatePipe], () => [i4.NgClass, i4.NgIf, import("../../../components/image-cropper/component/image-cropper.component").then(m => m.ImageCropperComponent), NxtCustomTranslatePipe], () => [i4.NgForOf, i4.NgIf, i5.DefaultValueAccessor, i5.NgControlStatus, i5.NgModel, GetValueByPathPipe, NxtCustomTranslatePipe], () => [i4.NgForOf, i4.NgIf, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, GetValueByPathPipe, NxtCustomTranslatePipe]] });
1069
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: PropertiesComponent, isStandalone: true, selector: "app-properties", inputs: { templateSelected: "templateSelected", selectedElementType: "selectedElementType" }, outputs: { formButtonHandler: "formButtonHandler", templateSaveHandler: "templateSaveHandler" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'attributes'}\" (click)=\"setActiveTab('attributes')\">{{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'property'}\" (click)=\"setActiveTab('property')\">{{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'appearance'}\" (click)=\"setActiveTab('appearance')\">{{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}</div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'attributes'\">\n @defer (when getProperties()) {\n <div>\n @defer (when selectedElement()?.type === 'Image') {\n <image-cropper\n *ngIf=\"selectedElement().imageData\"\n [imageBase64]=\"selectedElement().orgImageData\"\n [disabled]=\"false\"\n [alignImage]=\"alignImage\"\n [roundCropper]=\"roundCropper\"\n [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\"\n [allowMoveImage]=\"false\"\n [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation()\"\n [aspectRatio]=\"aspectRatio\"\n [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\"\n [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\"\n [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\"\n [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\"\n [resetCropOnAspectRatioChange]=\"true\"\n [(cropper)]=\"cropper\"\n [(transform)]=\"transform\"\n [onlyScaleDown]=\"true\"\n output=\"blob\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (cropperReady)=\"cropperReady($event)\"\n ></image-cropper>\n <div *ngIf=\"selectedElement().imageData\" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [ngClass]=\"{'enabled': transform().flipH}\" title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [ngClass]=\"{'enabled': transform().flipV}\" title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n }\n <div *ngIf=\"selectedElement()?.type === 'Book'\">\n <label class=\"text-sm\">{{ 'SEARCH_BOOK' | nxtCustomTranslate : 'Search Book' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box\n [question]=\"selectedElement()\"\n [apiMeta]=\"bookSubtext()\"\n [placeHolderText]=\"'SEARCH' | nxtCustomTranslate : 'Search...'\"\n (searchValueChange)=\"childEventCapture($event.value)\"\n ></nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen()\" #dropdown>\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().endpoint\" (ngModelChange)=\"updateBookSubtext('endpoint', $event)\" />\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().variable\" (ngModelChange)=\"updateBookSubtext('variable', $event)\" />\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString()\" (ngModelChange)=\"updateField($event)\" />\n <label>{{ 'DEFAULT_FIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().defaultField\" (ngModelChange)=\"updateBookSubtext('defaultField', $event)\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.elementProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.key === 'helpText' && selectedElement()?.helpText\">{{ selectedElement()?.helpText }}</div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <input *ngIf=\"prop.type === 'number'\"\n type=\"number\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n <select *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n </div>\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n <div\n *ngIf=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n >\n <div *ngFor=\"let subProp of prop.subQuestion\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName, $event.target.checked)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"radio\"\n [name]=\"subProp.key\"\n [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <input\n *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [ngModel]=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) : (selectedElement() | getValueByPath : subProp.key)) : (selectedElement() | getValueByPath : subProp.key)\"\n (ngModelChange)=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event,false, prop.isTranslate) : setValueByPath(subProp.key, $event)) : setValueByPath(subProp.key, $event, prop.isTranslate)\"\n />\n <input\n *ngIf=\"subProp.type === 'boolean'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n <select\n *ngIf=\"subProp.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? (getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, subProp.isTableColumn)) : (selectedElement() | getValueByPath : subProp.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of subProp.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"subProp.type === 'checkbox'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" [ngClass]=\"{'active': selectedElement()?.textAlign === option.value}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\" [ngClass]=\"{'active': isStyleActive(option.value)}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'color'\">\n <input\n type=\"color\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n </div>\n <div *ngIf=\"prop.key === 'title'\" style=\"margin-top: 15px; border: 1px solid #ddd; padding: 20px; border-radius: 12px; background-color: #f9f9f9;\">\n <div class=\"form-header\">\n <label class=\"form-label\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <button (click)=\"addNewButton()\" class=\"add-button\">+ {{ 'ADD_BUTTON' | nxtCustomTranslate : 'Add Button' }}</button>\n </div>\n <div *ngFor=\"let btn of book()?.questionbook?.action || []; let i = index\" class=\"button-config-card\">\n <div class=\"form-group\">\n <label>{{ 'BUTTON_NAME' | nxtCustomTranslate : 'Button Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.name\" (ngModelChange)=\"onButtonPropertyChange(i, 'name', $event,true)\" placeholder=\"Enter button name\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'EVENT_NAME' | nxtCustomTranslate : 'Event Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.eventtoemit\" (ngModelChange)=\"onButtonPropertyChange(i, 'eventtoemit', $event)\" placeholder=\"Event to emit\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'ALT' | nxtCustomTranslate : 'Alt' }}</label>\n <input type=\"text\" [ngModel]=\"btn.alt\" (ngModelChange)=\"onButtonPropertyChange(i, 'alt', $event)\" placeholder=\"Button alt text\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}</label>\n <input type=\"text\" [ngModel]=\"btn.endpoint\" (ngModelChange)=\"onButtonPropertyChange(i, 'endpoint', $event)\" placeholder=\"API endpoint\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'METHOD' | nxtCustomTranslate : 'Method' }}</label>\n <select [ngModel]=\"btn.method\" (ngModelChange)=\"onButtonPropertyChange(i, 'method', $event)\">\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"DELETE\">DELETE</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BACKGROUND_COLOR' | nxtCustomTranslate : 'Background Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.bgColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'bgColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'BORDER_RADIUS' | nxtCustomTranslate : 'Border Radius' }}</label>\n <input type=\"range\" min=\"0\" max=\"50\" [ngModel]=\"btn.borderRadius\" (ngModelChange)=\"onButtonPropertyChange(i, 'borderRadius', $event)\">\n <span>{{ btn.borderRadius }}px</span>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BUTTON_WIDTH_PX' | nxtCustomTranslate : 'Button Width (px)' }}</label>\n <input type=\"number\" [ngModel]=\"btn.width\" (ngModelChange)=\"onButtonPropertyChange(i, 'width', $event)\" min=\"50\" placeholder=\"Enter width in px\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'TEXT_COLOR' | nxtCustomTranslate : 'Text Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.textColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'textColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'POSITION_PERCENT' | nxtCustomTranslate : 'Position (%)' }}</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"btn.positionPercent\" (ngModelChange)=\"onButtonPropertyChange(i, 'positionPercent', $event)\">\n <span>{{ btn.positionPercent }}%</span>\n </div>\n <button (click)=\"removeButton(btn)\" class=\"remove-button\">\u00D7 {{ 'REMOVE' | nxtCustomTranslate : 'Remove' }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'property'\">\n @defer (when getProperties()) {\n <div>\n <label>Label Id</label>\n <div style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect() ? bookId() : selectedElement()?.id }}\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.fieldProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isOptional')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isOptional', $event)\"\n />\n {{ 'REQUIRED' | nxtCustomTranslate : 'Required' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isReadOnly')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isReadOnly', $event)\"\n />\n {{ 'READ_ONLY' | nxtCustomTranslate : 'Read Only' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isHidden')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isHidden', $event)\"\n />\n {{ 'IS_HIDE' | nxtCustomTranslate : 'Is Hide' }}\n </label>\n </div>\n </div>\n <div *ngIf=\" prop.type === 'checkbox' || prop.type === 'radio' || prop.key === 'options'\" class=\"options-container\">\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key] ; let i = index\" class=\"option-items\" [attr.data-id]=\"option.id\" draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n <input type=\"text\" [ngModel]=\"option.value\" (ngModelChange)=\"option.value = $event; optionTranslationUpdate(option,$event)\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement()[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n <button (click)=\"addOption(selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>{{ 'ADD' | nxtCustomTranslate : 'Add' }}</span>\n </div>\n </button>\n </div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isExpanded\" style=\"border: 1px solid #ddd; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion; trackBy: trackByProp\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <input *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [value]=\"getOptimizedSubPropValue(subProp)\"\n (input)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event.target.value, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\" />\n \n <!-- AP-02APR25 Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">{{ 'STYLE' | nxtCustomTranslate : 'Style' }}</div>\n <img [src]=\"isStyleExpanded() ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\" alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isStyleExpanded()\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input\n type=\"text\"\n [value]=\"selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(),'style.' + key, true) : (selectedElement() | getValueByPath : 'style.' + key)\"\n (input)=\"(selectedElement()?.type === 'Table' && selectColumn() ) ? updateValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), 'style.' + key, $event.target.value, true) : setValueByPath('style.' + key, $event.target.value)\"\n placeholder=\"Enter {{ key }}\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'appearance'\">\n @defer (when getProperties()) {\n <div>\n <ng-container *ngFor=\"let prop of getProperties()?.appearance; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <select\n *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n\n <div class=\"flex-container\">\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input\n type=\"color\"\n [ngModel]=\"selectedElement()?.fontColor\"\n (ngModelChange)=\"setValueByPath('fontColor', $event, prop.isTranslate)\"\n >\n </div>\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>{{ 'HEX_CODE' | nxtCustomTranslate : 'HEX Code' }}</span>\n <input\n type=\"text\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n </div>\n </div>\n <div *ngIf=\"prop.type === 'button-toggle'\" class=\"button-toggle-wrapper\">\n <button\n type=\"button\"\n class=\"toggle-button\"\n (click)=\"duplicateField(selectedElement())\"\n >\n {{ 'ADD_DUPLICATE' | nxtCustomTranslate : 'Add Duplicate' }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">{{ 'CANCEL' | nxtCustomTranslate : 'Cancel' }}</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">{{ 'SAVE' | nxtCustomTranslate : 'Save' }}</button>\n </div>\n\n <div class=\"button-container\" *ngIf=\"templateSelected\" style=\"margin-top: 20px;\">\n <button class=\"save-btn\" (click)=\"handleTemplateSave()\">{{ 'SAVE_TEMPLATE' | nxtCustomTranslate : 'Save Template' }}</button>\n </div>\n</div>", styles: ["*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.container{width:100%;max-width:500px;margin:0 auto;background:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.toggle-header,.style-toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px;background:#f8f8f8;border:1px solid #ddd;border-radius:6px;margin-bottom:6px}.tabs{display:flex;background:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:80vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:block;font-size:14px;font-weight:500;color:#444;margin-bottom:8px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],input[type=number],select,textarea{width:100%;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:all .3s;background:#f8f8f8}input:focus,select:focus,textarea:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}textarea{min-height:55px;resize:vertical}button,.btn{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:all .3s}button:hover,.btn:hover{background:#0056b3;transform:translateY(-2px)}.add-button{padding:8px 14px;background:#0954c5;border-radius:8px}.remove-button{background:#e74c3c;padding:6px 12px;margin-top:10px}.remove-button:hover{background:#c0392b}.cancel-btn{background:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.save-btn{background:#0052cc}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;gap:10px;padding:8px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.color-picker-row,.color-picker-container{display:flex;align-items:center}.color-picker-container{border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box,.color-selector input[type=color]{width:78px;height:40px;border:none;border-radius:4px;cursor:pointer}.hex-input-container{display:flex;gap:20px;align-items:center;font-size:12px;color:#b0b0b0}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input,.hex-input-container input[type=text]{width:120px;padding:10px 12px;border:1px solid #d1d1d1;color:#28343e}.hex-label{color:#999;margin-right:5px}.select-container,.input-box-field{position:relative;width:100%}.dropdown-arrow,.input-box-field:after{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.input-box-field:after{content:\"\\25bc\";color:#1c1b1f;font-size:10px}.input-box-field select{background:#28343e;color:#fff;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.input-box-field select::-ms-expand{display:none}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}.options-container{display:flex;flex-direction:column;gap:12px}.field-size-controls,.flex-container{display:flex;align-items:center;gap:12px}.flex-container{margin-bottom:1rem}.size-input{width:110px;text-align:center}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background:#4caf50}.view-icon{background:#2196f3}.delete-icon{background:#f44336}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background:#d0d9ff;border-radius:4px}.link-icon{background:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:all .3s}.link-icon:hover{background:#d0e5ff}.link-icon:active{background:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.option-items:active{opacity:.5}.drag-handle{margin-left:10px;cursor:grab}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background:#2c6dd5}.button-config-card{background:#fff;padding:15px;border-radius:12px;border:1px solid #ccc;margin-top:20px;box-shadow:0 2px 8px #0000000d}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.button-container{display:flex;padding:15px;background:#f9f9f9;border-top:1px solid #eee}.button-container .cancel-btn,.button-container .save-btn{flex:1;padding:12px;font-weight:700}.divider{border-top:1px dashed #ddd;margin:20px 0}input{width:auto}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{padding:1rem;font-size:.9rem}.form-group,.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{flex-direction:column;grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [i4.NgClass, i4.NgForOf, i4.NgIf, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.NumberValueAccessor, i5.RangeValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.MinValidator, i5.NgModel, import("../../../components/search-box/search-box.component").then(m => m.NxtSearchBox), GetValueByPathPipe, NxtCustomTranslatePipe], () => [i4.NgClass, i4.NgIf, import("../../../components/image-cropper/component/image-cropper.component").then(m => m.ImageCropperComponent), NxtCustomTranslatePipe], () => [i4.NgForOf, i4.NgIf, i5.DefaultValueAccessor, i5.NgControlStatus, i5.NgModel, GetValueByPathPipe, NxtCustomTranslatePipe], () => [i4.NgForOf, i4.NgIf, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, GetValueByPathPipe, NxtCustomTranslatePipe]] });
1049
1070
  }
1050
1071
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, resolveDeferredDeps: () => [import("../../../components/search-box/search-box.component").then(m => m.NxtSearchBox), import("../../../components/image-cropper/component/image-cropper.component").then(m => m.ImageCropperComponent)], resolveMetadata: (NxtSearchBox, ImageCropperComponent) => ({ decorators: [{
1051
1072
  type: Component,
1052
- args: [{ selector: 'app-properties', standalone: true, imports: [CommonModule, FormsModule, ImageCropperComponent, NxtSearchBox, NgClass, NgFor, NgIf, GetValueByPathPipe, NxtCustomTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'attributes'}\" (click)=\"setActiveTab('attributes')\">{{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'property'}\" (click)=\"setActiveTab('property')\">{{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'appearance'}\" (click)=\"setActiveTab('appearance')\">{{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}</div>\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'attributes'\">\n @defer (when getProperties()) {\n <div>\n @defer (when selectedElement()?.type === 'Image') {\n <image-cropper\n *ngIf=\"selectedElement().imageData\"\n [imageBase64]=\"selectedElement().orgImageData\"\n [disabled]=\"false\"\n [alignImage]=\"alignImage\"\n [roundCropper]=\"roundCropper\"\n [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\"\n [allowMoveImage]=\"false\"\n [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation()\"\n [aspectRatio]=\"aspectRatio\"\n [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\"\n [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\"\n [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\"\n [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\"\n [resetCropOnAspectRatioChange]=\"true\"\n [(cropper)]=\"cropper\"\n [(transform)]=\"transform\"\n [onlyScaleDown]=\"true\"\n output=\"blob\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (cropperReady)=\"cropperReady($event)\"\n ></image-cropper>\n <div *ngIf=\"selectedElement().imageData\" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [ngClass]=\"{'enabled': transform().flipH}\" title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [ngClass]=\"{'enabled': transform().flipV}\" title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n }\n <div *ngIf=\"selectedElement()?.type === 'Book'\">\n <label class=\"text-sm\">{{ 'SEARCH_BOOK' | nxtCustomTranslate : 'Search Book' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box\n [question]=\"selectedElement()\"\n [apiMeta]=\"bookSubtext()\"\n [placeHolderText]=\"'SEARCH' | nxtCustomTranslate : 'Search...'\"\n (searchValueChange)=\"childEventCapture($event.value)\"\n ></nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen()\" #dropdown>\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().endpoint\" (ngModelChange)=\"updateBookSubtext('endpoint', $event)\" />\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().variable\" (ngModelChange)=\"updateBookSubtext('variable', $event)\" />\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString()\" (ngModelChange)=\"updateField($event)\" />\n <label>{{ 'DEFAULT_FIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().defaultField\" (ngModelChange)=\"updateBookSubtext('defaultField', $event)\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.elementProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.key === 'helpText' && selectedElement()?.helpText\">{{ selectedElement()?.helpText }}</div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <input *ngIf=\"prop.type === 'number'\"\n type=\"number\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n <select *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n </div>\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n <div\n *ngIf=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n >\n <div *ngFor=\"let subProp of prop.subQuestion\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName, $event.target.checked)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"radio\"\n [name]=\"subProp.key\"\n [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <input\n *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [ngModel]=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) : (selectedElement() | getValueByPath : subProp.key)) : (selectedElement() | getValueByPath : subProp.key)\"\n (ngModelChange)=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event,false, prop.isTranslate) : setValueByPath(subProp.key, $event)) : setValueByPath(subProp.key, $event, prop.isTranslate)\"\n />\n <input\n *ngIf=\"subProp.type === 'boolean'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n <select\n *ngIf=\"subProp.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? (getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, subProp.isTableColumn)) : (selectedElement() | getValueByPath : subProp.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of subProp.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"subProp.type === 'checkbox'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" [ngClass]=\"{'active': selectedElement()?.textAlign === option.value}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\" [ngClass]=\"{'active': isStyleActive(option.value)}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'color'\">\n <input\n type=\"color\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n </div>\n <div *ngIf=\"prop.key === 'title'\" style=\"margin-top: 15px; border: 1px solid #ddd; padding: 20px; border-radius: 12px; background-color: #f9f9f9;\">\n <div class=\"form-header\">\n <label class=\"form-label\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <button (click)=\"addNewButton()\" class=\"add-button\">+ {{ 'ADD_BUTTON' | nxtCustomTranslate : 'Add Button' }}</button>\n </div>\n <div *ngFor=\"let btn of book()?.questionbook?.action || []; let i = index\" class=\"button-config-card\">\n <div class=\"form-group\">\n <label>{{ 'BUTTON_NAME' | nxtCustomTranslate : 'Button Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.name\" (ngModelChange)=\"onButtonPropertyChange(i, 'name', $event,true)\" placeholder=\"Enter button name\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'EVENT_NAME' | nxtCustomTranslate : 'Event Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.eventtoemit\" (ngModelChange)=\"onButtonPropertyChange(i, 'eventtoemit', $event)\" placeholder=\"Event to emit\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'ALT' | nxtCustomTranslate : 'Alt' }}</label>\n <input type=\"text\" [ngModel]=\"btn.alt\" (ngModelChange)=\"onButtonPropertyChange(i, 'alt', $event)\" placeholder=\"Button alt text\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}</label>\n <input type=\"text\" [ngModel]=\"btn.endpoint\" (ngModelChange)=\"onButtonPropertyChange(i, 'endpoint', $event)\" placeholder=\"API endpoint\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'METHOD' | nxtCustomTranslate : 'Method' }}</label>\n <select [ngModel]=\"btn.method\" (ngModelChange)=\"onButtonPropertyChange(i, 'method', $event)\">\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"DELETE\">DELETE</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BACKGROUND_COLOR' | nxtCustomTranslate : 'Background Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.bgColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'bgColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'BORDER_RADIUS' | nxtCustomTranslate : 'Border Radius' }}</label>\n <input type=\"range\" min=\"0\" max=\"50\" [ngModel]=\"btn.borderRadius\" (ngModelChange)=\"onButtonPropertyChange(i, 'borderRadius', $event)\">\n <span>{{ btn.borderRadius }}px</span>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BUTTON_WIDTH_PX' | nxtCustomTranslate : 'Button Width (px)' }}</label>\n <input type=\"number\" [ngModel]=\"btn.width\" (ngModelChange)=\"onButtonPropertyChange(i, 'width', $event)\" min=\"50\" placeholder=\"Enter width in px\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'TEXT_COLOR' | nxtCustomTranslate : 'Text Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.textColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'textColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'POSITION_PERCENT' | nxtCustomTranslate : 'Position (%)' }}</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"btn.positionPercent\" (ngModelChange)=\"onButtonPropertyChange(i, 'positionPercent', $event)\">\n <span>{{ btn.positionPercent }}%</span>\n </div>\n <button (click)=\"removeButton(btn)\" class=\"remove-button\">\u00D7 {{ 'REMOVE' | nxtCustomTranslate : 'Remove' }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'property'\">\n @defer (when getProperties()) {\n <div>\n <label>Label Id</label>\n <div style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect() ? bookId() : selectedElement()?.id }}\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.fieldProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isOptional')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isOptional', $event)\"\n />\n {{ 'REQUIRED' | nxtCustomTranslate : 'Required' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isReadOnly')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isReadOnly', $event)\"\n />\n {{ 'READ_ONLY' | nxtCustomTranslate : 'Read Only' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isHidden')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isHidden', $event)\"\n />\n {{ 'IS_HIDE' | nxtCustomTranslate : 'Is Hide' }}\n </label>\n </div>\n </div>\n <div *ngIf=\" prop.type === 'checkbox' || prop.type === 'radio' || prop.key === 'options'\" class=\"options-container\">\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key] ; let i = index\" class=\"option-items\" [attr.data-id]=\"option.id\" draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n <input type=\"text\" [ngModel]=\"option.value\" (ngModelChange)=\"option.value = $event\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement()[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n <button (click)=\"addOption(selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>{{ 'ADD' | nxtCustomTranslate : 'Add' }}</span>\n </div>\n </button>\n </div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isExpanded\" style=\"border: 1px solid #ddd; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion; trackBy: trackByProp\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <input *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [value]=\"getOptimizedSubPropValue(subProp)\"\n (input)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event.target.value, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\" />\n \n <!-- AP-02APR25 Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">{{ 'STYLE' | nxtCustomTranslate : 'Style' }}</div>\n <img [src]=\"isStyleExpanded() ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\" alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isStyleExpanded()\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input\n type=\"text\"\n [value]=\"selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(),'style.' + key, true) : (selectedElement() | getValueByPath : 'style.' + key)\"\n (input)=\"(selectedElement()?.type === 'Table' && selectColumn() ) ? updateValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), 'style.' + key, $event.target.value, true) : setValueByPath('style.' + key, $event.target.value)\"\n placeholder=\"Enter {{ key }}\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'appearance'\">\n @defer (when getProperties()) {\n <div>\n <ng-container *ngFor=\"let prop of getProperties()?.appearance; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <select\n *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n\n <div class=\"flex-container\">\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input\n type=\"color\"\n [ngModel]=\"selectedElement()?.fontColor\"\n (ngModelChange)=\"setValueByPath('fontColor', $event, prop.isTranslate)\"\n >\n </div>\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>{{ 'HEX_CODE' | nxtCustomTranslate : 'HEX Code' }}</span>\n <input\n type=\"text\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n </div>\n </div>\n <div *ngIf=\"prop.type === 'button-toggle'\" class=\"button-toggle-wrapper\">\n <button\n type=\"button\"\n class=\"toggle-button\"\n (click)=\"duplicateField(selectedElement())\"\n >\n {{ 'ADD_DUPLICATE' | nxtCustomTranslate : 'Add Duplicate' }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">{{ 'CANCEL' | nxtCustomTranslate : 'Cancel' }}</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">{{ 'SAVE' | nxtCustomTranslate : 'Save' }}</button>\n </div>\n\n <div class=\"button-container\" *ngIf=\"templateSelected\" style=\"margin-top: 20px;\">\n <button class=\"save-btn\" (click)=\"handleTemplateSave()\">{{ 'SAVE_TEMPLATE' | nxtCustomTranslate : 'Save Template' }}</button>\n </div>\n</div>", styles: ["*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.container{width:100%;max-width:500px;margin:0 auto;background:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.toggle-header,.style-toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px;background:#f8f8f8;border:1px solid #ddd;border-radius:6px;margin-bottom:6px}.tabs{display:flex;background:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:80vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:block;font-size:14px;font-weight:500;color:#444;margin-bottom:8px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],input[type=number],select,textarea{width:100%;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:all .3s;background:#f8f8f8}input:focus,select:focus,textarea:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}textarea{min-height:55px;resize:vertical}button,.btn{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:all .3s}button:hover,.btn:hover{background:#0056b3;transform:translateY(-2px)}.add-button{padding:8px 14px;background:#0954c5;border-radius:8px}.remove-button{background:#e74c3c;padding:6px 12px;margin-top:10px}.remove-button:hover{background:#c0392b}.cancel-btn{background:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.save-btn{background:#0052cc}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;gap:10px;padding:8px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.color-picker-row,.color-picker-container{display:flex;align-items:center}.color-picker-container{border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box,.color-selector input[type=color]{width:78px;height:40px;border:none;border-radius:4px;cursor:pointer}.hex-input-container{display:flex;gap:20px;align-items:center;font-size:12px;color:#b0b0b0}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input,.hex-input-container input[type=text]{width:120px;padding:10px 12px;border:1px solid #d1d1d1;color:#28343e}.hex-label{color:#999;margin-right:5px}.select-container,.input-box-field{position:relative;width:100%}.dropdown-arrow,.input-box-field:after{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.input-box-field:after{content:\"\\25bc\";color:#1c1b1f;font-size:10px}.input-box-field select{background:#28343e;color:#fff;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.input-box-field select::-ms-expand{display:none}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}.options-container{display:flex;flex-direction:column;gap:12px}.field-size-controls,.flex-container{display:flex;align-items:center;gap:12px}.flex-container{margin-bottom:1rem}.size-input{width:110px;text-align:center}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background:#4caf50}.view-icon{background:#2196f3}.delete-icon{background:#f44336}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background:#d0d9ff;border-radius:4px}.link-icon{background:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:all .3s}.link-icon:hover{background:#d0e5ff}.link-icon:active{background:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.option-items:active{opacity:.5}.drag-handle{margin-left:10px;cursor:grab}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background:#2c6dd5}.button-config-card{background:#fff;padding:15px;border-radius:12px;border:1px solid #ccc;margin-top:20px;box-shadow:0 2px 8px #0000000d}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.button-container{display:flex;padding:15px;background:#f9f9f9;border-top:1px solid #eee}.button-container .cancel-btn,.button-container .save-btn{flex:1;padding:12px;font-weight:700}.divider{border-top:1px dashed #ddd;margin:20px 0}input{width:auto}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{padding:1rem;font-size:.9rem}.form-group,.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{flex-direction:column;grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}\n"] }]
1073
+ args: [{ selector: 'app-properties', standalone: true, imports: [CommonModule, FormsModule, ImageCropperComponent, NxtSearchBox, NgClass, NgFor, NgIf, GetValueByPathPipe, NxtCustomTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'attributes'}\" (click)=\"setActiveTab('attributes')\">{{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'property'}\" (click)=\"setActiveTab('property')\">{{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'appearance'}\" (click)=\"setActiveTab('appearance')\">{{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}</div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'attributes'\">\n @defer (when getProperties()) {\n <div>\n @defer (when selectedElement()?.type === 'Image') {\n <image-cropper\n *ngIf=\"selectedElement().imageData\"\n [imageBase64]=\"selectedElement().orgImageData\"\n [disabled]=\"false\"\n [alignImage]=\"alignImage\"\n [roundCropper]=\"roundCropper\"\n [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\"\n [allowMoveImage]=\"false\"\n [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation()\"\n [aspectRatio]=\"aspectRatio\"\n [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\"\n [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\"\n [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\"\n [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\"\n [resetCropOnAspectRatioChange]=\"true\"\n [(cropper)]=\"cropper\"\n [(transform)]=\"transform\"\n [onlyScaleDown]=\"true\"\n output=\"blob\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (cropperReady)=\"cropperReady($event)\"\n ></image-cropper>\n <div *ngIf=\"selectedElement().imageData\" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [ngClass]=\"{'enabled': transform().flipH}\" title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [ngClass]=\"{'enabled': transform().flipV}\" title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n }\n <div *ngIf=\"selectedElement()?.type === 'Book'\">\n <label class=\"text-sm\">{{ 'SEARCH_BOOK' | nxtCustomTranslate : 'Search Book' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box\n [question]=\"selectedElement()\"\n [apiMeta]=\"bookSubtext()\"\n [placeHolderText]=\"'SEARCH' | nxtCustomTranslate : 'Search...'\"\n (searchValueChange)=\"childEventCapture($event.value)\"\n ></nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen()\" #dropdown>\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().endpoint\" (ngModelChange)=\"updateBookSubtext('endpoint', $event)\" />\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().variable\" (ngModelChange)=\"updateBookSubtext('variable', $event)\" />\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString()\" (ngModelChange)=\"updateField($event)\" />\n <label>{{ 'DEFAULT_FIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().defaultField\" (ngModelChange)=\"updateBookSubtext('defaultField', $event)\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.elementProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.key === 'helpText' && selectedElement()?.helpText\">{{ selectedElement()?.helpText }}</div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <input *ngIf=\"prop.type === 'number'\"\n type=\"number\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n <select *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n </div>\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n <div\n *ngIf=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n >\n <div *ngFor=\"let subProp of prop.subQuestion\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName, $event.target.checked)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"radio\"\n [name]=\"subProp.key\"\n [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <input\n *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [ngModel]=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) : (selectedElement() | getValueByPath : subProp.key)) : (selectedElement() | getValueByPath : subProp.key)\"\n (ngModelChange)=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event,false, prop.isTranslate) : setValueByPath(subProp.key, $event)) : setValueByPath(subProp.key, $event, prop.isTranslate)\"\n />\n <input\n *ngIf=\"subProp.type === 'boolean'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n <select\n *ngIf=\"subProp.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? (getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, subProp.isTableColumn)) : (selectedElement() | getValueByPath : subProp.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of subProp.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"subProp.type === 'checkbox'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" [ngClass]=\"{'active': selectedElement()?.textAlign === option.value}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\" [ngClass]=\"{'active': isStyleActive(option.value)}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'color'\">\n <input\n type=\"color\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n </div>\n <div *ngIf=\"prop.key === 'title'\" style=\"margin-top: 15px; border: 1px solid #ddd; padding: 20px; border-radius: 12px; background-color: #f9f9f9;\">\n <div class=\"form-header\">\n <label class=\"form-label\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <button (click)=\"addNewButton()\" class=\"add-button\">+ {{ 'ADD_BUTTON' | nxtCustomTranslate : 'Add Button' }}</button>\n </div>\n <div *ngFor=\"let btn of book()?.questionbook?.action || []; let i = index\" class=\"button-config-card\">\n <div class=\"form-group\">\n <label>{{ 'BUTTON_NAME' | nxtCustomTranslate : 'Button Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.name\" (ngModelChange)=\"onButtonPropertyChange(i, 'name', $event,true)\" placeholder=\"Enter button name\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'EVENT_NAME' | nxtCustomTranslate : 'Event Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.eventtoemit\" (ngModelChange)=\"onButtonPropertyChange(i, 'eventtoemit', $event)\" placeholder=\"Event to emit\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'ALT' | nxtCustomTranslate : 'Alt' }}</label>\n <input type=\"text\" [ngModel]=\"btn.alt\" (ngModelChange)=\"onButtonPropertyChange(i, 'alt', $event)\" placeholder=\"Button alt text\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}</label>\n <input type=\"text\" [ngModel]=\"btn.endpoint\" (ngModelChange)=\"onButtonPropertyChange(i, 'endpoint', $event)\" placeholder=\"API endpoint\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'METHOD' | nxtCustomTranslate : 'Method' }}</label>\n <select [ngModel]=\"btn.method\" (ngModelChange)=\"onButtonPropertyChange(i, 'method', $event)\">\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"DELETE\">DELETE</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BACKGROUND_COLOR' | nxtCustomTranslate : 'Background Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.bgColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'bgColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'BORDER_RADIUS' | nxtCustomTranslate : 'Border Radius' }}</label>\n <input type=\"range\" min=\"0\" max=\"50\" [ngModel]=\"btn.borderRadius\" (ngModelChange)=\"onButtonPropertyChange(i, 'borderRadius', $event)\">\n <span>{{ btn.borderRadius }}px</span>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BUTTON_WIDTH_PX' | nxtCustomTranslate : 'Button Width (px)' }}</label>\n <input type=\"number\" [ngModel]=\"btn.width\" (ngModelChange)=\"onButtonPropertyChange(i, 'width', $event)\" min=\"50\" placeholder=\"Enter width in px\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'TEXT_COLOR' | nxtCustomTranslate : 'Text Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.textColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'textColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'POSITION_PERCENT' | nxtCustomTranslate : 'Position (%)' }}</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"btn.positionPercent\" (ngModelChange)=\"onButtonPropertyChange(i, 'positionPercent', $event)\">\n <span>{{ btn.positionPercent }}%</span>\n </div>\n <button (click)=\"removeButton(btn)\" class=\"remove-button\">\u00D7 {{ 'REMOVE' | nxtCustomTranslate : 'Remove' }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'property'\">\n @defer (when getProperties()) {\n <div>\n <label>Label Id</label>\n <div style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect() ? bookId() : selectedElement()?.id }}\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.fieldProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isOptional')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isOptional', $event)\"\n />\n {{ 'REQUIRED' | nxtCustomTranslate : 'Required' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isReadOnly')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isReadOnly', $event)\"\n />\n {{ 'READ_ONLY' | nxtCustomTranslate : 'Read Only' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isHidden')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isHidden', $event)\"\n />\n {{ 'IS_HIDE' | nxtCustomTranslate : 'Is Hide' }}\n </label>\n </div>\n </div>\n <div *ngIf=\" prop.type === 'checkbox' || prop.type === 'radio' || prop.key === 'options'\" class=\"options-container\">\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key] ; let i = index\" class=\"option-items\" [attr.data-id]=\"option.id\" draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n <input type=\"text\" [ngModel]=\"option.value\" (ngModelChange)=\"option.value = $event; optionTranslationUpdate(option,$event)\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement()[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n <button (click)=\"addOption(selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>{{ 'ADD' | nxtCustomTranslate : 'Add' }}</span>\n </div>\n </button>\n </div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isExpanded\" style=\"border: 1px solid #ddd; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion; trackBy: trackByProp\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <input *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [value]=\"getOptimizedSubPropValue(subProp)\"\n (input)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event.target.value, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\" />\n \n <!-- AP-02APR25 Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">{{ 'STYLE' | nxtCustomTranslate : 'Style' }}</div>\n <img [src]=\"isStyleExpanded() ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\" alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isStyleExpanded()\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input\n type=\"text\"\n [value]=\"selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(),'style.' + key, true) : (selectedElement() | getValueByPath : 'style.' + key)\"\n (input)=\"(selectedElement()?.type === 'Table' && selectColumn() ) ? updateValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), 'style.' + key, $event.target.value, true) : setValueByPath('style.' + key, $event.target.value)\"\n placeholder=\"Enter {{ key }}\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'appearance'\">\n @defer (when getProperties()) {\n <div>\n <ng-container *ngFor=\"let prop of getProperties()?.appearance; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <select\n *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n\n <div class=\"flex-container\">\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input\n type=\"color\"\n [ngModel]=\"selectedElement()?.fontColor\"\n (ngModelChange)=\"setValueByPath('fontColor', $event, prop.isTranslate)\"\n >\n </div>\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>{{ 'HEX_CODE' | nxtCustomTranslate : 'HEX Code' }}</span>\n <input\n type=\"text\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n </div>\n </div>\n <div *ngIf=\"prop.type === 'button-toggle'\" class=\"button-toggle-wrapper\">\n <button\n type=\"button\"\n class=\"toggle-button\"\n (click)=\"duplicateField(selectedElement())\"\n >\n {{ 'ADD_DUPLICATE' | nxtCustomTranslate : 'Add Duplicate' }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">{{ 'CANCEL' | nxtCustomTranslate : 'Cancel' }}</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">{{ 'SAVE' | nxtCustomTranslate : 'Save' }}</button>\n </div>\n\n <div class=\"button-container\" *ngIf=\"templateSelected\" style=\"margin-top: 20px;\">\n <button class=\"save-btn\" (click)=\"handleTemplateSave()\">{{ 'SAVE_TEMPLATE' | nxtCustomTranslate : 'Save Template' }}</button>\n </div>\n</div>", styles: ["*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.container{width:100%;max-width:500px;margin:0 auto;background:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.toggle-header,.style-toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px;background:#f8f8f8;border:1px solid #ddd;border-radius:6px;margin-bottom:6px}.tabs{display:flex;background:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:80vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:block;font-size:14px;font-weight:500;color:#444;margin-bottom:8px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],input[type=number],select,textarea{width:100%;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:all .3s;background:#f8f8f8}input:focus,select:focus,textarea:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}textarea{min-height:55px;resize:vertical}button,.btn{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:all .3s}button:hover,.btn:hover{background:#0056b3;transform:translateY(-2px)}.add-button{padding:8px 14px;background:#0954c5;border-radius:8px}.remove-button{background:#e74c3c;padding:6px 12px;margin-top:10px}.remove-button:hover{background:#c0392b}.cancel-btn{background:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.save-btn{background:#0052cc}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;gap:10px;padding:8px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.color-picker-row,.color-picker-container{display:flex;align-items:center}.color-picker-container{border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box,.color-selector input[type=color]{width:78px;height:40px;border:none;border-radius:4px;cursor:pointer}.hex-input-container{display:flex;gap:20px;align-items:center;font-size:12px;color:#b0b0b0}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input,.hex-input-container input[type=text]{width:120px;padding:10px 12px;border:1px solid #d1d1d1;color:#28343e}.hex-label{color:#999;margin-right:5px}.select-container,.input-box-field{position:relative;width:100%}.dropdown-arrow,.input-box-field:after{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.input-box-field:after{content:\"\\25bc\";color:#1c1b1f;font-size:10px}.input-box-field select{background:#28343e;color:#fff;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.input-box-field select::-ms-expand{display:none}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}.options-container{display:flex;flex-direction:column;gap:12px}.field-size-controls,.flex-container{display:flex;align-items:center;gap:12px}.flex-container{margin-bottom:1rem}.size-input{width:110px;text-align:center}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background:#4caf50}.view-icon{background:#2196f3}.delete-icon{background:#f44336}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background:#d0d9ff;border-radius:4px}.link-icon{background:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:all .3s}.link-icon:hover{background:#d0e5ff}.link-icon:active{background:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.option-items:active{opacity:.5}.drag-handle{margin-left:10px;cursor:grab}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background:#2c6dd5}.button-config-card{background:#fff;padding:15px;border-radius:12px;border:1px solid #ccc;margin-top:20px;box-shadow:0 2px 8px #0000000d}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.button-container{display:flex;padding:15px;background:#f9f9f9;border-top:1px solid #eee}.button-container .cancel-btn,.button-container .save-btn{flex:1;padding:12px;font-weight:700}.divider{border-top:1px dashed #ddd;margin:20px 0}input{width:auto}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{padding:1rem;font-size:.9rem}.form-group,.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{flex-direction:column;grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}\n"] }]
1053
1074
  }], ctorParameters: () => [{ type: i1.FormBuilderService }, { type: i2.TemplateService }, { type: i3.TranslationService }], propDecorators: { templateSelected: [{
1054
1075
  type: Input
1055
1076
  }], selectedElementType: [{
@@ -1065,4 +1086,4 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.13", n
1065
1086
  type: HostListener,
1066
1087
  args: ['document:click', ['$event']]
1067
1088
  }] } }) });
1068
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMscUZBQXFGO0FBQ3JGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVySyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUlwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7OztBQUU3RSwwQ0FBMEM7QUFNMUMsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixTQUFTLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxlQUFvQixFQUFFO1FBQ3RELElBQUksQ0FB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LENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQztZQUNKLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQVU7UUFD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T0FBTyxDQUFDLGNBQWMsRUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUNuQixPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sQ0FBQyxhQUFhLENBQ3RCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0ExaUNVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLG9iQ3RDaEMscXdvQ0FzZE0sNDJORHJiTSxZQUFZLGdPQUFFLFdBQVcsMEJBQWlGLHNCQUFzQixzYkFWL0gsa0JBQWtCLEVBVXVGLHNCQUFzQixpSkFBdEIsc0JBQXNCLHdGQVYvSCxrQkFBa0IsRUFVdUYsc0JBQXNCLHNLQVYvSCxrQkFBa0IsRUFVdUYsc0JBQXNCOztpR0FLL0gsbUJBQW1CO3NCQVIvQixTQUFTO21DQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLG1CQUcxSCx1QkFBdUIsQ0FBQyxNQUFNOzBKQUd0QyxnQkFBZ0I7MEJBQXhCLEtBQUs7b0JBQ08sbUJBQW1COzBCQUEvQixLQUFLO29CQUdJLGlCQUFpQjswQkFBMUIsTUFBTTtvQkFDRyxtQkFBbUI7MEJBQTVCLE1BQU07b0JBRW1DLFFBQVE7MEJBQWpELFNBQVM7MkJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtvQkE4OUJ4QyxjQUFjOzBCQURiLFlBQVk7MkJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2NvbXBvbmVudC9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRTZWFyY2hCb3ggfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL3NlYXJjaC1ib3gvc2VhcmNoLWJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIERpbWVuc2lvbnMsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ludGVyZmFjZXMnO1xuLy9BUC0yNUpVTjI1LUltcG9ydGluZyBjb21tb24gY29uc3RhbnRzIGZvciBlbGVtZW50LCBmaWVsZCwgYW5kIGFwcGVhcmFuY2UgcHJvcGVydGllc1xuaW1wb3J0IHsgQ09NTU9OX0VMRU1FTlRfUFJPUFMsIENPTU1PTl9PUFRJT05TX0ZJRUxELCBDT01NT05fRklFTERfUFJPUFMsIENPTU1PTl9BUFBFQVJBTkNFX1BST1BTLCBDT01NT05fQ09MVU1OX0ZJRUxEIH0gZnJvbSAnLi4vcHJvcGVydGllcy9jb21tb24tZmllbGRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0tYnVpbGRlci9mb3JtLWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcblxuLy8gQ3VzdG9tIHBpcGUgZm9yIHBhdGgtYmFzZWQgdmFsdWUgYWNjZXNzXG5AUGlwZSh7XG4gIG5hbWU6ICdnZXRWYWx1ZUJ5UGF0aCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHB1cmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgR2V0VmFsdWVCeVBhdGhQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybShvYmo6IGFueSwgcGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSA9ICcnKTogYW55IHtcbiAgICBpZiAoIW9iaiB8fCAhcGF0aCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgobywgaykgPT4gbz8uW2tdID8/IGRlZmF1bHRWYWx1ZSwgb2JqKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvcGVydGllcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIE54dFNlYXJjaEJveCwgTmdDbGFzcywgTmdGb3IsIE5nSWYsIEdldFZhbHVlQnlQYXRoUGlwZSwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvcGVydGllcy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnRpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNldCBzZWxlY3RlZEVsZW1lbnRUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFR5cGVTaWcuc2V0KHZhbHVlKTtcbiAgfVxuICBAT3V0cHV0KCkgZm9ybUJ1dHRvbkhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlU2F2ZUhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGVcbiAgc2VsZWN0ZWRFbGVtZW50VHlwZVNpZyA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgc2VsZWN0ZWRFbGVtZW50ID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIHNlbGVjdGVkRWxlbWVudEluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuICBoZWFkZXJTZWxlY3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBib29rID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIGJvb2tJZCA9IHNpZ25hbDxhbnk+KG51bGwpO1xuICBhY3RpdmVUYWIgPSBzaWduYWw8c3RyaW5nPignYXR0cmlidXRlcycpO1xuICBzZWxlY3RDb2x1bW4gPSBzaWduYWw8YW55PihudWxsKTtcbiAgdHJhbnNmb3JtID0gc2lnbmFsPEltYWdlVHJhbnNmb3JtPih7XG4gICAgdHJhbnNsYXRlVW5pdDogJ3B4JyxcbiAgICBzY2FsZTogMSxcbiAgICByb3RhdGU6IDAsXG4gICAgZmxpcEg6IGZhbHNlLFxuICAgIGZsaXBWOiBmYWxzZSxcbiAgICB0cmFuc2xhdGVIOiAwLFxuICAgIHRyYW5zbGF0ZVY6IDBcbiAgfSk7XG4gIGNhbnZhc1JvdGF0aW9uID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIGNyb3BwZXIgPSBzaWduYWw8Q3JvcHBlclBvc2l0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNMaW5rRHJvcGRvd25PcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgZXJyb3JNZXNzYWdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBib29rU3VidGV4dCA9IHNpZ25hbCh7XG4gICAgZW5kcG9pbnQ6ICdodHRwczovL2Rldi1hcGkudmFsYXJoci5jb20vbnh0JyxcbiAgICB2YXJpYWJsZTogbnVsbCxcbiAgICBmaWVsZDogWydsYWJlbCcsICduYW1lJ10sXG4gICAgZGVmYXVsdEZpZWxkOiAnbGFiZWwnXG4gIH0pO1xuICBpc1N0eWxlRXhwYW5kZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBjcm9wcGVyTWF4SGVpZ2h0ID0gMDtcbiAgY3JvcHBlck1heFdpZHRoID0gMDtcbiAgY3JvcHBlck1pbkhlaWdodCA9IDA7XG4gIGNyb3BwZXJNaW5XaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNXaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQgPSAwO1xuICBhc3BlY3RSYXRpbyA9IDQgLyAzO1xuICByb3VuZENyb3BwZXIgPSBmYWxzZTtcbiAgaXNFeHBhbmRlZDogQm9vbGVhbiA9IGZhbHNlXG4gIGFsaWduSW1hZ2UgPSAnY2VudGVyJyBhcyBjb25zdDtcbiAgZWxlbWVudFR5cGUgPSBbJ0hlYWRlcicsJ0xpbmUnLCdTcGFjZScsJ1RhYmxlJywnVGFibGVDb2x1bW4nLCdDaGVja2JveCcsJ0Ryb3Bkb3duJywnUmFkaW8nLFwiVGV4dFwiLCBcIkNhbGVuZGFyXCIsIFwiRGF0ZVwiLCBcIlRpbWVcIiwgXCJEYXRlVGltZVwiLCBcIkVtYWlsXCIsIFwiQm9va1wiLCBcIkxpc3RcIiwgXCJUZXh0QXJlYVwiLCBcIlJpY2hUZXh0QXJlYVwiLCBcIk51bWJlclwiLCBcIkltYWdlXCIsIFwiTGFiZWxcIiwgXCJCb29sZWFuXCIsIFwiRmlsZVwiLCBcIkljb25cIiwgJ0J1dHRvbiddXG5cbiAgLy8gQWRkIHRoZXNlIHByb3BlcnRpZXMgdG8geW91ciBjb21wb25lbnQgY2xhc3NcbiAgcHJpdmF0ZSBfY2FjaGVkUHJvcGVydGllczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkRWxlbWVudDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkQ29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBDb21wdXRlZCBzaWduYWxzIGZvciBtZW1vaXphdGlvblxuICBmaWVsZEFzU3RyaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ib29rU3VidGV4dCgpLmZpZWxkLmpvaW4oJywgJykpO1xuICBmaWx0ZXJlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzTWV0YSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LmZpZWxkc01ldGEgPz8gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmllbGRzTWV0YSlcbiAgICAgID8gZmllbGRzTWV0YS5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyICE9PSB0aGlzLnNlbGVjdENvbHVtbigpKVxuICAgICAgOiBbXTtcbiAgfSk7XG5cbiAgLy8gTWVtb2l6ZWQgcHJvcGVydGllc1xuICBlbGVtZW50UHJvcGVydGllcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3JlYXRlRWxlbWVudFByb3BlcnRpZXMoKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlclNlcnZpY2U6IEZvcm1CdWlsZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHRlbXBsYXRlU2VydmljZTogVGVtcGxhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2VcbiAgKSB7fVxuICBcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc2VsZWN0SGVhZGVyU3ViamVjdCQuc3Vic2NyaWJlKGhlYWRlciA9PiB7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnNldCh7IHR5cGU6IGhlYWRlciB9KTtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3Quc2V0KHRydWUpO1xuICAgICAgICBjb25zdCBib29rRGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICAgICAgdGhpcy5ib29rLnNldChib29rRGF0YSk7XG4gICAgICAgIHRoaXMuYm9va0lkLnNldChib29rRGF0YT8ucmVjb3Jkc1swXT8uaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICBcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZWxlY3RlZEVsZW1lbnQkLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4LnNldChpbmRleCk7XG4gICAgICB0aGlzLmhlYWRlclNlbGVjdC5zZXQoZmFsc2UpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgICBpZiAoIWVsZW1lbnRzIHx8ICFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSB8fCBpbmRleCA+PSBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQobnVsbCk7IC8vIFJlc2V0IHNlbGVjdGVkRWxlbWVudCBpZiBpbnZhbGlkXG4gICAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW4uc2V0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50ID0geyAuLi5lbGVtZW50c1tpbmRleF0gfTsgLy8gU2FmZSB0byBzcHJlYWQgc2luY2Ugd2UgY2hlY2tlZFxuICAgICAgICBsZXQgZmllbGRzTWV0YSA9IGVsZW1lbnQ/LmZpZWxkc01ldGE7XG4gICAgICAgIGlmIChlbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpZWxkc01ldGEgPSBBcnJheS5pc0FycmF5KGZpZWxkc01ldGEpXG4gICAgICAgICAgICAgID8gZmllbGRzTWV0YVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZmllbGRzTWV0YSB8fCAnW10nKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICAgICAgICBmaWVsZHNNZXRhID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRTZWxlY3RUYWJsZUNvbHVtbigpID8/IG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoeyAuLi5lbGVtZW50LCBmaWVsZHNNZXRhIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc2V0KG51bGwpOyAvLyBSZXNldCBpZiBpbmRleCBpcyBpbnZhbGlkXG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldChudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN1YlRleHQgPSBlbGVtZW50LnN1YlRleHQ7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViVGV4dCA9PT0gJ3N0cmluZycgJiYgc3ViVGV4dC50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN1YlRleHQgPSBKU09OLnBhcnNlKHN1YlRleHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3ViVGV4dDonLCBlKTtcbiAgICAgICAgICAgIHN1YlRleHQgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN1YlRleHQgIT09ICdvYmplY3QnIHx8IHN1YlRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICBzdWJUZXh0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXlGaWVsZHMgPSBbJ2ZpZWxkJywgJ3F1ZXJ5UGFyYW1ldGVyJywgJ3NvdXJjZVF1ZXN0aW9uSWQnLCAncXVlcnlGaWVsZCcsICdxdWVyeVZhbHVlJ107XG4gICAgICAgIGlmIChzdWJUZXh0KSB7XG4gICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViVGV4dFtrZXldKSkge1xuICAgICAgICAgICAgICBzdWJUZXh0W2tleV0gPSBzdWJUZXh0W2tleV0uam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSAgICAgICAgXG4gICAgICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyl7XG4gICAgICAgICAgZWxlbWVudC5maWVsZHNNZXRhLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5zdWJUZXh0KXtcbiAgICAgICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSA9IGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBzdWJUZXh0IH0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBTS1MyOEpVTDI1IGZvcm1idWlsZGVyIGN1cnJlbnQgZWxlbWVudCB0cmFuc2xhdGlvbiB2YWx1ZSB1cGRhdGUgXG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGlvbnNMb2FkZWQkLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50cykgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkRWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGVsZTogYW55KSA9PiBlbGUuaWQgPT09IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkuaWQpO1xuICAgICAgICBpZiAobWF0Y2hlZEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQobWF0Y2hlZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9ICAgICAgXG4gICAgICBpZih0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSBcIkhlYWRlclwiKXtcbiAgICAgICAgY29uc3QgYm9va0RhdGEgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICAgIHRoaXMuYm9vay5zZXQoYm9va0RhdGEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoey4uLnRoaXMuc2VsZWN0ZWRFbGVtZW50KCl9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVsZW1lbnRQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIZWFkZXI6IHtcbiAgICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICd0aXRsZScsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdMQUJFTCcgfVxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIExpbmU6IHtcbiAgICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ0xpbmUgV2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScsIGxhYmVsUGF0aDogJ0xJTkVfV0lEVEgnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgVG9wJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdUb3AnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgdG9wJywgbGFiZWxQYXRoOiAnUEFERElOR19UT1AnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgQm90dG9tJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdCb3R0b20nLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgYm90dG9tJywgbGFiZWxQYXRoOiAnUEFERElOR19CT1RUT00nIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdMaW5lIFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2xpbmVTdHlsZScsIGxhYmVsUGF0aDogJ0xJTkVfU1RZTEUnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU29saWQnLCB2YWx1ZTogJ1NvbGlkJywgbGFiZWxQYXRoOiAnU09MSUQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEYXNoZWQnLCB2YWx1ZTogJ0Rhc2hlZCcsIGxhYmVsUGF0aDogJ0RBU0hFRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RvdHRlZCcsIHZhbHVlOiAnRG90dGVkJywgbGFiZWxQYXRoOiAnRE9UVEVEJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBmaWVsZFByb3BzOiBbXVxuICAgICAgfSxcbiAgICAgIFNwYWNlOiB7XG4gICAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJywgbGFiZWxQYXRoOiAnRUxFTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJywgbGFiZWxQYXRoOiAnRklFTERfU0laRScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW11cbiAgICAgIH0sXG4gICAgICBUYWJsZToge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnSXMgTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnY2hlY2tib3gnLCBrZXk6ICdzdHlsZS5zaG93TGFiZWwnLCBsYWJlbFBhdGg6ICdJU19MQUJFTCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAncHJpbWFyeUtleScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3ByaW1hcnlLZXknLCBsYWJlbFBhdGg6ICdQUklNQVJZX0tFWScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAndGFibGVOYW1lJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvblRleHQnLCBpc1RyYW5zbGF0ZTogdHJ1ZSwgbGFiZWxQYXRoOiAnVEFCTEVfTkFNRScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnaW5wdXRUZXh0QWxpZ25tZW50JywgcGxhY2Vob2xkZXI6ICdMZWZ0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdpbnB1dFRleHRBbGlnbm1lbnQnLCBsYWJlbFBhdGg6ICdJTlBVVF9URVhUX0FMSUdOTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAndGFibGVTY2FsZVNpemUnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAndGFibGVTY2FsZVNpemUnLCBsYWJlbFBhdGg6ICdUQUJMRV9TQ0FMRV9TSVpFJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc05vc0luZGljYXRvcicsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuaXNOb3NJbmRpY2F0b3InLCBsYWJlbFBhdGg6ICdJU19OT1NfSU5ESUNBVE9SJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc1BhZ2luYXRpb24nLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzUGFnaW5hdGlvbicsIGxhYmVsUGF0aDogJ0lTX1BBR0lOQVRJT04nIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2FkZElubGluZVJlY29yZCcsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuYWRkSW5saW5lUmVjb3JkJywgbGFiZWxQYXRoOiAnQUREX0lOTElORV9SRUNPUkQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2FjdGlvbkJ1dHRvbicsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuYWN0aW9uQnV0dG9uJywgbGFiZWxQYXRoOiAnQUNUSU9OX0JVVFRPTicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnc2VhcmNoQmFyJywgcGxhY2Vob2xkZXI6ICcwNiAtIEZ1bGwgU2NhbGUnLCB0eXBlOiAnY2hlY2tib3gnLCBrZXk6ICd0YWJsZUNvbmZpZy5zZWFyY2hCYXInLCBsYWJlbFBhdGg6ICdTRUFSQ0hfQkFSJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0RlbGV0ZVJvdycsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuaXNEZWxldGVSb3cnLCBsYWJlbFBhdGg6ICdJU19ERUxFVEVfUk9XJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0VkaXRSb3cnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzRWRpdFJvdycsIGxhYmVsUGF0aDogJ0lTX0VESVRfUk9XJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0J1dHRvbnMnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzQnV0dG9ucycsIGxhYmVsUGF0aDogJ0lTX0JVVFRPTlMnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ3Jvd0Nob2ljZScsIHBsYWNlaG9sZGVyOiAnJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyb3dDaG9pY2UnLCBsYWJlbFBhdGg6ICdST1dfQ0hPSUNFJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdxdWVzdGlvbk51bWJlcicsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicsIGxhYmVsUGF0aDogJ1FVRVNUSU9OX05VTUJFUicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJywgbGFiZWxQYXRoOiAnRklFTERfU0laRScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICd0YWJsZUlkJywgcGxhY2Vob2xkZXI6ICdFbXBfVGFibGVfMDEnLCB0eXBlOiAndGV4dCcsIGtleTogJ3RhYmxlSWQnLCBpc1RyYW5zbGF0ZTogdHJ1ZSwgbGFiZWxQYXRoOiAnVEFCTEVfSUQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2hlbHBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBtZXNzYWdlJywgdHlwZTogJ3RleHQnLCBrZXk6ICdoZWxwVGV4dCcsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdIRUxQX1RFWFQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2RlZmF1bHRWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRGVmYXVsdCBWYWx1ZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAnZGVmYXVsdFZhbHVlJywgbGFiZWxQYXRoOiAnREVGQVVMVF9WQUxVRScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJywgbGFiZWxQYXRoOiAnUkVGRVJFTkNFX0ZJRUxEJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCBrZXk6ICdpc1N1YlRleHQnLCBsYWJlbFBhdGg6ICdTVUJfVEVYVCcsXG4gICAgICAgICAgICBzdWJRdWVzdGlvbjogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnRW5kIFBvaW50JywgcGxhY2Vob2xkZXI6ICdlbmRwb2ludCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5lbmRwb2ludCcsIGxhYmVsUGF0aDogJ0VORF9QT0lOVCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1ZhcmlhYmxlJywgcGxhY2Vob2xkZXI6ICd2YXJpYWJsZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC52YXJpYWJsZScsIGxhYmVsUGF0aDogJ1ZBUklBQkxFJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRmllbGQnLCBwbGFjZWhvbGRlcjogJ2ZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LmZpZWxkJywgbGFiZWxQYXRoOiAnRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdRdWVyeSBQYXJhbWV0ZXInLCBwbGFjZWhvbGRlcjogJ3F1ZXJ5UGFyYW1ldGVyJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5UGFyYW1ldGVyJywgbGFiZWxQYXRoOiAnUVVFUllfUEFSQU1FVEVSJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnZGVmYXVsdEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LmRlZmF1bHRGaWVsZCcsIGxhYmVsUGF0aDogJ0RFRkFVTFRfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdMYWJlbCBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnbGFiZWxGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5sYWJlbEZpZWxkJywgbGFiZWxQYXRoOiAnTEFCRUxfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdWYWx1ZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAndmFsdWVGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC52YWx1ZUZpZWxkJywgbGFiZWxQYXRoOiAnVkFMVUVfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdTb3VyY2UgUXVlc3Rpb24gSWQnLCBwbGFjZWhvbGRlcjogJ3NvdXJjZVF1ZXN0aW9uSWQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQuc291cmNlUXVlc3Rpb25JZCcsIGxhYmVsUGF0aDogJ1NPVVJDRV9RVUVTVElPTl9JRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGVuZGVudCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnZGVwZW5kZW50VmFsdWUnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQuZGVwZW5kZW50VmFsdWUnLCBsYWJlbFBhdGg6ICdERVBFTkRFTlRfVkFMVUUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEZXBlbmRlbnQgRmllbGQnLCBwbGFjZWhvbGRlcjogJ2lzRGVwZW5kZW50RmllbGQnLCB0eXBlOiAnYm9vbGVhbicsIGtleTogJ3N1YlRleHQuaXNEZXBlbmRlbnRGaWVsZCcsIGxhYmVsUGF0aDogJ0RFUEVOREVOVF9GSUVMRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IEZpZWxkJywgcGxhY2Vob2xkZXI6ICdxdWVyeUZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5RmllbGQnLCBsYWJlbFBhdGg6ICdRVUVSWV9GSUVMRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdxdWVyeVZhbHVlJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5VmFsdWUnLCBsYWJlbFBhdGg6ICdRVUVSWV9WQUxVRScgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IFZhbHVlIFJlZicsIHBsYWNlaG9sZGVyOiAncXVlcnlWYWx1ZVJlZicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5xdWVyeVZhbHVlUmVmZXJlbmNlJywgbGFiZWxQYXRoOiAnUVVFUllfVkFMVUVfUkVGJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnVW5pcXVlIEtleScsIHBsYWNlaG9sZGVyOiAndW5pcXVlS2V5JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnVuaXF1ZUtleScsIGxhYmVsUGF0aDogJ1VOSVFVRV9LRVknIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICAgIHsgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ1NFTEVDVF9GT05UJywgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0hlbHZldGljYSBOZXVlJywgdmFsdWU6ICdIZWx2ZXRpY2EgTmV1ZScsIGxhYmVsUGF0aDogJ0hFTFZFVElDQV9ORVVFJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0FyaWFsJywgdmFsdWU6ICdBcmlhbCcsIGxhYmVsUGF0aDogJ0FSSUFMJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1RpbWVzIE5ldyBSb21hbicsIHZhbHVlOiAnVGltZXMgTmV3IFJvbWFuJywgbGFiZWxQYXRoOiAnVElNRVNfTkVXX1JPTUFOJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1JvYm90bycsIHZhbHVlOiAnUm9ib3RvJywgbGFiZWxQYXRoOiAnUk9CT1RPJyB9XG4gICAgICAgICAgXX0sXG4gICAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCBkZWZhdWx0VmFsdWU6ICcnLCByZXF1aXJlZDogdHJ1ZSwgbGFiZWxQYXRoOiAnRk9OVF9DT0xPUicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRm9udCBTaXplJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTaXplJywgZGVmYXVsdFZhbHVlOiAnJywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ0ZPTlRfU0laRScsIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTbWFsbCcsIHZhbHVlOiAnMTJweCcsIGxhYmVsUGF0aDogJ1NNQUxMJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ01lZGl1bScsIHZhbHVlOiAnMTRweCcsIGxhYmVsUGF0aDogJ01FRElVTScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMYXJnZScsIHZhbHVlOiAnMTZweCcsIGxhYmVsUGF0aDogJ0xBUkdFJyB9XG4gICAgICAgICAgXX0sXG4gICAgICAgICAgeyBsYWJlbDogJ0ZvbnQgV2lkdGgnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIGRlZmF1bHRWYWx1ZTogJycsIHJlcXVpcmVkOiB0cnVlLCBsYWJlbFBhdGg6ICdGT05UX1dJRFRIJywgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcsIGxhYmVsUGF0aDogJzQwMF9OT1JNQUwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJywgbGFiZWxQYXRoOiAnNTAwX01FRElVTScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnLCBsYWJlbFBhdGg6ICc2MDBfU0VNSV9CT0xEJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnLCBsYWJlbFBhdGg6ICc3MDBfQk9MRCcgfVxuICAgICAgICAgIF19LFxuICAgICAgICAgIHsgbGFiZWw6ICdEdXBsaWNhdGUgRmllbGQnLCB0eXBlOiAnYnV0dG9uLXRvZ2dsZScsIGtleTogJ2R1cGxpY2F0ZUZpZWxkJywgZGVmYXVsdFZhbHVlOiBmYWxzZSwgbGFiZWxQYXRoOiAnRFVQTElDQVRFX0ZJRUxEJyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBUYWJsZUNvbHVtbjoge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHBsYWNlaG9sZGVyOiAnVGV4dCcsIHR5cGU6ICdzZWxlY3QnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdmbGRUeXBlJywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ1RZUEUnLCBvcHRpb25zOiB0aGlzLmVsZW1lbnRUeXBlLm1hcChmID0+ICh7IGxhYmVsOiBmLCB2YWx1ZTogZiwgbGFiZWxQYXRoOiBmLnRvVXBwZXJDYXNlKCkgfSkpfSxcbiAgICAgICAgICB7IGxhYmVsOiAnaGVhZGVyTGFiZWxzJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdsYWJlbCcsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdIRUFERVJfTEFCRUxTJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdhcGlOYW1lJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdhcGlOYW1lJywgbGFiZWxQYXRoOiAnQVBJX05BTUUnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdTdW1tYXJ5IENvbHVtbicsIHBsYWNlaG9sZGVyOiAnU3VtbWFyeSBDb2x1bW4nLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdzdW1tYXJ5Q29sdW1uJywgbGFiZWxQYXRoOiAnU1VNTUFSWV9DT0xVTU4nLFxuICAgICAgICAgICAgc3ViUXVlc3Rpb246IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCBwbGFjZWhvbGRlcjogJ0VtcGxveWVlIERldGFpbHMnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2ZsZFR5cGUnLCBsYWJlbFBhdGg6ICdUWVBFJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnT3BlcmF0aW9uJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdvcGVyYXRpb24nLCBsYWJlbFBhdGg6ICdPUEVSQVRJT04nIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdPcGVyYW5kcycsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICdhcnJheScsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ29wZXJhbmRzJywgbGFiZWxQYXRoOiAnT1BFUkFORFMnIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1N1bW1hcnkgUm93JywgcGxhY2Vob2xkZXI6ICdTdW1tYXJ5IFJvdycsIHR5cGU6ICdzdWJRdWVzdGlvbicsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ3N1bW1hcnlSb3cnLCBsYWJlbFBhdGg6ICdTVU1NQVJZX1JPVycsXG4gICAgICAgICAgICBzdWJRdWVzdGlvbjogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICd0ZXh0JywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnZmxkVHlwZScsIGxhYmVsUGF0aDogJ1RZUEUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdvcGVyYXRpb24nLCBwbGFjZWhvbGRlcjogJ29wZXJhdGlvbicsIHR5cGU6ICd0ZXh0JywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnb3BlcmF0aW9uJywgbGFiZWxQYXRoOiAnT1BFUkFUSU9OJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY29sdW1uJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3JhZGlvJywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnY29sdW1uJywgbGFiZWxQYXRoOiAnQ09MVU1OJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY29sdW1ucycsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICdhcnJheScsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2NvbHVtbnMnLCBsYWJlbFBhdGg6ICdDT0xVTU5TJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnb3BlcmFuZHMnLCBwbGFjZWhvbGRlcjogJ0VtcGxveWVlIERldGFpbHMnLCB0eXBlOiAnYXJyYXknLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdvcGVyYW5kcycsIGxhYmVsUGF0aDogJ09QRVJBTkRTJyB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ3RleHRBbGlnbm1lbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ3RleHRBbGlnbm1lbnQnLCBsYWJlbFBhdGg6ICdURVhUX0FMSUdOTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnY29sdW1uU2NhbGVTaXplJywgcGxhY2Vob2xkZXI6ICcwNiAtIEZ1bGwgU2NhbGUnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2NvbHVtblNjYWxlU2l6ZScsIGxhYmVsUGF0aDogJ0NPTFVNTl9TQ0FMRV9TSVpFJyB9LFxuICAgICAgICBdLFxuICAgICAgICBmaWVsZFByb3BzOiBbXSxcbiAgICAgICAgYXBwZWFyYW5jZTogW11cbiAgICAgIH0sXG4gICAgICBDaGVja2JveDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKHsgY3VzdG9tRmllbGRQcm9wczogQ09NTU9OX09QVElPTlNfRklFTEQubWFwKG9wdCA9PiAoeyAuLi5vcHQsIHR5cGU6ICdjaGVja2JveCcgfSkpIH0pLFxuICAgICAgRHJvcGRvd246IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZyh7IGN1c3RvbUZpZWxkUHJvcHM6IENPTU1PTl9PUFRJT05TX0ZJRUxELm1hcChvcHQgPT4gKHsgLi4ub3B0LCB0eXBlOiAnZHJvcGRvd24nIH0pKSB9KSxcbiAgICAgIFJhZGlvOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoeyBjdXN0b21GaWVsZFByb3BzOiBDT01NT05fT1BUSU9OU19GSUVMRC5tYXAob3B0ID0+ICh7IC4uLm9wdCwgdHlwZTogJ2NoZWNrYm94JyB9KSkgfSksXG4gICAgICBUZXh0OiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIENhbGVuZGFyOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIERhdGU6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgVGltZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBEYXRlVGltZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBFbWFpbDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBCb29rOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIExpc3Q6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgVGV4dEFyZWE6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgUmljaFRleHRBcmVhOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIE51bWJlcjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBJbWFnZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBMYWJlbDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBCb29sZWFuOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIEZpbGU6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgSWNvbjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksIC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGVsZW1lbnRcbiAgICAgIEJ1dHRvbjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnRDb25maWcoY29uZmlnPzogeyBjdXN0b21FbGVtZW50UHJvcHM/OiBhbnlbXSwgY3VzdG9tRmllbGRQcm9wcz86IGFueVtdLCBjdXN0b21BcHBlYXJhbmNlUHJvcHM/OiBhbnlbXSB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRQcm9wczogWy4uLkNPTU1PTl9FTEVNRU5UX1BST1BTLCAuLi4oY29uZmlnPy5jdXN0b21FbGVtZW50UHJvcHMgfHwgW10pXSxcbiAgICAgIGZpZWxkUHJvcHM6IFsuLi5DT01NT05fRklFTERfUFJPUFMsIC4uLihjb25maWc/LmN1c3RvbUZpZWxkUHJvcHMgfHwgW10pXSxcbiAgICAgIGFwcGVhcmFuY2U6IFsuLi5DT01NT05fQVBQRUFSQU5DRV9QUk9QUywgLi4uKGNvbmZpZz8uY3VzdG9tQXBwZWFyYW5jZVByb3BzIHx8IFtdKV1cbiAgICB9O1xuICB9XG4gIC8vIEFQIDIzTUFZMjUgLSBBZGQgYSBuZXcgYnV0dG9uIHdpdGggZGVmYXVsdCBzdHlsaW5nXG4gIGFkZE5ld0J1dHRvbigpIHtcbiAgICBjb25zdCBsYXN0UGVyY2VudCA9IHRoaXMuYm9vaygpPy5xdWVzdGlvbmJvb2s/LmFjdGlvbj8uc2xpY2UoLTEpWzBdPy5wb3NpdGlvblBlcmNlbnQgPz8gMDtcbiAgICBjb25zdCBidXR0b25zID0ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBldmVudHRvZW1pdDogJycsXG4gICAgICBhbHQ6ICcnLFxuICAgICAgZW5kcG9pbnQ6ICcnLFxuICAgICAgbWV0aG9kOiAnJyxcbiAgICAgIGlkOiB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5hZGRFbGVtZW50V2l0aElkKCksXG4gICAgICBwb3NpdGlvblBlcmNlbnQ6IGxhc3RQZXJjZW50ICsgMTAsXG4gICAgICB3aWR0aDogMTAwLFxuICAgICAgYm9yZGVyUmFkaXVzOiA2LFxuICAgICAgYWxpZ25tZW50OiAnZmxleC1zdGFydCdcbiAgICB9O1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnV0dG9ucywgJ2FkZCcpO1xuICAgIHRoaXMuYm9vay51cGRhdGUoYm9vayA9PiAoeyAuLi5ib29rIH0pKTtcbiAgfVxuICAvL0FQIDIzTUFZMjUgLSBSZW1vdmUgYSBidXR0b24gZnJvbSB0aGUgYWN0aW9uIGxpc3QgXG4gIHJlbW92ZUJ1dHRvbihidG46IGFueSkge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnRuLCAncmVtb3ZlJyk7XG4gICAgdGhpcy5ib29rLnVwZGF0ZShib29rID0+ICh7IC4uLmJvb2sgfSkpO1xuICB9XG4gIC8vQVAgMjNNQVkyNSAtIFVwZGF0ZSBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgYnV0dG9uXG4gIG9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaW5kZXg6IG51bWJlciwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksaXNUcmFuc2xhdGU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLmJvb2soKT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gPz8gW107XG4gICAgaWYgKGJ1dHRvbnNbaW5kZXhdKSB7XG4gICAgICBidXR0b25zW2luZGV4XVtrZXldID0gdmFsdWU7XG4gICAgICB0aGlzLmJvb2sudXBkYXRlKGJvb2sgPT4gKHsgLi4uYm9vaywgcXVlc3Rpb25ib29rOiB7IC4uLmJvb2sucXVlc3Rpb25ib29rLCBhY3Rpb246IGJ1dHRvbnMgfSB9KSk7XG4gICAgfVxuICAgIGxldCBidXR0b24gPSBidXR0b25zW2luZGV4XVxuICAgIGlmKGlzVHJhbnNsYXRlKXtcbiAgICAgIC8vU0tTMjhKVUwyNSBSZWZyZXNoIHRoZSBib29rIHNpZ25hbCBmcm9tIHNlcnZpY2VcbiAgICAgIGNvbnN0IHVwZGF0ZWRCb29rID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgICAgdGhpcy5ib29rLnNldCh1cGRhdGVkQm9vayk7XG4gICAgICAvL1NLUzI4SlVMMjUgV29yayB3aXRoIGEgbXV0YWJsZSBjb3B5XG4gICAgICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9vaygpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25NYXAgPSBjdXJyZW50Qm9vay50cmFuc2xhdGlvbk1hcCB8fCB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0Rm9ybUJ1aWxkZXJMYW5ndWFnZSgpO1xuICAgICAgLy9TS1MyOEpVTDI1IEVuc3VyZSBuZXN0ZWQgc3RydWN0dXJlIGV4aXN0c1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10pIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSA9IHt9O1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bYnV0dG9uLmlkXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2J1dHRvbi5pZF0gPSB7fTtcbiAgICAgIC8vU0tTMjhKVUwyNSBTZXQgdGhlIHRyYW5zbGF0ZWQgdmFsdWVcbiAgICAgIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtidXR0b24uaWRdW2tleV0gPSB2YWx1ZTtcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTsgLy8gVHJpZ2dlciByZWFjdGl2ZSB1cGRhdGVcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH1cbiAgfVxuICAvL0FQLTEwTUFSMjUgVXBkYXRlcyB0aGUgdGl0bGUgdXNpbmcgdGhlIGZvcm0gYnVpbGRlciBzZXJ2aWNlICBcbiAgdXBkYXRlVGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVRpdGxlKHZhbHVlKTtcbiAgICB0aGlzLmJvb2sudXBkYXRlKGJvb2sgPT4gKHtcbiAgICAgIC4uLmJvb2ssXG4gICAgICByZWNvcmRzOiBbeyAuLi5ib29rLnJlY29yZHNbMF0sIHRpdGxlOiB2YWx1ZSB9XVxuICAgIH0pKTtcbiAgfVxuXG4gIHZhbGlkYXRlSW5wdXQodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGUgPT09ICdsYWJlbCcgfHwgdHlwZSA9PT0gJ3BsYWNlaG9sZGVyJykge1xuICAgICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTlcXHNdKiQvO1xuICAgICAgaWYgKCFyZWdleC50ZXN0KHZhbHVlKSkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoJ09ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldCgnJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB1cGRhdGVGaWVsZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5ib29rU3VidGV4dC51cGRhdGUoc3VidGV4dCA9PiAoe1xuICAgICAgLi4uc3VidGV4dCxcbiAgICAgIGZpZWxkOiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKVxuICAgIH0pKTtcbiAgfVxuXG4gIG9uQ2hlY2tib3hDaGFuZ2UodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBhbnksIGtleTogYW55LCBhcGlOYW1lOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgY29uc3QgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbigpKTtcbiAgICBmb3VuZEl0ZW1ba2V5XSA9IGZvdW5kSXRlbVtrZXldID8gZm91bmRJdGVtW2tleV0gOiBbXTtcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICBpZiAoIWZvdW5kSXRlbVtrZXldLmluY2x1ZGVzKGFwaU5hbWUpKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnB1c2goYXBpTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZm91bmRJdGVtW2tleV0uaW5kZXhPZihhcGlOYW1lKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIHVwZGF0ZVByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSA+PSAwKSB7XG4gICAgICBpZiAoa2V5ID09PSAncXVlc3Rpb25UZXh0JyB8fCBrZXkgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlSW5wdXQodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09ICdxdWVzdGlvbk51bWJlcicpIHtcbiAgICAgICAgLy9BUC0xME1BUjI1IENvbnZlcnQgdGhlIHZhbHVlIHRvIGFuIGludGVnZXIgIFxuICAgICAgICBjb25zdCBuZXdPcmRlciA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihuZXdPcmRlcikpIHJldHVybjtcblxuICAgICAgICAvL0FQLTEwTUFSMjUgVXBkYXRlIHRoZSBlbGVtZW50J3MgcXVlc3Rpb25OdW1iZXIgaW4gdGhlIGZvcm0gYnVpbGRlciBzZXJ2aWNlICBcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHsgcXVlc3Rpb25OdW1iZXI6IG5ld09yZGVyIH0pO1xuXG4gICAgICAgIC8vQVAtMTBNQVIyNSBTb3J0IGVsZW1lbnRzIGJhc2VkIG9uIHRoZSB1cGRhdGVkIHF1ZXN0aW9uTnVtYmVyICBcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc29ydEVsZW1lbnRzQnlPcmRlcigpO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ2ZvbnQnIHx8IGtleSA9PT0gJ2ZvbnRXZWlnaHQnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoeyAuLi5lbCwgW2tleV06IHZhbHVlIH0pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgW2tleV06IHZhbHVlIH07XG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgdXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBvblJhZGlvQ2hhbmdlKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogYW55LCBrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0QXJyYXkgPSBKU09OLnBhcnNlKHRhcmdldEFycmF5IHx8ICdbXScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyB0YXJnZXRBcnJheTonLCBlKTtcbiAgICAgICAgICB0YXJnZXRBcnJheSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0QXJyYXkpKSByZXR1cm47XG4gICAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbigpKTtcbiAgICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICAgIGZvdW5kSXRlbSA9IHsgW3RhcmdldEFycmF5S2V5XTogdGhpcy5zZWxlY3RDb2x1bW4oKSB9O1xuICAgICAgICB0YXJnZXRBcnJheS5wdXNoKGZvdW5kSXRlbSk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBrID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCFvYmpba10pIG9ialtrXSA9IHt9O1xuICAgICAgICBvYmogPSBvYmpba107XG4gICAgICB9XG4gICAgICBvYmpba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAgIC4uLmVsLFxuICAgICAgICBmaWVsZHNNZXRhOiB0YXJnZXRBcnJheVxuICAgICAgfSkpO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVxdWlyZWRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgbGV0IGxhYmVsID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQoKS5sYWJlbCA/IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkubGFiZWwucmVwbGFjZSgvXFxzKlxcKiskLywgJycpIDogJ0xhYmVsJztcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsYWJlbCA9IGAke2xhYmVsfSAqYDtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHkoJ2xhYmVsJywgbGFiZWwpO1xuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eSgnaXNPcHRpb25hbCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTdWJRdWVzdGlvbihwcm9wOiBhbnkpIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xuICB9XG5cbiAgdG9nZ2xlU3R5bGVTZWN0aW9uKCkge1xuICAgIHRoaXMuaXNTdHlsZUV4cGFuZGVkLnNldCghdGhpcy5pc1N0eWxlRXhwYW5kZWQoKSk7XG4gIH1cblxuICBnZXRQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1uID0gdGhpcy5zZWxlY3RDb2x1bW4oKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdXNlIGNhY2hlZCByZXN1bHRcbiAgICBpZiAodGhpcy5fY2FjaGVkUHJvcGVydGllcyAmJiBcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9PT0gZWxlbWVudCAmJiBcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID09PSBzZWxlY3RlZENvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFByb3BlcnRpZXM7XG4gICAgfSAgICBcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2NhY2hlZFByb3BlcnRpZXMgPSBudWxsO1xuICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9sYXN0U2VsZWN0ZWRDb2x1bW4gPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICBcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnSGVhZGVyJykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5lbGVtZW50UHJvcGVydGllcygpWydIZWFkZXInXTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyAmJiBzZWxlY3RlZENvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IGZpZWxkc01ldGEgPSBlbGVtZW50LmZpZWxkc01ldGE7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZHNNZXRhID0gQXJyYXkuaXNBcnJheShmaWVsZHNNZXRhKVxuICAgICAgICAgID8gZmllbGRzTWV0YVxuICAgICAgICAgIDogSlNPTi5wYXJzZShmaWVsZHNNZXRhIHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGEgaW4gZ2V0UHJvcGVydGllczonLCBlKTtcbiAgICAgICAgZmllbGRzTWV0YSA9IFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBjb2x1bW4gPSBmaWVsZHNNZXRhLmZpbmQoKGM6IGFueSkgPT4gYy51bmlxdWVJZGVudGlmaWVyID09PSBzZWxlY3RlZENvbHVtbik7XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IG1hcmtJc1RhYmxlQ29sdW1uID0gKGl0ZW1zOiBhbnlbXSA9IFtdKSA9PlxuICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0sIGlzVGFibGVDb2x1bW46IHRydWUgfTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0l0ZW0uc3ViUXVlc3Rpb24pKSB7XG4gICAgICAgICAgICAgIG5ld0l0ZW0uc3ViUXVlc3Rpb24gPSBuZXdJdGVtLnN1YlF1ZXN0aW9uLm1hcChzdWIgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5zdWIsXG4gICAgICAgICAgICAgICAgaXNUYWJsZUNvbHVtbjogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbJ1RhYmxlQ29sdW1uJ10uZWxlbWVudFByb3BzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLm1hcmtJc1RhYmxlQ29sdW1uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVt0aGlzLmVsZW1lbnRUeXBlLmluY2x1ZGVzKGNvbHVtbi5mbGRUeXBlKSA/IGNvbHVtbi5mbGRUeXBlIDogJ1RleHQnXT8uZWxlbWVudFByb3BzKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgICAgLi4uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVsnVGFibGVDb2x1bW4nXS5maWVsZFByb3BzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLm1hcmtJc1RhYmxlQ29sdW1uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVt0aGlzLmVsZW1lbnRUeXBlLmluY2x1ZGVzKGNvbHVtbi5mbGRUeXBlKSA/IGNvbHVtbi5mbGRUeXBlIDogJ1RleHQnXT8uZmllbGRQcm9wcylcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbJ1RhYmxlQ29sdW1uJ10uYXBwZWFyYW5jZSB8fCBbXSksXG4gICAgICAgICAgICAuLi5tYXJrSXNUYWJsZUNvbHVtbih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbdGhpcy5lbGVtZW50VHlwZS5pbmNsdWRlcyhjb2x1bW4uZmxkVHlwZSkgPyBjb2x1bW4uZmxkVHlwZSA6ICdUZXh0J10/LmFwcGVhcmFuY2UpXG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbGVtZW50UHJvcGVydGllcygpWydUYWJsZUNvbHVtbiddO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbZWxlbWVudC50eXBlXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuX2NhY2hlZFByb3BlcnRpZXMgPSByZXN1bHQ7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID0gc2VsZWN0ZWRDb2x1bW47XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBBZGQgbWV0aG9kIHRvIGNsZWFyIGNhY2hlIHdoZW4gbmVlZGVkXG4gIHByaXZhdGUgY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKSB7XG4gICAgdGhpcy5fY2FjaGVkUHJvcGVydGllcyA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID0gbnVsbDtcbiAgfVxuICAvLyBBUC0yOE1BUjI1IEFkZCBhbiBvcHRpb24gd2l0aCBhIHVuaXF1ZSBVVUlEXG4gIGFkZE9wdGlvbihvcHRpb25zOiBhbnlbXSkge1xuICAgIGNvbnN0IHVuaXF1ZV9pZCA9IHV1aWR2NCgpO1xuICAgIG9wdGlvbnMucHVzaCh7IGlkOiB1bmlxdWVfaWQsIHZhbHVlOiAnJyB9KTtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIG9wdGlvbiBiYXNlZCBvbiBpdHMgdW5pcXVlIFVVSURcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbnM6IGFueVtdLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSBpZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUJ1dHRvbkNsaWNrKCkge1xuICAgIHRoaXMuZm9ybUJ1dHRvbkhhbmRsZXIuZW1pdCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gIH1cblxuICBoYW5kbGVUZW1wbGF0ZVNhdmUoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVNhdmVIYW5kbGVyLmVtaXQodGhpcy50ZW1wbGF0ZVNlcnZpY2UuZG93bmxvYWQoKSk7XG4gIH1cblxuICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiKTtcbiAgfVxuXG4gIG9uU2F2ZSgpIHt9XG5cbiAgb25DYW5jZWwoKSB7fVxuXG4gIG9uQWxpZ25TZWxlY3QodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoeyAuLi5lbCwgdGV4dEFsaWduOiB2YWx1ZSB9KSk7XG4gIH1cblxuICBvblN0eWxlU2VsZWN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgIC4uLmVsLFxuICAgICAgc3R5bGVzOiBbdmFsdWVdXG4gICAgfSkpO1xuICB9XG5cbiAgaXNTdHlsZUFjdGl2ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LnN0eWxlcz8uaW5jbHVkZXModmFsdWUpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0VmFsdWVCeVBhdGgocGF0aDogc3RyaW5nLCBvYmo6IGFueSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCksIGRlZmF1bHRWYWx1ZTogYW55ID0gJycpOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvLCBrKSA9PiBvPy5ba10gPz8gZGVmYXVsdFZhbHVlLCBvYmopO1xuICB9XG4gIGlzQW5vdGhlcklkU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKClcbiAgICAgIC5zb21lKChlbCwgaSkgPT4gaSAhPT0gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpICYmIGVsLnByaW1hcnlLZXkpO1xuICB9XG5cbiAgLy8gQWxzbyB1cGRhdGUgeW91ciBvblRvZ2dsZUNoYW5nZSBtZXRob2QgdG8gY2xlYXIgY2FjaGVcbm9uVG9nZ2xlQ2hhbmdlKHBhdGg6IHN0cmluZywgZXZlbnQ6IGFueSkge1xuICAvLyBDbGVhciBjYWNoZSB3aGVuIGVsZW1lbnQgY2hhbmdlc1xuICB0aGlzLmNsZWFyUHJvcGVydGllc0NhY2hlKCk7XG4gIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQgPyAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgOiBldmVudDtcbiAgdGhpcy5zZXRWYWx1ZUJ5UGF0aChwYXRoLCBjaGVja2VkKTtcbiAgXG4gIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnKSB7XG4gICAgbGV0IGZpZWxkc01ldGEgPSB0aGlzLmdldERhdGFCeVBhdGgoJ2ZpZWxkc01ldGEnKTtcbiAgICBpZiAodHlwZW9mIGZpZWxkc01ldGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZHNNZXRhID0gSlNPTi5wYXJzZShmaWVsZHNNZXRhIHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICAgIGZpZWxkc01ldGEgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAuLi5lbCxcbiAgICAgIGZpZWxkc01ldGE6IGZpZWxkc01ldGFcbiAgICB9KSk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG59XG5cbiAgLy8gVXBkYXRlIHlvdXIgc2V0VmFsdWVCeVBhdGggbWV0aG9kIHRvIGNsZWFyIGNhY2hlXG5zZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnksaXNUcmFuc2xhdGU6Ym9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIENsZWFyIGNhY2hlIHdoZW4gZWxlbWVudCBjaGFuZ2VzXG4gIHRoaXMuY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKTtcbiAgXG4gIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCkgPj0gMCkge1xuICAgIGlmIChwYXRoID09PSAncXVlc3Rpb25UZXh0JyB8fCBwYXRoID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVJbnB1dCh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gJ3F1ZXN0aW9uTnVtYmVyJykge1xuICAgICAgY29uc3QgbmV3T3JkZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgaWYgKGlzTmFOKG5ld09yZGVyKSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHsgcXVlc3Rpb25OdW1iZXI6IG5ld09yZGVyIH0pO1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc29ydEVsZW1lbnRzQnlPcmRlcigpO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gJ2ZvbnQnIHx8IHBhdGggPT09ICdmb250V2VpZ2h0Jykge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBbcGF0aF06IHZhbHVlIH0pKTtcbiAgICB9XG4gIH1cbiAgXG4gIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIGxldCBzdWJUZXh0ID0gZWxlbWVudC5zdWJUZXh0O1xuICAgIGlmICh0eXBlb2Ygc3ViVGV4dCA9PT0gJ3N0cmluZycgJiYgc3ViVGV4dC50cmltKCkgIT09ICcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdWJUZXh0ID0gSlNPTi5wYXJzZShzdWJUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdWJUZXh0OicsIGUpO1xuICAgICAgICBzdWJUZXh0ID0ge307XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ViVGV4dCAhPT0gJ29iamVjdCcgfHwgc3ViVGV4dCA9PT0gbnVsbCkge1xuICAgICAgc3ViVGV4dCA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBhcnJheUZpZWxkcyA9IFsnZmllbGQnLCAncXVlcnlQYXJhbWV0ZXInLCAnc291cmNlUXVlc3Rpb25JZCcsICdxdWVyeUZpZWxkJywgJ3F1ZXJ5VmFsdWUnXTtcbiAgICBpZiAoc3ViVGV4dCkge1xuICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJUZXh0W2tleV0pKSB7XG4gICAgICAgICAgc3ViVGV4dFtrZXldID0gc3ViVGV4dFtrZXldLmpvaW4oJywgJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gICAgICAgIFxuICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyl7XG4gICAgICBlbGVtZW50LmZpZWxkc01ldGEuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmKGZpZWxkPy5xdWVzdGlvbj8uc3ViVGV4dCl7XG4gICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQucXVlc3Rpb24uc3ViVGV4dFtrZXldKSkge1xuICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV0gPSBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV0uam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc1RyYW5zbGF0ZSkge1xuICAgICAgLy9TS1MyOEpVTDI1IFJlZnJlc2ggdGhlIGJvb2sgc2lnbmFsIGZyb20gc2VydmljZVxuICAgICAgY29uc3QgdXBkYXRlZEJvb2sgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICB0aGlzLmJvb2suc2V0KHVwZGF0ZWRCb29rKTtcbiAgICAgIC8vIFdvcmsgd2l0aCBhIG11dGFibGUgY29weVxuICAgICAgY29uc3QgY3VycmVudEJvb2sgPSB0aGlzLmJvb2soKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uTWFwID0gY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgfHwge307XG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEZvcm1CdWlsZGVyTGFuZ3VhZ2UoKTtcbiAgICAgIC8vU0tTMjhKVUwyNSBFbnN1cmUgbmVzdGVkIHN0cnVjdHVyZSBleGlzdHNcbiAgICAgIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10gPSB7fTtcbiAgICAgIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2VsZW1lbnQuaWRdKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bZWxlbWVudC5pZF0gPSB7fTtcbiAgICAgIC8vIFNldCB0aGUgdHJhbnNsYXRlZCB2YWx1ZVxuICAgICAgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2VsZW1lbnQuaWRdW3BhdGhdID0gdmFsdWU7XG4gICAgICAvLyBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTsgLy8gVHJpZ2dlciByZWFjdGl2ZSB1cGRhdGVcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH0gICAgXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBzdWJUZXh0IH0pKTtcbiAgfVxuICBcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+IHtcbiAgICBsZXQgb2JqID0geyAuLi5lbCB9O1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWN1cnJlbnRba2V5XSkge1xuICAgICAgICAgIGN1cnJlbnRba2V5XSA9IGlzTmFOKE51bWJlcihrZXlzW2luZGV4ICsgMV0pKSA/IHt9IDogW107XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgXG4gIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbn1cblxuICBnZXRTdHlsZUtleXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQoKT8uc3R5bGU7XG4gICAgcmV0dXJuIHN0eWxlICYmIHR5cGVvZiBzdHlsZSA9PT0gJ29iamVjdCcgPyBPYmplY3Qua2V5cyhzdHlsZSkgOiBbXTtcbiAgfVxuXG4gIHVwZGF0ZUVsZW1lbnQoZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIGVsZW1lbnQpO1xuICAgIGlmIChlbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHRoaXMuc2VsZWN0Q29sdW1uKCkpIHtcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgeyB1bmlxdWVJZGVudGlmaWVyOiB0aGlzLnNlbGVjdENvbHVtbigpIHx8IG51bGwgfSk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoeyAuLi5lbGVtZW50IH0pOyAvLyBFbnN1cmUgcmVhY3RpdmUgdXBkYXRlXG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsdWVCeUFycmF5UGF0aCh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IHN0cmluZywgc2VsZWN0Q29sdW1uOiBzdHJpbmcsIGtleVBhdGg6IHN0cmluZywgaXNUYWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcbiAgICBpZiAoaXNUYWJsZUNvbHVtbikge1xuICAgICAgdGFyZ2V0QXJyYXlQYXRoID0gJ2ZpZWxkc01ldGEnO1xuICAgICAgdGFyZ2V0QXJyYXlLZXkgPSAndW5pcXVlSWRlbnRpZmllcic7XG4gICAgICBrZXlQYXRoID0gJ3F1ZXN0aW9uLicgKyBrZXlQYXRoO1xuICAgIH1cbiAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICBpZiAodHlwZW9mIHRhcmdldEFycmF5ID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGFyZ2V0QXJyYXkgPSBKU09OLnBhcnNlKHRhcmdldEFycmF5IHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHRhcmdldEFycmF5OicsIGUpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHJldHVybiAnJztcbiAgICBjb25zdCBmb3VuZEl0ZW0gPSB0YXJnZXRBcnJheS5maW5kKGl0ZW0gPT4gaXRlbVt0YXJnZXRBcnJheUtleV0gPT09IHNlbGVjdENvbHVtbik7XG4gICAgcmV0dXJuIGZvdW5kSXRlbSA/IGtleVBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiBvYmo/LltrZXldLCBmb3VuZEl0ZW0pIDogJyc7XG4gIH1cbiAgXG4gIHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBzdHJpbmcsIHNlbGVjdENvbHVtbjogc3RyaW5nLCBrZXlQYXRoOiBzdHJpbmcsIGV2ZW50OiBhbnksIGlzVGFibGVDb2x1bW46IGJvb2xlYW4gPSBmYWxzZSxpc1RyYW5zbGF0ZTpib29sZWFuID0gZmFsc2UgKSB7XG4gICAgLy8gQ2xlYXIgY2FjaGUgd2hlbiBlbGVtZW50IGNoYW5nZXNcbiAgICB0aGlzLmNsZWFyUHJvcGVydGllc0NhY2hlKCk7XG4gICAgICAgIFxuICAgIGlmIChpc1RhYmxlQ29sdW1uKSB7XG4gICAgICB0YXJnZXRBcnJheVBhdGggPSAnZmllbGRzTWV0YSc7XG4gICAgICB0YXJnZXRBcnJheUtleSA9ICd1bmlxdWVJZGVudGlmaWVyJztcbiAgICAgIGtleVBhdGggPSAncXVlc3Rpb24uJyArIGtleVBhdGg7XG4gICAgfVxuICAgICAgICBcbiAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICBpZiAodHlwZW9mIHRhcmdldEFycmF5ID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGFyZ2V0QXJyYXkgPSBKU09OLnBhcnNlKHRhcmdldEFycmF5IHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHRhcmdldEFycmF5OicsIGUpO1xuICAgICAgICB0YXJnZXRBcnJheSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0QXJyYXkpKSB7XG4gICAgICB0YXJnZXRBcnJheSA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAgIC4uLmVsLFxuICAgICAgICBbdGFyZ2V0QXJyYXlQYXRoXTogdGFyZ2V0QXJyYXlcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgbGV0IGZvdW5kSXRlbSA9IHRhcmdldEFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW3RhcmdldEFycmF5S2V5XSA9PT0gc2VsZWN0Q29sdW1uKTtcbiAgICBpZiAoIWZvdW5kSXRlbSkge1xuICAgICAgZm91bmRJdGVtID0geyBbdGFyZ2V0QXJyYXlLZXldOiBzZWxlY3RDb2x1bW4gfTtcbiAgICAgIHRhcmdldEFycmF5LnB1c2goZm91bmRJdGVtKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qga2V5cyA9IGtleVBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IHt9O1xuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgaW5wdXRFbGVtZW50OiBhbnkgPSBldmVudC50YXJnZXQgPyBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCA6IGV2ZW50O1xuICAgIG9ialtsYXN0S2V5XSA9IGlucHV0RWxlbWVudD8udHlwZSA9PT0gJ2NoZWNrYm94JyA/IGlucHV0RWxlbWVudC5jaGVja2VkIDogaW5wdXRFbGVtZW50LnZhbHVlID8gaW5wdXRFbGVtZW50LnZhbHVlIDogaW5wdXRFbGVtZW50O1xuICAgIGlmIChpc1RyYW5zbGF0ZSkge1xuICAgICAgLy8gUmVmcmVzaCB0aGUgYm9va1xuICAgICAgdGhpcy5ib29rLnNldCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCkpO1xuICAgICAgLy9TS1MyOEpVTDI1IFdvcmsgd2l0aCBhIG11dGFibGUgY29weSBvZiB0aGUgc2lnbmFsIHZhbHVlXG4gICAgICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9vaygpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25NYXAgPSBjdXJyZW50Qm9vay50cmFuc2xhdGlvbk1hcCB8fCB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0Rm9ybUJ1aWxkZXJMYW5ndWFnZSgpO1xuICAgICAgLy8gSW5pdGlhbGl6ZSBuZXN0ZWQgc3RydWN0dXJlIHNhZmVseVxuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10pIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSA9IHt9O1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb2JqLmlkXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW29iai5pZF0gPSB7fTtcbiAgICAgIC8vIFNldCB0aGUgdHJhbnNsYXRlZCBpbnB1dFxuICAgICAgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW29iai5pZF1bbGFzdEtleV0gPSBpbnB1dEVsZW1lbnQ7XG4gICAgICAvL1NLUzI4SlVMMjUgVXBkYXRlIHRoZSBib29rIG9iamVjdCBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTtcbiAgICAgIC8vIE9wdGlvbmFsbHkgaW5mb3JtIHRoZSBzZXJ2aWNlXG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVCb29rKGN1cnJlbnRCb29rKTtcbiAgICB9ICAgIFxuICAgIGlmIChrZXlQYXRoID09PSAnc3VtbWFyeUNvbHVtbicpIHtcbiAgICAgIGlmIChvYmpbJ3N1bW1hcnlSb3cnXSA9PT0gdHJ1ZSkge1xuICAgICAgICBvYmpbJ3N1bW1hcnlSb3cnXSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0RWxlbWVudC5jaGVja2VkID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ2NhbGN1bGF0aW9uJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ1RleHQnO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoa2V5UGF0aCA9PT0gJ3N1bW1hcnlSb3cnKSB7XG4gICAgICBpZiAob2JqWydzdW1tYXJ5Q29sdW1uJ10gPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydzdW1tYXJ5Q29sdW1uJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dEVsZW1lbnQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICBvYmpbJ2ZsZFR5cGUnXSA9ICdjYWxjdWxhdGlvbic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbJ2ZsZFR5cGUnXSA9ICdUZXh0JztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAuLi5lbCxcbiAgICAgIFt0YXJnZXRBcnJheVBhdGhdOiB0YXJnZXRBcnJheVxuICAgIH0pKTtcbiAgICBcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnQoKSk7XG4gIH1cblxuICBnZXREYXRhQnlQYXRoKHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiBvYmo/LltrZXldLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIGZsaXBIb3Jpem9udGFsKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIGZsaXBIOiAhdC5mbGlwSCB9KSk7XG4gIH1cblxuICBmbGlwVmVydGljYWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgZmxpcFY6ICF0LmZsaXBWIH0pKTtcbiAgfVxuXG4gIHJlc2V0SW1hZ2UoKSB7XG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbi5zZXQoMCk7XG4gICAgdGhpcy5jcm9wcGVyLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMudHJhbnNmb3JtLnNldCh7XG4gICAgICB0cmFuc2xhdGVVbml0OiAncHgnLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICByb3RhdGU6IDAsXG4gICAgICBmbGlwSDogZmFsc2UsXG4gICAgICBmbGlwVjogZmFsc2UsXG4gICAgICB0cmFuc2xhdGVIOiAwLFxuICAgICAgdHJhbnNsYXRlVjogMFxuICAgIH0pO1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoeyAuLi50LCBzY2FsZTogdC5zY2FsZSEgLSAwLjEgfSkpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHNjYWxlOiB0LnNjYWxlISArIDAuMSB9KSk7XG4gIH1cblxuICByb3RhdGVMZWZ0KCkge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLnVwZGF0ZShjID0+IGMgLSAxKTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICByb3RhdGVSaWdodCgpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbi51cGRhdGUoYyA9PiBjICsgMSk7XG4gICAgICB0aGlzLmZsaXBBZnRlclJvdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbW92ZUxlZnQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgdHJhbnNsYXRlSDogdC50cmFuc2xhdGVIISAtIDEgfSkpO1xuICB9XG5cbiAgbW92ZVJpZ2h0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHRyYW5zbGF0ZUg6IHQudHJhbnNsYXRlSCEgKyAxIH0pKTtcbiAgfVxuXG4gIG1vdmVEb3duKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHRyYW5zbGF0ZVY6IHQudHJhbnNsYXRlViEgKyAxIH0pKTtcbiAgfVxuXG4gIG1vdmVVcCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoeyAuLi50LCB0cmFuc2xhdGVWOiB0LnRyYW5zbGF0ZVYhIC0gMSB9KSk7XG4gIH1cblxuICBwcml2YXRlIGZsaXBBZnRlclJvdGF0ZSgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoe1xuICAgICAgLi4udCxcbiAgICAgIGZsaXBIOiB0LmZsaXBWLFxuICAgICAgZmxpcFY6IHQuZmxpcEgsXG4gICAgICB0cmFuc2xhdGVIOiAwLFxuICAgICAgdHJhbnNsYXRlVjogMFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGltYWdlQ3JvcHBlZChldmVudDogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHRoaXMuY29udmVydEJsb2JUb0Jhc2U2NChldmVudC5vYmplY3RVcmwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBpbWFnZURhdGE6IGJhc2U2NCB9KSk7XG4gICAgICBhd2FpdCB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgdGhpcy5zZWxlY3RlZEVsZW1lbnQoKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBpbWFnZUNyb3BwZWQ6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBjcm9wcGVyUmVhZHkoc291cmNlSW1hZ2VEaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBjb252ZXJ0QmxvYlRvQmFzZTY0KG9iamVjdFVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZmV0Y2gob2JqZWN0VXJsKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKVxuICAgICAgLnRoZW4oYmxvYiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XG4gICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2hpbGRFdmVudENhcHR1cmUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoe1xuICAgICAgLi4uZWwsXG4gICAgICBxYlJlZmVyZW5jZTogZXZlbnQudmFsdWVPYmo/Lm5hbWUsXG4gICAgICBxYlJlZmVyZW5jZVF1ZXN0aW9uczogZXZlbnQudmFsdWVPYmo/Lmpzb25Cb2R5XG4gICAgfSkpO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIGxpbmtUb2dnbGVEcm9wZG93bihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzTGlua0Ryb3Bkb3duT3Blbi51cGRhdGUob3BlbiA9PiAhb3Blbik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duICYmICF0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5pc0xpbmtEcm9wZG93bk9wZW4uc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50LCBpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5kcmFnZ2VkSWQgPSBpZDtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIhLmVmZmVjdEFsbG93ZWQgPSBcIm1vdmVcIjtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIHRvIGFsbG93IGRyb3BcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgU3dhcCB0aGUgZHJhZ2dlZCBpdGVtIHdpdGggdGhlIGRyb3BwZWQgcG9zaXRpb25cbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIGtleTogc3RyaW5nKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0YXJnZXRJZCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIub3B0aW9uLWl0ZW1zXCIpPy5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpO1xuICAgIGlmICh0aGlzLmRyYWdnZWRJZCAmJiB0YXJnZXRJZCAmJiB0aGlzLmRyYWdnZWRJZCAhPT0gdGFyZ2V0SWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBbLi4uZWxba2V5XV07XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHRoaXMuZHJhZ2dlZElkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSB0YXJnZXRJZCk7XG4gICAgICAgIGlmIChkcmFnZ2VkSW5kZXggIT09IC0xICYmIHRhcmdldEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIFtvcHRpb25zW2RyYWdnZWRJbmRleF0sIG9wdGlvbnNbdGFyZ2V0SW5kZXhdXSA9IFtvcHRpb25zW3RhcmdldEluZGV4XSwgb3B0aW9uc1tkcmFnZ2VkSW5kZXhdXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5lbCwgW2tleV06IG9wdGlvbnMgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmRyYWdnZWRJZCA9IG51bGw7XG4gIH1cblxuICBkdXBsaWNhdGVGaWVsZChlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgY29uc3QgY29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xuICAgIC8vQVAtMThBUFIyNSBHZW5lcmF0ZSBhIG5ldyBJRCB1c2luZyB0aGUgc2VydmljZSdzIG1ldGhvZFxuICAgIGNvcHkuaWQgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5hZGRFbGVtZW50V2l0aElkKCk7XG4gICAgLy9jb3B5LnV1aWQgPSBjb3B5LmlkOyBcbiAgICAvLyBBUC0xOEFQUjI1IFNldCB0aGUgcXVlc3Rpb25OdW1iZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIG51bWJlclxuICAgIGNvcHkucXVlc3Rpb25OdW1iZXIgPSBlbGVtZW50cy5sZW5ndGggKyAxO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnQoY29weSk7XG4gIH1cblxuICBwcml2YXRlIGRyYWdnZWRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHVwZGF0ZUJvb2tTdWJ0ZXh0KGtleTogJ2VuZHBvaW50JyB8ICd2YXJpYWJsZScgfCAnZGVmYXVsdEZpZWxkJywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuYm9va1N1YnRleHQudXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIFtrZXldOiB2YWx1ZSxcbiAgICB9KSk7XG4gIH0gIFxuICB0cmFja0J5UHJvcChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBpdGVtPy5rZXkgPz8gaW5kZXg7XG4gIH1cbiAgXG4gIGdldE9wdGltaXplZFN1YlByb3BWYWx1ZShzdWJQcm9wOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChzdWJQcm9wLnRhcmdldEFycmF5IHx8IHN1YlByb3AuaXNUYWJsZUNvbHVtbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlQnlBcnJheVBhdGgoXG4gICAgICAgIHN1YlByb3AudGFyZ2V0QXJyYXksIFxuICAgICAgICBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBcbiAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW4oKSwgXG4gICAgICAgIHN1YlByb3Aua2V5LCBcbiAgICAgICAgc3ViUHJvcC5pc1RhYmxlQ29sdW1uXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgZWxlbWVudCk7XG4gIH1cbn0iLCI8IS0tIEFQIDIySkFOMjUgLSBGaWVsZCBhbmQgRWxlbWVudCBQcm9wZXJ0aWVzIC0tPlxuXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YWJzXCI+XG4gICAgPGRpdiBjbGFzcz1cInRhYlwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogYWN0aXZlVGFiKCkgPT09ICdhdHRyaWJ1dGVzJ31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdhdHRyaWJ1dGVzJylcIj57eyAnQVRUUklCVVRFUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQXR0cmlidXRlcycgfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnR5J31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdwcm9wZXJ0eScpXCI+e3sgJ1BST1BFUlRZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdQcm9wZXJ0eScgfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIoKSA9PT0gJ2FwcGVhcmFuY2UnfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2FwcGVhcmFuY2UnKVwiPnt7ICdBUFBFQVJBTkNFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBcHBlYXJhbmNlJyB9fTwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiAqbmdJZj1cImFjdGl2ZVRhYigpID09PSAnYXR0cmlidXRlcydcIj5cbiAgICBAZGVmZXIgKHdoZW4gZ2V0UHJvcGVydGllcygpKSB7XG4gICAgICA8ZGl2PlxuICAgICAgICBAZGVmZXIgKHdoZW4gc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdJbWFnZScpIHtcbiAgICAgICAgICA8aW1hZ2UtY3JvcHBlclxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKS5pbWFnZURhdGFcIlxuICAgICAgICAgICAgW2ltYWdlQmFzZTY0XT1cInNlbGVjdGVkRWxlbWVudCgpLm9yZ0ltYWdlRGF0YVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2FsaWduSW1hZ2VdPVwiYWxpZ25JbWFnZVwiXG4gICAgICAgICAgICBbcm91bmRDcm9wcGVyXT1cInJvdW5kQ3JvcHBlclwiXG4gICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cIid3aGl0ZSdcIlxuICAgICAgICAgICAgaW1hZ2VBbHRUZXh0PVwiQWx0ZXJuYXRpdmUgaW1hZ2UgdGV4dFwiXG4gICAgICAgICAgICBbYWxsb3dNb3ZlSW1hZ2VdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVSZXNpemVTcXVhcmVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjYW52YXNSb3RhdGlvbl09XCJjYW52YXNSb3RhdGlvbigpXCJcbiAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCJhc3BlY3RSYXRpb1wiXG4gICAgICAgICAgICBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljV2lkdGhdPVwiY3JvcHBlclN0YXRpY1dpZHRoXCJcbiAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljSGVpZ2h0XT1cImNyb3BwZXJTdGF0aWNIZWlnaHRcIlxuICAgICAgICAgICAgW2Nyb3BwZXJNaW5XaWR0aF09XCJjcm9wcGVyTWluV2lkdGhcIlxuICAgICAgICAgICAgW2Nyb3BwZXJNaW5IZWlnaHRdPVwiY3JvcHBlck1pbkhlaWdodFwiXG4gICAgICAgICAgICBbY3JvcHBlck1heFdpZHRoXT1cImNyb3BwZXJNYXhXaWR0aFwiXG4gICAgICAgICAgICBbY3JvcHBlck1heEhlaWdodF09XCJjcm9wcGVyTWF4SGVpZ2h0XCJcbiAgICAgICAgICAgIFtyZXNldENyb3BPbkFzcGVjdFJhdGlvQ2hhbmdlXT1cInRydWVcIlxuICAgICAgICAgICAgWyhjcm9wcGVyKV09XCJjcm9wcGVyXCJcbiAgICAgICAgICAgIFsodHJhbnNmb3JtKV09XCJ0cmFuc2Zvcm1cIlxuICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBvdXRwdXQ9XCJibG9iXCJcbiAgICAgICAgICAgIGZvcm1hdD1cInBuZ1wiXG4gICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjcm9wcGVyUmVhZHkpPVwiY3JvcHBlclJlYWR5KCRldmVudClcIlxuICAgICAgICAgID48L2ltYWdlLWNyb3BwZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudCgpLmltYWdlRGF0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiIHRpdGxlPVwie3sgJ1JPVEFURV9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSb3RhdGUgTGVmdCcgfX1cIj7in7I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlUmlnaHQoKVwiIHRpdGxlPVwie3sgJ1JPVEFURV9SSUdIVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUm90YXRlIFJpZ2h0JyB9fVwiPuKfszwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tT3V0KClcIiB0aXRsZT1cInt7ICdaT09NX09VVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWm9vbSBPdXQnIH19XCI+LTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tSW4oKVwiIHRpdGxlPVwie3sgJ1pPT01fSU4nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1pvb20gSW4nIH19XCI+KzwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlTGVmdCgpXCIgdGl0bGU9XCJ7eyAnTU9WRV9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIExlZnQnIH19XCI+4oaQPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVSaWdodCgpXCIgdGl0bGU9XCJ7eyAnTU9WRV9SSUdIVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTW92ZSBSaWdodCcgfX1cIj7ihpI8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVVwKClcIiB0aXRsZT1cInt7ICdNT1ZFX1VQJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIFVwJyB9fVwiPuKGkTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlRG93bigpXCIgdGl0bGU9XCJ7eyAnTU9WRV9ET1dOJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIERvd24nIH19XCI+4oaTPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBIb3Jpem9udGFsKClcIiBbbmdDbGFzc109XCJ7J2VuYWJsZWQnOiB0cmFuc2Zvcm0oKS5mbGlwSH1cIiB0aXRsZT1cInt7ICdGTElQX0hPUklaT05UQUxMWScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRmxpcCBIb3Jpem9udGFsbHknIH19XCI+4oaUPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBWZXJ0aWNhbCgpXCIgW25nQ2xhc3NdPVwieydlbmFibGVkJzogdHJhbnNmb3JtKCkuZmxpcFZ9XCIgdGl0bGU9XCJ7eyAnRkxJUF9WRVJUSUNBTExZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGbGlwIFZlcnRpY2FsbHknIH19XCI+4oaVPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJlc2V0SW1hZ2UoKVwiIHRpdGxlPVwie3sgJ1JFU0VUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSZXNldCcgfX1cIj7DlzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ0Jvb2snXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7ICdTRUFSQ0hfQk9PSycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoIEJvb2snIH19PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxuICAgICAgICAgICAgPG54dC1zZWFyY2gtYm94XG4gICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJzZWxlY3RlZEVsZW1lbnQoKVwiXG4gICAgICAgICAgICAgIFthcGlNZXRhXT1cImJvb2tTdWJ0ZXh0KClcIlxuICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJUZXh0XT1cIidTRUFSQ0gnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlYXJjaC4uLidcIlxuICAgICAgICAgICAgICAoc2VhcmNoVmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICA+PC9ueHQtc2VhcmNoLWJveD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWljb25cIj5cbiAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwibGlua1RvZ2dsZURyb3Bkb3duKCRldmVudClcIiBmaWxsPVwiIzAwMDAwMFwiIHZlcnNpb249XCIxLjFcIiBpZD1cIkNhcGFfMVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA0NTAgNDUwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMTguMTUsMjMwLjE5NWw3Ny45MzQtNzcuOTM3YzMxLjg5NC0zMS44OTIsMzEuODk0LTgzLjc4Mi0wLjAwNC0xMTUuNjc0bC0xMi42Ni0xMi42NlxuICAgICAgICAgIGMtMzEuODkzLTMxLjg5Ni04My43OC0zMS44OTYtMTE1LjY3NC0wLjAwNGwtNzcuOTM3LDc3LjkzNGMtMTcuNTg4LDE3LjU4OC0yNS40NTcsNDEuMjY0LTIzLjY0Niw2NC4zMTFcbiAgICAgICAgICBjLTIzLjA0NS0xLjgxMy00Ni43MjIsNi4wNTYtNjQuMzA4LDIzLjY0N0wyMy45MiwyNjcuNzQ4Yy0zMS44OTQsMzEuODg5LTMxLjg5NCw4My43NzksMCwxMTUuNjc0bDEyLjY2NCwxMi42NjJcbiAgICAgICAgICBjMzEuODkzLDMxLjg5Myw4My43ODMsMzEuODkzLDExNS42NzQsMGw3Ny45MzUtNzcuOTM2YzE3LjU5Mi0xNy41OSwyNS40NTktNDEuMjY2LDIzLjY0Ny02NC4zMDlcbiAgICAgICAgICBDMjc2Ljg4NCwyNTUuNjU0LDMwMC41NiwyNDcuNzgzLDMxOC4xNSwyMzAuMTk1eiBNMjAyLjY1MywyOTAuNjA1bC03Ny45MzYsNzcuOTM4Yy0xNi43MDUsMTYuNzAzLTQzLjg4OSwxNi43MDMtNjAuNTksMFxuICAgICAgICAgIGwtMTIuNjY2LTEyLjY2NmMtMTYuNzA1LTE2LjcwMS0xNi43MDMtNDMuODg1LDAtNjAuNTk0bDc3LjkzNi03Ny45MzJjMTQuMTQtMTQuMTQxLDM1Ljc3OS0xNi4zMDYsNTIuMjI2LTYuNTE2bC0zMi4zMDIsMzIuMzA3XG4gICAgICAgICAgYy03LjYwNiw3LjYwNC03LjYwNiwxOS45MzgsMCwyNy41NDFjNy42MDUsNy42MDcsMTkuOTM3LDcuNjA3LDI3LjU0MSwwbDMyLjMwNi0zMi4zMDNcbiAgICAgICAgICBDMjE4Ljk1OSwyNTQuODI4LDIxNi43OTUsMjc2LjQ2OSwyMDIuNjUzLDI5MC42MDV6IE0yMzguMzgyLDIwOS4xNjlsMzIuMjk5LTMyLjMwNmM3LjYwOC03LjYwMiw3LjYwOC0xOS45MzUsMC0yNy41MzhcbiAgICAgICAgICBjLTcuNjA0LTcuNjEtMTkuOTM2LTcuNjEtMjcuNTQxLTAuMDA0bC0zMi4zMDMsMzIuMzAzYy05Ljc5MS0xNi40NDYtNy42MjctMzguMDg3LDYuNTE0LTUyLjIyNmw3Ny45MzUtNzcuOTM1XG4gICAgICAgICAgYzE2LjcwNy0xNi43MDcsNDMuODktMTYuNzA3LDYwLjU5NCwwbDEyLjY2NCwxMi42NjRjMTYuNzA1LDE2LjcwNSwxNi43MDUsNDMuODg2LDAsNjAuNTkxbC03Ny45MzYsNzcuOTM3XG4gICAgICAgICAgQzI3Ni40NjgsMjE2Ljc5NywyNTQuODI4LDIxOC45NTksMjM4LjM4MiwyMDkuMTY5elwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzQzLjQ2NiwyNjEuNDY1Yy00NS4yODcsMC04MiwzNi43MTMtODIsODJzMzYuNzEzLDgyLDgyLDgyYzQ1LjI4NiwwLDgyLTM2LjcxMyw4Mi04MlMzODguNzUzLDI2MS40NjUsMzQzLjQ2NiwyNjEuNDY1elxuICAgICAgICAgICBNMzcyLjUwNSwzMzMuNTY0bC01Ni4wNDYsNTYuMTA0Yy0wLjIzOSwwLjIzOC0wLjUzNiwwLjQxLTAuODYyLDAuNDk2bC0yMi4zMTUsNS44NWMtMC42NDksMC4xNjgtMS4zNDctMC4wMi0xLjgyMi0wLjQ5NFxuICAgICAgICAgIGMtMC40NzctMC40NzktMC42NjYtMS4xNzItMC40OTYtMS44MjRsNS44MjYtMjIuMzE4YzAuMDg0LTAuMzI2LDAuMjU2LTAuNjI3LDAuNDk0LTAuODYzbDU2LjA0Ny01Ni4xMDRcbiAgICAgICAgICBjMC43NDItMC43NDIsMS45NDUtMC43NDQsMi42ODgtMC4wMDJsNC41NDgsNC41NDFjMC43MzksMC43NCwwLjc0MSwxLjk0MywwLDIuNjg4bC0zNy40MzMsMzcuNDcxbDQuNzA5LDQuNzAzbDM3LjQzNS0zNy40NzFcbiAgICAgICAgICBjMC43MzktMC43NDIsMS45NC0wLjc0MiwyLjY4Mi0wLjAwMmw0LjU1LDQuNTQxQzM3My4yNSwzMzEuNjE3LDM3My4yNSwzMzIuODIyLDM3Mi41MDUsMzMzLjU2NHogTTM5NS40NzIsMzEwLjU3NGwtMTcsMTcuMDE4XG4gICAgICAgICAgYy0wLjczOSwwLjc0NC0xLjk0MiwwLjc0NC0yLjY4NSwwLjAwMmwtMTYuNDg5LTE2LjQ3NWMtMC43NDQtMC43NC0wLjc0NC0xLjk0My0wLjAwMi0yLjY4OGwxNy0xNy4wMlxuICAgICAgICAgIGMwLjc0MS0wLjc0LDEuOTQ0LTAuNzQsMi42ODgtMC4wMDJsMTYuNDg3LDE2LjQ3N0MzOTYuMjE2LDMwOC42MjksMzk2LjIxNiwzMDkuODMyLDM5NS40NzIsMzEwLjU3NHpcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzTGlua0Ryb3Bkb3duT3BlbigpXCIgI2Ryb3Bkb3duPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRU5EX1BPSU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbmRwb2ludCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJib29rU3VidGV4dCgpLmVuZHBvaW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQm9va1N1YnRleHQoJ2VuZHBvaW50JywgJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdWQVJJQUJMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnVmFyaWFibGUnIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYm9va1N1YnRleHQoKS52YXJpYWJsZVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUJvb2tTdWJ0ZXh0KCd2YXJpYWJsZScsICRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRklFTEQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0ZpZWxkJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImZpZWxkQXNTdHJpbmcoKVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnREVGQVVMVF9GSUVMRCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVmYXVsdCBGaWVsZCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJib29rU3VidGV4dCgpLmRlZmF1bHRGaWVsZFwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUJvb2tTdWJ0ZXh0KCdkZWZhdWx0RmllbGQnLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpPy5lbGVtZW50UHJvcHM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInByb3AudHlwZSAhPT0gJ2NoZWNrYm94JyAmJiBwcm9wLnR5cGUgIT09ICdzdWJRdWVzdGlvbidcIiBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnaGVscFRleHQnICYmIHNlbGVjdGVkRWxlbWVudCgpPy5oZWxwVGV4dFwiPnt7IHNlbGVjdGVkRWxlbWVudCgpPy5oZWxwVGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGVhZGVyU2VsZWN0KCkgPyBib29rKCkucmVjb3Jkc1swXS50aXRsZSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gKGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhlYWRlclNlbGVjdCgpID8gdXBkYXRlVGl0bGUoJGV2ZW50KSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMHB4O1wiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N1YlF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgIDxkaXY+e3sgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViUHJvcCBvZiBwcm9wLnN1YlF1ZXN0aW9uXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmMmZmOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBzdWJQcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHN1YlByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYXJyYXknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGZpbHRlcmVkQ29sdW1ucygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic3ViUHJvcC5vcGVyYW5kcyA/IHN1YlByb3Aub3BlcmFuZHMuaW5jbHVkZXMoY29sdW1uLmFwaU5hbWUpIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZShzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUsICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5hcGlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmaWx0ZXJlZENvbHVtbnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInN1YlByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5KSA9PT0gY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25SYWRpb0NoYW5nZShzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2x1bW4uYXBpTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5KSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChzdWJQcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgc3ViUHJvcC5rZXksICRldmVudCxmYWxzZSwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50KSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHN1YlByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnc2VsZWN0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChzdWJQcm9wLnRhcmdldEFycmF5IHx8IHN1YlByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgc3ViUHJvcC5rZXksIHN1YlByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBzdWJQcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5LCAkZXZlbnQsIHN1YlByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN1YlByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnYWxpZ24nXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiAoY2xpY2spPVwib25BbGlnblNlbGVjdChvcHRpb24udmFsdWUpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBzZWxlY3RlZEVsZW1lbnQoKT8udGV4dEFsaWduID09PSBvcHRpb24udmFsdWV9XCIgW3RpdGxlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N0eWxlJ1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgKGNsaWNrKT1cIm9uU3R5bGVTZWxlY3Qob3B0aW9uLnZhbHVlKVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNTdHlsZUFjdGl2ZShvcHRpb24udmFsdWUpfVwiIFt0aXRsZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiJy4uL2Fzc2V0cy9pY29ucy8nICsgb3B0aW9uLmljb24gKyAnLnN2ZydcIiBbYWx0XT1cIm9wdGlvbi52YWx1ZVwiIGNsYXNzPVwiaWNvbi1zaXplXCIgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIihzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ3RpdGxlJ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTVweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogMjBweDsgYm9yZGVyLXJhZGl1czogMTJweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTmV3QnV0dG9uKClcIiBjbGFzcz1cImFkZC1idXR0b25cIj4rIHt7ICdBRERfQlVUVE9OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgQnV0dG9uJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnRuIG9mIGJvb2soKT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gfHwgW107IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJ1dHRvbi1jb25maWctY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0JVVFRPTl9OQU1FJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCdXR0b24gTmFtZScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYnRuLm5hbWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICduYW1lJywgJGV2ZW50LHRydWUpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBidXR0b24gbmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0VWRU5UX05BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0V2ZW50IE5hbWUnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImJ0bi5ldmVudHRvZW1pdFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ2V2ZW50dG9lbWl0JywgJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXZlbnQgdG8gZW1pdFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0FMVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWx0JyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJidG4uYWx0XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnYWx0JywgJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiQnV0dG9uIGFsdCB0ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRU5EX1BPSU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbmRwb2ludCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYnRuLmVuZHBvaW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnZW5kcG9pbnQnLCAkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJBUEkgZW5kcG9pbnRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdNRVRIT0QnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01ldGhvZCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCJidG4ubWV0aG9kXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnbWV0aG9kJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQT1NUXCI+UE9TVDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFVUXCI+UFVUPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJERUxFVEVcIj5ERUxFVEU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0JBQ0tHUk9VTkRfQ09MT1InIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0JhY2tncm91bmQgQ29sb3InIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbbmdNb2RlbF09XCJidG4uYmdDb2xvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ2JnQ29sb3InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQk9SREVSX1JBRElVUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQm9yZGVyIFJhZGl1cycgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCI1MFwiIFtuZ01vZGVsXT1cImJ0bi5ib3JkZXJSYWRpdXNcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICdib3JkZXJSYWRpdXMnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBidG4uYm9yZGVyUmFkaXVzIH19cHg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQlVUVE9OX1dJRFRIX1BYJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCdXR0b24gV2lkdGggKHB4KScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbbmdNb2RlbF09XCJidG4ud2lkdGhcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICd3aWR0aCcsICRldmVudClcIiBtaW49XCI1MFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgd2lkdGggaW4gcHhcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdURVhUX0NPTE9SJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdUZXh0IENvbG9yJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgW25nTW9kZWxdPVwiYnRuLnRleHRDb2xvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ3RleHRDb2xvcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdQT1NJVElPTl9QRVJDRU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdQb3NpdGlvbiAoJSknIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgW25nTW9kZWxdPVwiYnRuLnBvc2l0aW9uUGVyY2VudFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ3Bvc2l0aW9uUGVyY2VudCcsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ0bi5wb3NpdGlvblBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZUJ1dHRvbihidG4pXCIgY2xhc3M9XCJyZW1vdmUtYnV0dG9uXCI+w5cge3sgJ1JFTU9WRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVtb3ZlJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnR5J1wiPlxuICAgIEBkZWZlciAod2hlbiBnZXRQcm9wZXJ0aWVzKCkpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbD5MYWJlbCBJZDwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDExcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAgICB7eyBoZWFkZXJTZWxlY3QoKSA/IGJvb2tJZCgpIDogc2VsZWN0ZWRFbGVtZW50KCk/LmlkIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wIG9mIGdldFByb3BlcnRpZXMoKT8uZmllbGRQcm9wczsgdHJhY2tCeTogdHJhY2tCeVByb3BcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsICAqbmdJZj1cInByb3AudHlwZSAhPT0gJ3N1YlF1ZXN0aW9uJ1wiIGNsYXNzPVwidGV4dC1zbVwiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAndG9nZ2xlR3JvdXAnXCIgY2xhc3M9XCJ0b2dnbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc09wdGlvbmFsJywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc09wdGlvbmFsJylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc09wdGlvbmFsJywgJGV2ZW50LCB0cnVlLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKCdpc09wdGlvbmFsJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ1JFUVVJUkVEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSZXF1aXJlZCcgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc1JlYWRPbmx5JywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc1JlYWRPbmx5JylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc1JlYWRPbmx5JywgJGV2ZW50LCB0cnVlLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKCdpc1JlYWRPbmx5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ1JFQURfT05MWScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVhZCBPbmx5JyB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgJ2lzSGlkZGVuJywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc0hpZGRlbicpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCAnaXNIaWRkZW4nLCAkZXZlbnQsIHRydWUsIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UoJ2lzSGlkZGVuJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ0lTX0hJREUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0lzIEhpZGUnIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIgcHJvcC50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3AudHlwZSA9PT0gJ3JhZGlvJyB8fCBwcm9wLmtleSA9PT0gJ29wdGlvbnMnXCIgY2xhc3M9XCJvcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWxpc3RcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgcHJvcC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpID8gZ2V0VmFsdWVCeUFycmF5UGF0aCgnZmllbGRzTWV0YScsICd1bmlxdWVJZGVudGlmaWVyJywgc2VsZWN0Q29sdW1uKCksICBwcm9wLmtleSwgdHJ1ZSkgOiBzZWxlY3RlZEVsZW1lbnQoKVtwcm9wLmtleV0gOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJvcHRpb24taXRlbXNcIiBbYXR0ci5kYXRhLWlkXT1cIm9wdGlvbi5pZFwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgb3B0aW9uLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwib3B0aW9uLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib3B0aW9uLnZhbHVlID0gJGV2ZW50XCIgcGxhY2Vob2xkZXI9XCJPcHRpb25cIiBjbGFzcz1cIm9wdGlvbnNcIiAvPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZU9wdGlvbihzZWxlY3RlZEVsZW1lbnQoKVtwcm9wLmtleV0sIG9wdGlvbi5pZClcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJhZy1oYW5kbGVcIj7imLA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRPcHRpb24oc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgc2VsZWN0Q29sdW1uKCkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKCdmaWVsZHNNZXRhJywgJ3VuaXF1ZUlkZW50aWZpZXInLCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHRydWUpIDogc2VsZWN0ZWRFbGVtZW50KClbcHJvcC5rZXldKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtdmFyaWVudFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxnXCI+Kzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBREQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FkZCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICd0ZXh0J1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJoZWFkZXJTZWxlY3QoKSA/IGJvb2soKS5yZWNvcmRzWzBdLnRpdGxlIDogKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhlYWRlclNlbGVjdCgpID8gdXBkYXRlVGl0bGUoJGV2ZW50KSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N1YlF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3R5bGUtdG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTdWJRdWVzdGlvbihwcm9wKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkLWVsZW1lbnRzXCI+U3ViIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaXNFeHBhbmRlZCA/ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctZG93bi5zdmcnIDogJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1yaWdodC5zdmcnXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlRvZ2dsZSBBcnJvd1wiIGNsYXNzPVwiYXJyb3ctaWNvblwiPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRXhwYW5kZWRcIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWJQcm9wIG9mIHByb3Auc3ViUXVlc3Rpb247IHRyYWNrQnk6IHRyYWNrQnlQcm9wXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmMmZmOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBzdWJQcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHN1YlByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICd0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInN1YlByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0T3B0aW1pemVkU3ViUHJvcFZhbHVlKHN1YlByb3ApXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIihzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAoc3ViUHJvcC50YXJnZXRBcnJheSB8fCBzdWJQcm9wLmlzVGFibGVDb2x1bW4pKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlLCBzdWJQcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogc2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUsIHByb3AuaXNUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJlYWQtb25seV09XCJzZWxlY3RlZEVsZW1lbnQoKT8ucmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8IS0tIEFQLTAyQVBSMjUgUmVuZGVyIGlucHV0IGZpZWxkIG9ubHkgaWYgc3ViUHJvcC50eXBlIGlzICdhcnJheScgLS0+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdhcnJheSdcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJzdWJQcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KVwiIChpbnB1dCk9XCJzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSwgcHJvcC5pc1RyYW5zbGF0ZSlcIiAvPlxuXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdib29sZWFuJ1wiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3R5bGUtdG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTdHlsZVNlY3Rpb24oKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkLWVsZW1lbnRzXCI+e3sgJ1NUWUxFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTdHlsZScgfX08L2Rpdj5cbiAgICAgICAgICA8aW1nIFtzcmNdPVwiaXNTdHlsZUV4cGFuZGVkKCkgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiIGFsdD1cIlRvZ2dsZSBBcnJvd1wiIGNsYXNzPVwiYXJyb3ctaWNvblwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzU3R5bGVFeHBhbmRlZCgpXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQga2V5IG9mIGdldFN0eWxlS2V5cygpXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD57eyBrZXkgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpID8gZ2V0VmFsdWVCeUFycmF5UGF0aCgnZmllbGRzTWV0YScsICd1bmlxdWVJZGVudGlmaWVyJywgc2VsZWN0Q29sdW1uKCksJ3N0eWxlLicgKyBrZXksIHRydWUpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiAnc3R5bGUuJyArIGtleSlcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgc2VsZWN0Q29sdW1uKCkgKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoJ2ZpZWxkc01ldGEnLCAndW5pcXVlSWRlbnRpZmllcicsIHNlbGVjdENvbHVtbigpLCAnc3R5bGUuJyArIGtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSwgdHJ1ZSkgOiBzZXRWYWx1ZUJ5UGF0aCgnc3R5bGUuJyArIGtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIge3sga2V5IH19XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIoKSA9PT0gJ2FwcGVhcmFuY2UnXCI+XG4gICAgQGRlZmVyICh3aGVuIGdldFByb3BlcnRpZXMoKSkge1xuICAgICAgPGRpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcCBvZiBnZXRQcm9wZXJ0aWVzKCk/LmFwcGVhcmFuY2U7IHRyYWNrQnk6IHRyYWNrQnlQcm9wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPnt7IG9wdGlvbi5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBvcHRpb24ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5XCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIiBjbGFzcz1cImNvbG9yLXNlbGVjdG9yXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbGVtZW50KCk/LmZvbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aCgnZm9udENvbG9yJywgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2NvbG9yJ1wiIGNsYXNzPVwiaGV4LWlucHV0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdIRVhfQ09ERScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnSEVYIENvZGUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2J1dHRvbi10b2dnbGUnXCIgY2xhc3M9XCJidXR0b24tdG9nZ2xlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImR1cGxpY2F0ZUZpZWxkKHNlbGVjdGVkRWxlbWVudCgpKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0FERF9EVVBMSUNBVEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FkZCBEdXBsaWNhdGUnIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiICpuZ0lmPVwiIXRlbXBsYXRlU2VsZWN0ZWRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ0blwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+e3sgJ0NBTkNFTCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ2FuY2VsJyB9fTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzYXZlLWJ0blwiIChjbGljayk9XCJoYW5kbGVCdXR0b25DbGljaygpXCI+e3sgJ1NBVkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NhdmUnIH19PC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCIgKm5nSWY9XCJ0ZW1wbGF0ZVNlbGVjdGVkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyMHB4O1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJzYXZlLWJ0blwiIChjbGljayk9XCJoYW5kbGVUZW1wbGF0ZVNhdmUoKVwiPnt7ICdTQVZFX1RFTVBMQVRFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTYXZlIFRlbXBsYXRlJyB9fTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
1089
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMscUZBQXFGO0FBQ3JGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVySyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUlwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7OztBQUU3RSwwQ0FBMEM7QUFNMUMsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixTQUFTLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxlQUFvQixFQUFFO1FBQ3RELElBQUksQ0FB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QUFhLENBQ3RCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0E1akNVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLG9iQ3RDaEMsMnlvQ0FxZE0sNDJORHBiTSxZQUFZLGdPQUFFLFdBQVcsMEJBQWlGLHNCQUFzQixzYkFWL0gsa0JBQWtCLEVBVXVGLHNCQUFzQixpSkFBdEIsc0JBQXNCLHdGQVYvSCxrQkFBa0IsRUFVdUYsc0JBQXNCLHNLQVYvSCxrQkFBa0IsRUFVdUYsc0JBQXNCOztpR0FLL0gsbUJBQW1CO3NCQVIvQixTQUFTO21DQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLG1CQUcxSCx1QkFBdUIsQ0FBQyxNQUFNOzBKQUd0QyxnQkFBZ0I7MEJBQXhCLEtBQUs7b0JBQ08sbUJBQW1COzBCQUEvQixLQUFLO29CQUdJLGlCQUFpQjswQkFBMUIsTUFBTTtvQkFDRyxtQkFBbUI7MEJBQTVCLE1BQU07b0JBRW1DLFFBQVE7MEJBQWpELFNBQVM7MkJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtvQkFnL0J4QyxjQUFjOzBCQURiLFlBQVk7MkJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2NvbXBvbmVudC9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRTZWFyY2hCb3ggfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL3NlYXJjaC1ib3gvc2VhcmNoLWJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIERpbWVuc2lvbnMsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ludGVyZmFjZXMnO1xuLy9BUC0yNUpVTjI1LUltcG9ydGluZyBjb21tb24gY29uc3RhbnRzIGZvciBlbGVtZW50LCBmaWVsZCwgYW5kIGFwcGVhcmFuY2UgcHJvcGVydGllc1xuaW1wb3J0IHsgQ09NTU9OX0VMRU1FTlRfUFJPUFMsIENPTU1PTl9PUFRJT05TX0ZJRUxELCBDT01NT05fRklFTERfUFJPUFMsIENPTU1PTl9BUFBFQVJBTkNFX1BST1BTLCBDT01NT05fQ09MVU1OX0ZJRUxEIH0gZnJvbSAnLi4vcHJvcGVydGllcy9jb21tb24tZmllbGRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0tYnVpbGRlci9mb3JtLWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcblxuLy8gQ3VzdG9tIHBpcGUgZm9yIHBhdGgtYmFzZWQgdmFsdWUgYWNjZXNzXG5AUGlwZSh7XG4gIG5hbWU6ICdnZXRWYWx1ZUJ5UGF0aCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHB1cmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgR2V0VmFsdWVCeVBhdGhQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybShvYmo6IGFueSwgcGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSA9ICcnKTogYW55IHtcbiAgICBpZiAoIW9iaiB8fCAhcGF0aCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgobywgaykgPT4gbz8uW2tdID8/IGRlZmF1bHRWYWx1ZSwgb2JqKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvcGVydGllcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIE54dFNlYXJjaEJveCwgTmdDbGFzcywgTmdGb3IsIE5nSWYsIEdldFZhbHVlQnlQYXRoUGlwZSwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvcGVydGllcy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnRpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNldCBzZWxlY3RlZEVsZW1lbnRUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFR5cGVTaWcuc2V0KHZhbHVlKTtcbiAgfVxuICBAT3V0cHV0KCkgZm9ybUJ1dHRvbkhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlU2F2ZUhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGVcbiAgc2VsZWN0ZWRFbGVtZW50VHlwZVNpZyA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgc2VsZWN0ZWRFbGVtZW50ID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIHNlbGVjdGVkRWxlbWVudEluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuICBoZWFkZXJTZWxlY3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBib29rID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIGJvb2tJZCA9IHNpZ25hbDxhbnk+KG51bGwpO1xuICBhY3RpdmVUYWIgPSBzaWduYWw8c3RyaW5nPignYXR0cmlidXRlcycpO1xuICBzZWxlY3RDb2x1bW4gPSBzaWduYWw8YW55PihudWxsKTtcbiAgdHJhbnNmb3JtID0gc2lnbmFsPEltYWdlVHJhbnNmb3JtPih7XG4gICAgdHJhbnNsYXRlVW5pdDogJ3B4JyxcbiAgICBzY2FsZTogMSxcbiAgICByb3RhdGU6IDAsXG4gICAgZmxpcEg6IGZhbHNlLFxuICAgIGZsaXBWOiBmYWxzZSxcbiAgICB0cmFuc2xhdGVIOiAwLFxuICAgIHRyYW5zbGF0ZVY6IDBcbiAgfSk7XG4gIGNhbnZhc1JvdGF0aW9uID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIGNyb3BwZXIgPSBzaWduYWw8Q3JvcHBlclBvc2l0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNMaW5rRHJvcGRvd25PcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgZXJyb3JNZXNzYWdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBib29rU3VidGV4dCA9IHNpZ25hbCh7XG4gICAgZW5kcG9pbnQ6ICdodHRwczovL2Rldi1hcGkudmFsYXJoci5jb20vbnh0JyxcbiAgICB2YXJpYWJsZTogbnVsbCxcbiAgICBmaWVsZDogWydsYWJlbCcsICduYW1lJ10sXG4gICAgZGVmYXVsdEZpZWxkOiAnbGFiZWwnXG4gIH0pO1xuICBpc1N0eWxlRXhwYW5kZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBjcm9wcGVyTWF4SGVpZ2h0ID0gMDtcbiAgY3JvcHBlck1heFdpZHRoID0gMDtcbiAgY3JvcHBlck1pbkhlaWdodCA9IDA7XG4gIGNyb3BwZXJNaW5XaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNXaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQgPSAwO1xuICBhc3BlY3RSYXRpbyA9IDQgLyAzO1xuICByb3VuZENyb3BwZXIgPSBmYWxzZTtcbiAgaXNFeHBhbmRlZDogQm9vbGVhbiA9IGZhbHNlXG4gIGFsaWduSW1hZ2UgPSAnY2VudGVyJyBhcyBjb25zdDtcbiAgZWxlbWVudFR5cGUgPSBbJ0hlYWRlcicsJ0xpbmUnLCdTcGFjZScsJ1RhYmxlJywnVGFibGVDb2x1bW4nLCdDaGVja2JveCcsJ0Ryb3Bkb3duJywnUmFkaW8nLFwiVGV4dFwiLCBcIkNhbGVuZGFyXCIsIFwiRGF0ZVwiLCBcIlRpbWVcIiwgXCJEYXRlVGltZVwiLCBcIkVtYWlsXCIsIFwiQm9va1wiLCBcIkxpc3RcIiwgXCJUZXh0QXJlYVwiLCBcIlJpY2hUZXh0QXJlYVwiLCBcIk51bWJlclwiLCBcIkltYWdlXCIsIFwiTGFiZWxcIiwgXCJCb29sZWFuXCIsIFwiRmlsZVwiLCBcIkljb25cIiwgJ0J1dHRvbiddXG5cbiAgLy8gQWRkIHRoZXNlIHByb3BlcnRpZXMgdG8geW91ciBjb21wb25lbnQgY2xhc3NcbiAgcHJpdmF0ZSBfY2FjaGVkUHJvcGVydGllczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkRWxlbWVudDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkQ29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBDb21wdXRlZCBzaWduYWxzIGZvciBtZW1vaXphdGlvblxuICBmaWVsZEFzU3RyaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ib29rU3VidGV4dCgpLmZpZWxkLmpvaW4oJywgJykpO1xuICBmaWx0ZXJlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzTWV0YSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LmZpZWxkc01ldGEgPz8gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmllbGRzTWV0YSlcbiAgICAgID8gZmllbGRzTWV0YS5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyICE9PSB0aGlzLnNlbGVjdENvbHVtbigpKVxuICAgICAgOiBbXTtcbiAgfSk7XG5cbiAgLy8gTWVtb2l6ZWQgcHJvcGVydGllc1xuICBlbGVtZW50UHJvcGVydGllcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3JlYXRlRWxlbWVudFByb3BlcnRpZXMoKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlclNlcnZpY2U6IEZvcm1CdWlsZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHRlbXBsYXRlU2VydmljZTogVGVtcGxhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2VcbiAgKSB7fVxuICBcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc2VsZWN0SGVhZGVyU3ViamVjdCQuc3Vic2NyaWJlKGhlYWRlciA9PiB7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnNldCh7IHR5cGU6IGhlYWRlciB9KTtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3Quc2V0KHRydWUpO1xuICAgICAgICBjb25zdCBib29rRGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICAgICAgdGhpcy5ib29rLnNldChib29rRGF0YSk7XG4gICAgICAgIHRoaXMuYm9va0lkLnNldChib29rRGF0YT8ucmVjb3Jkc1swXT8uaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICBcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZWxlY3RlZEVsZW1lbnQkLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4LnNldChpbmRleCk7XG4gICAgICB0aGlzLmhlYWRlclNlbGVjdC5zZXQoZmFsc2UpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgICBpZiAoIWVsZW1lbnRzIHx8ICFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSB8fCBpbmRleCA+PSBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQobnVsbCk7IC8vIFJlc2V0IHNlbGVjdGVkRWxlbWVudCBpZiBpbnZhbGlkXG4gICAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW4uc2V0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50ID0geyAuLi5lbGVtZW50c1tpbmRleF0gfTsgLy8gU2FmZSB0byBzcHJlYWQgc2luY2Ugd2UgY2hlY2tlZFxuICAgICAgICBsZXQgZmllbGRzTWV0YSA9IGVsZW1lbnQ/LmZpZWxkc01ldGE7XG4gICAgICAgIGlmIChlbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpZWxkc01ldGEgPSBBcnJheS5pc0FycmF5KGZpZWxkc01ldGEpXG4gICAgICAgICAgICAgID8gZmllbGRzTWV0YVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZmllbGRzTWV0YSB8fCAnW10nKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICAgICAgICBmaWVsZHNNZXRhID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRTZWxlY3RUYWJsZUNvbHVtbigpID8/IG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoeyAuLi5lbGVtZW50LCBmaWVsZHNNZXRhIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc2V0KG51bGwpOyAvLyBSZXNldCBpZiBpbmRleCBpcyBpbnZhbGlkXG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldChudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN1YlRleHQgPSBlbGVtZW50LnN1YlRleHQ7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViVGV4dCA9PT0gJ3N0cmluZycgJiYgc3ViVGV4dC50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN1YlRleHQgPSBKU09OLnBhcnNlKHN1YlRleHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3ViVGV4dDonLCBlKTtcbiAgICAgICAgICAgIHN1YlRleHQgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN1YlRleHQgIT09ICdvYmplY3QnIHx8IHN1YlRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICBzdWJUZXh0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXlGaWVsZHMgPSBbJ2ZpZWxkJywgJ3F1ZXJ5UGFyYW1ldGVyJywgJ3NvdXJjZVF1ZXN0aW9uSWQnLCAncXVlcnlGaWVsZCcsICdxdWVyeVZhbHVlJ107XG4gICAgICAgIGlmIChzdWJUZXh0KSB7XG4gICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViVGV4dFtrZXldKSkge1xuICAgICAgICAgICAgICBzdWJUZXh0W2tleV0gPSBzdWJUZXh0W2tleV0uam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSAgICAgICAgXG4gICAgICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyl7XG4gICAgICAgICAgZWxlbWVudC5maWVsZHNNZXRhLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5zdWJUZXh0KXtcbiAgICAgICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSA9IGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBzdWJUZXh0IH0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBTS1MyOEpVTDI1IGZvcm1idWlsZGVyIGN1cnJlbnQgZWxlbWVudCB0cmFuc2xhdGlvbiB2YWx1ZSB1cGRhdGUgXG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGlvbnNMb2FkZWQkLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50cykgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkRWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGVsZTogYW55KSA9PiBlbGUuaWQgPT09IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkuaWQpO1xuICAgICAgICBpZiAobWF0Y2hlZEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQobWF0Y2hlZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9ICAgICAgXG4gICAgICBpZih0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSBcIkhlYWRlclwiKXtcbiAgICAgICAgY29uc3QgYm9va0RhdGEgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICAgIHRoaXMuYm9vay5zZXQoYm9va0RhdGEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoey4uLnRoaXMuc2VsZWN0ZWRFbGVtZW50KCl9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVsZW1lbnRQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIZWFkZXI6IHtcbiAgICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICd0aXRsZScsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdMQUJFTCcgfVxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIExpbmU6IHtcbiAgICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ0xpbmUgV2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScsIGxhYmVsUGF0aDogJ0xJTkVfV0lEVEgnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgVG9wJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdUb3AnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgdG9wJywgbGFiZWxQYXRoOiAnUEFERElOR19UT1AnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgQm90dG9tJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdCb3R0b20nLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgYm90dG9tJywgbGFiZWxQYXRoOiAnUEFERElOR19CT1RUT00nIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdMaW5lIFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2xpbmVTdHlsZScsIGxhYmVsUGF0aDogJ0xJTkVfU1RZTEUnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU29saWQnLCB2YWx1ZTogJ1NvbGlkJywgbGFiZWxQYXRoOiAnU09MSUQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEYXNoZWQnLCB2YWx1ZTogJ0Rhc2hlZCcsIGxhYmVsUGF0aDogJ0RBU0hFRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RvdHRlZCcsIHZhbHVlOiAnRG90dGVkJywgbGFiZWxQYXRoOiAnRE9UVEVEJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBmaWVsZFByb3BzOiBbXVxuICAgICAgfSxcbiAgICAgIFNwYWNlOiB7XG4gICAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJywgbGFiZWxQYXRoOiAnRUxFTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJywgbGFiZWxQYXRoOiAnRklFTERfU0laRScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW11cbiAgICAgIH0sXG4gICAgICBUYWJsZToge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnSXMgTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnY2hlY2tib3gnLCBrZXk6ICdzdHlsZS5zaG93TGFiZWwnLCBsYWJlbFBhdGg6ICdJU19MQUJFTCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAncHJpbWFyeUtleScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3ByaW1hcnlLZXknLCBsYWJlbFBhdGg6ICdQUklNQVJZX0tFWScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAndGFibGVOYW1lJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvblRleHQnLCBpc1RyYW5zbGF0ZTogdHJ1ZSwgbGFiZWxQYXRoOiAnVEFCTEVfTkFNRScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnaW5wdXRUZXh0QWxpZ25tZW50JywgcGxhY2Vob2xkZXI6ICdMZWZ0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdpbnB1dFRleHRBbGlnbm1lbnQnLCBsYWJlbFBhdGg6ICdJTlBVVF9URVhUX0FMSUdOTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAndGFibGVTY2FsZVNpemUnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAndGFibGVTY2FsZVNpemUnLCBsYWJlbFBhdGg6ICdUQUJMRV9TQ0FMRV9TSVpFJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc05vc0luZGljYXRvcicsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuaXNOb3NJbmRpY2F0b3InLCBsYWJlbFBhdGg6ICdJU19OT1NfSU5ESUNBVE9SJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc1BhZ2luYXRpb24nLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzUGFnaW5hdGlvbicsIGxhYmVsUGF0aDogJ0lTX1BBR0lOQVRJT04nIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2FkZElubGluZVJlY29yZCcsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuYWRkSW5saW5lUmVjb3JkJywgbGFiZWxQYXRoOiAnQUREX0lOTElORV9SRUNPUkQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2FjdGlvbkJ1dHRvbicsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuYWN0aW9uQnV0dG9uJywgbGFiZWxQYXRoOiAnQUNUSU9OX0JVVFRPTicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnc2VhcmNoQmFyJywgcGxhY2Vob2xkZXI6ICcwNiAtIEZ1bGwgU2NhbGUnLCB0eXBlOiAnY2hlY2tib3gnLCBrZXk6ICd0YWJsZUNvbmZpZy5zZWFyY2hCYXInLCBsYWJlbFBhdGg6ICdTRUFSQ0hfQkFSJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0RlbGV0ZVJvdycsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuaXNEZWxldGVSb3cnLCBsYWJlbFBhdGg6ICdJU19ERUxFVEVfUk9XJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0VkaXRSb3cnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzRWRpdFJvdycsIGxhYmVsUGF0aDogJ0lTX0VESVRfUk9XJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0J1dHRvbnMnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzQnV0dG9ucycsIGxhYmVsUGF0aDogJ0lTX0JVVFRPTlMnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ3Jvd0Nob2ljZScsIHBsYWNlaG9sZGVyOiAnJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyb3dDaG9pY2UnLCBsYWJlbFBhdGg6ICdST1dfQ0hPSUNFJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdxdWVzdGlvbk51bWJlcicsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicsIGxhYmVsUGF0aDogJ1FVRVNUSU9OX05VTUJFUicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJywgbGFiZWxQYXRoOiAnRklFTERfU0laRScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICd0YWJsZUlkJywgcGxhY2Vob2xkZXI6ICdFbXBfVGFibGVfMDEnLCB0eXBlOiAndGV4dCcsIGtleTogJ3RhYmxlSWQnLCBpc1RyYW5zbGF0ZTogdHJ1ZSwgbGFiZWxQYXRoOiAnVEFCTEVfSUQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2hlbHBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBtZXNzYWdlJywgdHlwZTogJ3RleHQnLCBrZXk6ICdoZWxwVGV4dCcsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdIRUxQX1RFWFQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2RlZmF1bHRWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRGVmYXVsdCBWYWx1ZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAnZGVmYXVsdFZhbHVlJywgbGFiZWxQYXRoOiAnREVGQVVMVF9WQUxVRScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJywgbGFiZWxQYXRoOiAnUkVGRVJFTkNFX0ZJRUxEJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCBrZXk6ICdpc1N1YlRleHQnLCBsYWJlbFBhdGg6ICdTVUJfVEVYVCcsXG4gICAgICAgICAgICBzdWJRdWVzdGlvbjogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnRW5kIFBvaW50JywgcGxhY2Vob2xkZXI6ICdlbmRwb2ludCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5lbmRwb2ludCcsIGxhYmVsUGF0aDogJ0VORF9QT0lOVCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1ZhcmlhYmxlJywgcGxhY2Vob2xkZXI6ICd2YXJpYWJsZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC52YXJpYWJsZScsIGxhYmVsUGF0aDogJ1ZBUklBQkxFJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRmllbGQnLCBwbGFjZWhvbGRlcjogJ2ZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LmZpZWxkJywgbGFiZWxQYXRoOiAnRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdRdWVyeSBQYXJhbWV0ZXInLCBwbGFjZWhvbGRlcjogJ3F1ZXJ5UGFyYW1ldGVyJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5UGFyYW1ldGVyJywgbGFiZWxQYXRoOiAnUVVFUllfUEFSQU1FVEVSJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnZGVmYXVsdEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LmRlZmF1bHRGaWVsZCcsIGxhYmVsUGF0aDogJ0RFRkFVTFRfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdMYWJlbCBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnbGFiZWxGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5sYWJlbEZpZWxkJywgbGFiZWxQYXRoOiAnTEFCRUxfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdWYWx1ZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAndmFsdWVGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC52YWx1ZUZpZWxkJywgbGFiZWxQYXRoOiAnVkFMVUVfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdTb3VyY2UgUXVlc3Rpb24gSWQnLCBwbGFjZWhvbGRlcjogJ3NvdXJjZVF1ZXN0aW9uSWQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQuc291cmNlUXVlc3Rpb25JZCcsIGxhYmVsUGF0aDogJ1NPVVJDRV9RVUVTVElPTl9JRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGVuZGVudCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnZGVwZW5kZW50VmFsdWUnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQuZGVwZW5kZW50VmFsdWUnLCBsYWJlbFBhdGg6ICdERVBFTkRFTlRfVkFMVUUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEZXBlbmRlbnQgRmllbGQnLCBwbGFjZWhvbGRlcjogJ2lzRGVwZW5kZW50RmllbGQnLCB0eXBlOiAnYm9vbGVhbicsIGtleTogJ3N1YlRleHQuaXNEZXBlbmRlbnRGaWVsZCcsIGxhYmVsUGF0aDogJ0RFUEVOREVOVF9GSUVMRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IEZpZWxkJywgcGxhY2Vob2xkZXI6ICdxdWVyeUZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5RmllbGQnLCBsYWJlbFBhdGg6ICdRVUVSWV9GSUVMRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdxdWVyeVZhbHVlJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5VmFsdWUnLCBsYWJlbFBhdGg6ICdRVUVSWV9WQUxVRScgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IFZhbHVlIFJlZicsIHBsYWNlaG9sZGVyOiAncXVlcnlWYWx1ZVJlZicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5xdWVyeVZhbHVlUmVmZXJlbmNlJywgbGFiZWxQYXRoOiAnUVVFUllfVkFMVUVfUkVGJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnVW5pcXVlIEtleScsIHBsYWNlaG9sZGVyOiAndW5pcXVlS2V5JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnVuaXF1ZUtleScsIGxhYmVsUGF0aDogJ1VOSVFVRV9LRVknIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICAgIHsgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ1NFTEVDVF9GT05UJywgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0hlbHZldGljYSBOZXVlJywgdmFsdWU6ICdIZWx2ZXRpY2EgTmV1ZScsIGxhYmVsUGF0aDogJ0hFTFZFVElDQV9ORVVFJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0FyaWFsJywgdmFsdWU6ICdBcmlhbCcsIGxhYmVsUGF0aDogJ0FSSUFMJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1RpbWVzIE5ldyBSb21hbicsIHZhbHVlOiAnVGltZXMgTmV3IFJvbWFuJywgbGFiZWxQYXRoOiAnVElNRVNfTkVXX1JPTUFOJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1JvYm90bycsIHZhbHVlOiAnUm9ib3RvJywgbGFiZWxQYXRoOiAnUk9CT1RPJyB9XG4gICAgICAgICAgXX0sXG4gICAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCBkZWZhdWx0VmFsdWU6ICcnLCByZXF1aXJlZDogdHJ1ZSwgbGFiZWxQYXRoOiAnRk9OVF9DT0xPUicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRm9udCBTaXplJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTaXplJywgZGVmYXVsdFZhbHVlOiAnJywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ0ZPTlRfU0laRScsIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTbWFsbCcsIHZhbHVlOiAnMTJweCcsIGxhYmVsUGF0aDogJ1NNQUxMJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ01lZGl1bScsIHZhbHVlOiAnMTRweCcsIGxhYmVsUGF0aDogJ01FRElVTScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMYXJnZScsIHZhbHVlOiAnMTZweCcsIGxhYmVsUGF0aDogJ0xBUkdFJyB9XG4gICAgICAgICAgXX0sXG4gICAgICAgICAgeyBsYWJlbDogJ0ZvbnQgV2lkdGgnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIGRlZmF1bHRWYWx1ZTogJycsIHJlcXVpcmVkOiB0cnVlLCBsYWJlbFBhdGg6ICdGT05UX1dJRFRIJywgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcsIGxhYmVsUGF0aDogJzQwMF9OT1JNQUwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJywgbGFiZWxQYXRoOiAnNTAwX01FRElVTScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnLCBsYWJlbFBhdGg6ICc2MDBfU0VNSV9CT0xEJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnLCBsYWJlbFBhdGg6ICc3MDBfQk9MRCcgfVxuICAgICAgICAgIF19LFxuICAgICAgICAgIHsgbGFiZWw6ICdEdXBsaWNhdGUgRmllbGQnLCB0eXBlOiAnYnV0dG9uLXRvZ2dsZScsIGtleTogJ2R1cGxpY2F0ZUZpZWxkJywgZGVmYXVsdFZhbHVlOiBmYWxzZSwgbGFiZWxQYXRoOiAnRFVQTElDQVRFX0ZJRUxEJyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBUYWJsZUNvbHVtbjoge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHBsYWNlaG9sZGVyOiAnVGV4dCcsIHR5cGU6ICdzZWxlY3QnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdmbGRUeXBlJywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ1RZUEUnLCBvcHRpb25zOiB0aGlzLmVsZW1lbnRUeXBlLm1hcChmID0+ICh7IGxhYmVsOiBmLCB2YWx1ZTogZiwgbGFiZWxQYXRoOiBmLnRvVXBwZXJDYXNlKCkgfSkpfSxcbiAgICAgICAgICB7IGxhYmVsOiAnaGVhZGVyTGFiZWxzJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdsYWJlbCcsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdIRUFERVJfTEFCRUxTJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdhcGlOYW1lJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdhcGlOYW1lJywgbGFiZWxQYXRoOiAnQVBJX05BTUUnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdTdW1tYXJ5IENvbHVtbicsIHBsYWNlaG9sZGVyOiAnU3VtbWFyeSBDb2x1bW4nLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdzdW1tYXJ5Q29sdW1uJywgbGFiZWxQYXRoOiAnU1VNTUFSWV9DT0xVTU4nLFxuICAgICAgICAgICAgc3ViUXVlc3Rpb246IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCBwbGFjZWhvbGRlcjogJ0VtcGxveWVlIERldGFpbHMnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2ZsZFR5cGUnLCBsYWJlbFBhdGg6ICdUWVBFJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnT3BlcmF0aW9uJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdvcGVyYXRpb24nLCBsYWJlbFBhdGg6ICdPUEVSQVRJT04nIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdPcGVyYW5kcycsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICdhcnJheScsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ29wZXJhbmRzJywgbGFiZWxQYXRoOiAnT1BFUkFORFMnIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1N1bW1hcnkgUm93JywgcGxhY2Vob2xkZXI6ICdTdW1tYXJ5IFJvdycsIHR5cGU6ICdzdWJRdWVzdGlvbicsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ3N1bW1hcnlSb3cnLCBsYWJlbFBhdGg6ICdTVU1NQVJZX1JPVycsXG4gICAgICAgICAgICBzdWJRdWVzdGlvbjogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICd0ZXh0JywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnZmxkVHlwZScsIGxhYmVsUGF0aDogJ1RZUEUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdvcGVyYXRpb24nLCBwbGFjZWhvbGRlcjogJ29wZXJhdGlvbicsIHR5cGU6ICd0ZXh0JywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnb3BlcmF0aW9uJywgbGFiZWxQYXRoOiAnT1BFUkFUSU9OJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY29sdW1uJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3JhZGlvJywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnY29sdW1uJywgbGFiZWxQYXRoOiAnQ09MVU1OJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY29sdW1ucycsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICdhcnJheScsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2NvbHVtbnMnLCBsYWJlbFBhdGg6ICdDT0xVTU5TJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnb3BlcmFuZHMnLCBwbGFjZWhvbGRlcjogJ0VtcGxveWVlIERldGFpbHMnLCB0eXBlOiAnYXJyYXknLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdvcGVyYW5kcycsIGxhYmVsUGF0aDogJ09QRVJBTkRTJyB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ3RleHRBbGlnbm1lbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ3RleHRBbGlnbm1lbnQnLCBsYWJlbFBhdGg6ICdURVhUX0FMSUdOTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnY29sdW1uU2NhbGVTaXplJywgcGxhY2Vob2xkZXI6ICcwNiAtIEZ1bGwgU2NhbGUnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2NvbHVtblNjYWxlU2l6ZScsIGxhYmVsUGF0aDogJ0NPTFVNTl9TQ0FMRV9TSVpFJyB9LFxuICAgICAgICBdLFxuICAgICAgICBmaWVsZFByb3BzOiBbXSxcbiAgICAgICAgYXBwZWFyYW5jZTogW11cbiAgICAgIH0sXG4gICAgICBDaGVja2JveDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKHsgY3VzdG9tRmllbGRQcm9wczogQ09NTU9OX09QVElPTlNfRklFTEQubWFwKG9wdCA9PiAoeyAuLi5vcHQsIHR5cGU6ICdjaGVja2JveCcgfSkpIH0pLFxuICAgICAgRHJvcGRvd246IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZyh7IGN1c3RvbUZpZWxkUHJvcHM6IENPTU1PTl9PUFRJT05TX0ZJRUxELm1hcChvcHQgPT4gKHsgLi4ub3B0LCB0eXBlOiAnZHJvcGRvd24nIH0pKSB9KSxcbiAgICAgIFJhZGlvOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoeyBjdXN0b21GaWVsZFByb3BzOiBDT01NT05fT1BUSU9OU19GSUVMRC5tYXAob3B0ID0+ICh7IC4uLm9wdCwgdHlwZTogJ2NoZWNrYm94JyB9KSkgfSksXG4gICAgICBUZXh0OiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIENhbGVuZGFyOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIERhdGU6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgVGltZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBEYXRlVGltZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBFbWFpbDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBCb29rOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIExpc3Q6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgVGV4dEFyZWE6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgUmljaFRleHRBcmVhOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIE51bWJlcjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBJbWFnZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBMYWJlbDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBCb29sZWFuOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIEZpbGU6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgSWNvbjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksIC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGVsZW1lbnRcbiAgICAgIEJ1dHRvbjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnRDb25maWcoY29uZmlnPzogeyBjdXN0b21FbGVtZW50UHJvcHM/OiBhbnlbXSwgY3VzdG9tRmllbGRQcm9wcz86IGFueVtdLCBjdXN0b21BcHBlYXJhbmNlUHJvcHM/OiBhbnlbXSB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRQcm9wczogWy4uLkNPTU1PTl9FTEVNRU5UX1BST1BTLCAuLi4oY29uZmlnPy5jdXN0b21FbGVtZW50UHJvcHMgfHwgW10pXSxcbiAgICAgIGZpZWxkUHJvcHM6IFsuLi5DT01NT05fRklFTERfUFJPUFMsIC4uLihjb25maWc/LmN1c3RvbUZpZWxkUHJvcHMgfHwgW10pXSxcbiAgICAgIGFwcGVhcmFuY2U6IFsuLi5DT01NT05fQVBQRUFSQU5DRV9QUk9QUywgLi4uKGNvbmZpZz8uY3VzdG9tQXBwZWFyYW5jZVByb3BzIHx8IFtdKV1cbiAgICB9O1xuICB9XG4gIC8vIEFQIDIzTUFZMjUgLSBBZGQgYSBuZXcgYnV0dG9uIHdpdGggZGVmYXVsdCBzdHlsaW5nXG4gIGFkZE5ld0J1dHRvbigpIHtcbiAgICBjb25zdCBsYXN0UGVyY2VudCA9IHRoaXMuYm9vaygpPy5xdWVzdGlvbmJvb2s/LmFjdGlvbj8uc2xpY2UoLTEpWzBdPy5wb3NpdGlvblBlcmNlbnQgPz8gMDtcbiAgICBjb25zdCBidXR0b25zID0ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBldmVudHRvZW1pdDogJycsXG4gICAgICBhbHQ6ICcnLFxuICAgICAgZW5kcG9pbnQ6ICcnLFxuICAgICAgbWV0aG9kOiAnJyxcbiAgICAgIGlkOiB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5hZGRFbGVtZW50V2l0aElkKCksXG4gICAgICBwb3NpdGlvblBlcmNlbnQ6IGxhc3RQZXJjZW50ICsgMTAsXG4gICAgICB3aWR0aDogMTAwLFxuICAgICAgYm9yZGVyUmFkaXVzOiA2LFxuICAgICAgYWxpZ25tZW50OiAnZmxleC1zdGFydCdcbiAgICB9O1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnV0dG9ucywgJ2FkZCcpO1xuICAgIHRoaXMuYm9vay51cGRhdGUoYm9vayA9PiAoeyAuLi5ib29rIH0pKTtcbiAgfVxuICAvL0FQIDIzTUFZMjUgLSBSZW1vdmUgYSBidXR0b24gZnJvbSB0aGUgYWN0aW9uIGxpc3QgXG4gIHJlbW92ZUJ1dHRvbihidG46IGFueSkge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnRuLCAncmVtb3ZlJyk7XG4gICAgdGhpcy5ib29rLnVwZGF0ZShib29rID0+ICh7IC4uLmJvb2sgfSkpO1xuICB9XG4gIC8vQVAgMjNNQVkyNSAtIFVwZGF0ZSBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgYnV0dG9uXG4gIG9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaW5kZXg6IG51bWJlciwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksaXNUcmFuc2xhdGU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLmJvb2soKT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gPz8gW107XG4gICAgaWYgKGJ1dHRvbnNbaW5kZXhdKSB7XG4gICAgICBidXR0b25zW2luZGV4XVtrZXldID0gdmFsdWU7XG4gICAgICB0aGlzLmJvb2sudXBkYXRlKGJvb2sgPT4gKHsgLi4uYm9vaywgcXVlc3Rpb25ib29rOiB7IC4uLmJvb2sucXVlc3Rpb25ib29rLCBhY3Rpb246IGJ1dHRvbnMgfSB9KSk7XG4gICAgfVxuICAgIGxldCBidXR0b24gPSBidXR0b25zW2luZGV4XVxuICAgIGlmKGlzVHJhbnNsYXRlKXtcbiAgICAgIC8vU0tTMjhKVUwyNSBSZWZyZXNoIHRoZSBib29rIHNpZ25hbCBmcm9tIHNlcnZpY2VcbiAgICAgIGNvbnN0IHVwZGF0ZWRCb29rID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgICAgdGhpcy5ib29rLnNldCh1cGRhdGVkQm9vayk7XG4gICAgICAvL1NLUzI4SlVMMjUgV29yayB3aXRoIGEgbXV0YWJsZSBjb3B5XG4gICAgICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9vaygpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25NYXAgPSBjdXJyZW50Qm9vay50cmFuc2xhdGlvbk1hcCB8fCB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0Rm9ybUJ1aWxkZXJMYW5ndWFnZSgpO1xuICAgICAgLy9TS1MyOEpVTDI1IEVuc3VyZSBuZXN0ZWQgc3RydWN0dXJlIGV4aXN0c1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10pIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSA9IHt9O1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bYnV0dG9uLmlkXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2J1dHRvbi5pZF0gPSB7fTtcbiAgICAgIC8vU0tTMjhKVUwyNSBTZXQgdGhlIHRyYW5zbGF0ZWQgdmFsdWVcbiAgICAgIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtidXR0b24uaWRdW2tleV0gPSB2YWx1ZTtcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTsgLy8gVHJpZ2dlciByZWFjdGl2ZSB1cGRhdGVcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH1cbiAgfVxuICAvL0FQLTEwTUFSMjUgVXBkYXRlcyB0aGUgdGl0bGUgdXNpbmcgdGhlIGZvcm0gYnVpbGRlciBzZXJ2aWNlICBcbiAgdXBkYXRlVGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVRpdGxlKHZhbHVlKTtcbiAgICB0aGlzLmJvb2sudXBkYXRlKGJvb2sgPT4gKHtcbiAgICAgIC4uLmJvb2ssXG4gICAgICByZWNvcmRzOiBbeyAuLi5ib29rLnJlY29yZHNbMF0sIHRpdGxlOiB2YWx1ZSB9XVxuICAgIH0pKTtcbiAgfVxuXG4gIHZhbGlkYXRlSW5wdXQodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGUgPT09ICdsYWJlbCcgfHwgdHlwZSA9PT0gJ3BsYWNlaG9sZGVyJykge1xuICAgICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTlcXHNdKiQvO1xuICAgICAgaWYgKCFyZWdleC50ZXN0KHZhbHVlKSkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoJ09ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldCgnJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB1cGRhdGVGaWVsZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5ib29rU3VidGV4dC51cGRhdGUoc3VidGV4dCA9PiAoe1xuICAgICAgLi4uc3VidGV4dCxcbiAgICAgIGZpZWxkOiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKVxuICAgIH0pKTtcbiAgfVxuXG4gIG9uQ2hlY2tib3hDaGFuZ2UodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBhbnksIGtleTogYW55LCBhcGlOYW1lOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgY29uc3QgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbigpKTtcbiAgICBmb3VuZEl0ZW1ba2V5XSA9IGZvdW5kSXRlbVtrZXldID8gZm91bmRJdGVtW2tleV0gOiBbXTtcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICBpZiAoIWZvdW5kSXRlbVtrZXldLmluY2x1ZGVzKGFwaU5hbWUpKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnB1c2goYXBpTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZm91bmRJdGVtW2tleV0uaW5kZXhPZihhcGlOYW1lKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIHVwZGF0ZVByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSA+PSAwKSB7XG4gICAgICBpZiAoa2V5ID09PSAncXVlc3Rpb25UZXh0JyB8fCBrZXkgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlSW5wdXQodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09ICdxdWVzdGlvbk51bWJlcicpIHtcbiAgICAgICAgLy9BUC0xME1BUjI1IENvbnZlcnQgdGhlIHZhbHVlIHRvIGFuIGludGVnZXIgIFxuICAgICAgICBjb25zdCBuZXdPcmRlciA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihuZXdPcmRlcikpIHJldHVybjtcblxuICAgICAgICAvL0FQLTEwTUFSMjUgVXBkYXRlIHRoZSBlbGVtZW50J3MgcXVlc3Rpb25OdW1iZXIgaW4gdGhlIGZvcm0gYnVpbGRlciBzZXJ2aWNlICBcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHsgcXVlc3Rpb25OdW1iZXI6IG5ld09yZGVyIH0pO1xuXG4gICAgICAgIC8vQVAtMTBNQVIyNSBTb3J0IGVsZW1lbnRzIGJhc2VkIG9uIHRoZSB1cGRhdGVkIHF1ZXN0aW9uTnVtYmVyICBcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc29ydEVsZW1lbnRzQnlPcmRlcigpO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ2ZvbnQnIHx8IGtleSA9PT0gJ2ZvbnRXZWlnaHQnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoeyAuLi5lbCwgW2tleV06IHZhbHVlIH0pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgW2tleV06IHZhbHVlIH07XG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgdXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBvblJhZGlvQ2hhbmdlKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogYW55LCBrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0QXJyYXkgPSBKU09OLnBhcnNlKHRhcmdldEFycmF5IHx8ICdbXScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyB0YXJnZXRBcnJheTonLCBlKTtcbiAgICAgICAgICB0YXJnZXRBcnJheSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0QXJyYXkpKSByZXR1cm47XG4gICAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbigpKTtcbiAgICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICAgIGZvdW5kSXRlbSA9IHsgW3RhcmdldEFycmF5S2V5XTogdGhpcy5zZWxlY3RDb2x1bW4oKSB9O1xuICAgICAgICB0YXJnZXRBcnJheS5wdXNoKGZvdW5kSXRlbSk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBrID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCFvYmpba10pIG9ialtrXSA9IHt9O1xuICAgICAgICBvYmogPSBvYmpba107XG4gICAgICB9XG4gICAgICBvYmpba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAgIC4uLmVsLFxuICAgICAgICBmaWVsZHNNZXRhOiB0YXJnZXRBcnJheVxuICAgICAgfSkpO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVxdWlyZWRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgbGV0IGxhYmVsID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQoKS5sYWJlbCA/IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkubGFiZWwucmVwbGFjZSgvXFxzKlxcKiskLywgJycpIDogJ0xhYmVsJztcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsYWJlbCA9IGAke2xhYmVsfSAqYDtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHkoJ2xhYmVsJywgbGFiZWwpO1xuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eSgnaXNPcHRpb25hbCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTdWJRdWVzdGlvbihwcm9wOiBhbnkpIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xuICB9XG5cbiAgdG9nZ2xlU3R5bGVTZWN0aW9uKCkge1xuICAgIHRoaXMuaXNTdHlsZUV4cGFuZGVkLnNldCghdGhpcy5pc1N0eWxlRXhwYW5kZWQoKSk7XG4gIH1cblxuICBnZXRQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1uID0gdGhpcy5zZWxlY3RDb2x1bW4oKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdXNlIGNhY2hlZCByZXN1bHRcbiAgICBpZiAodGhpcy5fY2FjaGVkUHJvcGVydGllcyAmJiBcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9PT0gZWxlbWVudCAmJiBcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID09PSBzZWxlY3RlZENvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFByb3BlcnRpZXM7XG4gICAgfSAgICBcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2NhY2hlZFByb3BlcnRpZXMgPSBudWxsO1xuICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9sYXN0U2VsZWN0ZWRDb2x1bW4gPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICBcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnSGVhZGVyJykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5lbGVtZW50UHJvcGVydGllcygpWydIZWFkZXInXTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyAmJiBzZWxlY3RlZENvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IGZpZWxkc01ldGEgPSBlbGVtZW50LmZpZWxkc01ldGE7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZHNNZXRhID0gQXJyYXkuaXNBcnJheShmaWVsZHNNZXRhKVxuICAgICAgICAgID8gZmllbGRzTWV0YVxuICAgICAgICAgIDogSlNPTi5wYXJzZShmaWVsZHNNZXRhIHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGEgaW4gZ2V0UHJvcGVydGllczonLCBlKTtcbiAgICAgICAgZmllbGRzTWV0YSA9IFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBjb2x1bW4gPSBmaWVsZHNNZXRhLmZpbmQoKGM6IGFueSkgPT4gYy51bmlxdWVJZGVudGlmaWVyID09PSBzZWxlY3RlZENvbHVtbik7XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IG1hcmtJc1RhYmxlQ29sdW1uID0gKGl0ZW1zOiBhbnlbXSA9IFtdKSA9PlxuICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0sIGlzVGFibGVDb2x1bW46IHRydWUgfTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0l0ZW0uc3ViUXVlc3Rpb24pKSB7XG4gICAgICAgICAgICAgIG5ld0l0ZW0uc3ViUXVlc3Rpb24gPSBuZXdJdGVtLnN1YlF1ZXN0aW9uLm1hcChzdWIgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5zdWIsXG4gICAgICAgICAgICAgICAgaXNUYWJsZUNvbHVtbjogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbJ1RhYmxlQ29sdW1uJ10uZWxlbWVudFByb3BzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLm1hcmtJc1RhYmxlQ29sdW1uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVt0aGlzLmVsZW1lbnRUeXBlLmluY2x1ZGVzKGNvbHVtbi5mbGRUeXBlKSA/IGNvbHVtbi5mbGRUeXBlIDogJ1RleHQnXT8uZWxlbWVudFByb3BzKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgICAgLi4uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVsnVGFibGVDb2x1bW4nXS5maWVsZFByb3BzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLm1hcmtJc1RhYmxlQ29sdW1uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVt0aGlzLmVsZW1lbnRUeXBlLmluY2x1ZGVzKGNvbHVtbi5mbGRUeXBlKSA/IGNvbHVtbi5mbGRUeXBlIDogJ1RleHQnXT8uZmllbGRQcm9wcylcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbJ1RhYmxlQ29sdW1uJ10uYXBwZWFyYW5jZSB8fCBbXSksXG4gICAgICAgICAgICAuLi5tYXJrSXNUYWJsZUNvbHVtbih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbdGhpcy5lbGVtZW50VHlwZS5pbmNsdWRlcyhjb2x1bW4uZmxkVHlwZSkgPyBjb2x1bW4uZmxkVHlwZSA6ICdUZXh0J10/LmFwcGVhcmFuY2UpXG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbGVtZW50UHJvcGVydGllcygpWydUYWJsZUNvbHVtbiddO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbZWxlbWVudC50eXBlXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuX2NhY2hlZFByb3BlcnRpZXMgPSByZXN1bHQ7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID0gc2VsZWN0ZWRDb2x1bW47XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBBZGQgbWV0aG9kIHRvIGNsZWFyIGNhY2hlIHdoZW4gbmVlZGVkXG4gIHByaXZhdGUgY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKSB7XG4gICAgdGhpcy5fY2FjaGVkUHJvcGVydGllcyA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID0gbnVsbDtcbiAgfVxuICAvLyBBUC0yOE1BUjI1IEFkZCBhbiBvcHRpb24gd2l0aCBhIHVuaXF1ZSBVVUlEXG4gIGFkZE9wdGlvbihvcHRpb25zOiBhbnlbXSkge1xuICAgIGNvbnN0IHVuaXF1ZV9pZCA9IHV1aWR2NCgpO1xuICAgIG9wdGlvbnMucHVzaCh7IGlkOiB1bmlxdWVfaWQsIHZhbHVlOiAnJyB9KTtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIG9wdGlvbiBiYXNlZCBvbiBpdHMgdW5pcXVlIFVVSURcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbnM6IGFueVtdLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSBpZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUJ1dHRvbkNsaWNrKCkge1xuICAgIHRoaXMuZm9ybUJ1dHRvbkhhbmRsZXIuZW1pdCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gIH1cblxuICBoYW5kbGVUZW1wbGF0ZVNhdmUoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVNhdmVIYW5kbGVyLmVtaXQodGhpcy50ZW1wbGF0ZVNlcnZpY2UuZG93bmxvYWQoKSk7XG4gIH1cblxuICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiKTtcbiAgfVxuXG4gIG9uU2F2ZSgpIHt9XG5cbiAgb25DYW5jZWwoKSB7fVxuXG4gIG9uQWxpZ25TZWxlY3QodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoeyAuLi5lbCwgdGV4dEFsaWduOiB2YWx1ZSB9KSk7XG4gIH1cblxuICBvblN0eWxlU2VsZWN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgIC4uLmVsLFxuICAgICAgc3R5bGVzOiBbdmFsdWVdXG4gICAgfSkpO1xuICB9XG5cbiAgaXNTdHlsZUFjdGl2ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LnN0eWxlcz8uaW5jbHVkZXModmFsdWUpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0VmFsdWVCeVBhdGgocGF0aDogc3RyaW5nLCBvYmo6IGFueSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCksIGRlZmF1bHRWYWx1ZTogYW55ID0gJycpOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvLCBrKSA9PiBvPy5ba10gPz8gZGVmYXVsdFZhbHVlLCBvYmopO1xuICB9XG4gIGlzQW5vdGhlcklkU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKClcbiAgICAgIC5zb21lKChlbCwgaSkgPT4gaSAhPT0gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpICYmIGVsLnByaW1hcnlLZXkpO1xuICB9XG5cbiAgLy8gQWxzbyB1cGRhdGUgeW91ciBvblRvZ2dsZUNoYW5nZSBtZXRob2QgdG8gY2xlYXIgY2FjaGVcbm9uVG9nZ2xlQ2hhbmdlKHBhdGg6IHN0cmluZywgZXZlbnQ6IGFueSkge1xuICAvLyBDbGVhciBjYWNoZSB3aGVuIGVsZW1lbnQgY2hhbmdlc1xuICB0aGlzLmNsZWFyUHJvcGVydGllc0NhY2hlKCk7XG4gIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQgPyAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgOiBldmVudDtcbiAgdGhpcy5zZXRWYWx1ZUJ5UGF0aChwYXRoLCBjaGVja2VkKTtcbiAgXG4gIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnKSB7XG4gICAgbGV0IGZpZWxkc01ldGEgPSB0aGlzLmdldERhdGFCeVBhdGgoJ2ZpZWxkc01ldGEnKTtcbiAgICBpZiAodHlwZW9mIGZpZWxkc01ldGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZHNNZXRhID0gSlNPTi5wYXJzZShmaWVsZHNNZXRhIHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICAgIGZpZWxkc01ldGEgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAuLi5lbCxcbiAgICAgIGZpZWxkc01ldGE6IGZpZWxkc01ldGFcbiAgICB9KSk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG59XG5cbiAgLy8gVXBkYXRlIHlvdXIgc2V0VmFsdWVCeVBhdGggbWV0aG9kIHRvIGNsZWFyIGNhY2hlXG5zZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnksaXNUcmFuc2xhdGU6Ym9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIENsZWFyIGNhY2hlIHdoZW4gZWxlbWVudCBjaGFuZ2VzXG4gIHRoaXMuY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKTtcbiAgXG4gIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCkgPj0gMCkge1xuICAgIGlmIChwYXRoID09PSAncXVlc3Rpb25UZXh0JyB8fCBwYXRoID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVJbnB1dCh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gJ3F1ZXN0aW9uTnVtYmVyJykge1xuICAgICAgY29uc3QgbmV3T3JkZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgaWYgKGlzTmFOKG5ld09yZGVyKSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHsgcXVlc3Rpb25OdW1iZXI6IG5ld09yZGVyIH0pO1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc29ydEVsZW1lbnRzQnlPcmRlcigpO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gJ2ZvbnQnIHx8IHBhdGggPT09ICdmb250V2VpZ2h0Jykge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBbcGF0aF06IHZhbHVlIH0pKTtcbiAgICB9XG4gIH1cbiAgXG4gIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIGxldCBzdWJUZXh0ID0gZWxlbWVudC5zdWJUZXh0O1xuICAgIGlmICh0eXBlb2Ygc3ViVGV4dCA9PT0gJ3N0cmluZycgJiYgc3ViVGV4dC50cmltKCkgIT09ICcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdWJUZXh0ID0gSlNPTi5wYXJzZShzdWJUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdWJUZXh0OicsIGUpO1xuICAgICAgICBzdWJUZXh0ID0ge307XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ViVGV4dCAhPT0gJ29iamVjdCcgfHwgc3ViVGV4dCA9PT0gbnVsbCkge1xuICAgICAgc3ViVGV4dCA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBhcnJheUZpZWxkcyA9IFsnZmllbGQnLCAncXVlcnlQYXJhbWV0ZXInLCAnc291cmNlUXVlc3Rpb25JZCcsICdxdWVyeUZpZWxkJywgJ3F1ZXJ5VmFsdWUnXTtcbiAgICBpZiAoc3ViVGV4dCkge1xuICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJUZXh0W2tleV0pKSB7XG4gICAgICAgICAgc3ViVGV4dFtrZXldID0gc3ViVGV4dFtrZXldLmpvaW4oJywgJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gICAgICAgIFxuICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyl7XG4gICAgICBlbGVtZW50LmZpZWxkc01ldGEuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmKGZpZWxkPy5xdWVzdGlvbj8uc3ViVGV4dCl7XG4gICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQucXVlc3Rpb24uc3ViVGV4dFtrZXldKSkge1xuICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV0gPSBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV0uam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc1RyYW5zbGF0ZSkge1xuICAgICAgLy9TS1MyOEpVTDI1IFJlZnJlc2ggdGhlIGJvb2sgc2lnbmFsIGZyb20gc2VydmljZVxuICAgICAgY29uc3QgdXBkYXRlZEJvb2sgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICB0aGlzLmJvb2suc2V0KHVwZGF0ZWRCb29rKTtcbiAgICAgIC8vIFdvcmsgd2l0aCBhIG11dGFibGUgY29weVxuICAgICAgY29uc3QgY3VycmVudEJvb2sgPSB0aGlzLmJvb2soKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uTWFwID0gY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgfHwge307XG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEZvcm1CdWlsZGVyTGFuZ3VhZ2UoKTtcbiAgICAgIC8vU0tTMjhKVUwyNSBFbnN1cmUgbmVzdGVkIHN0cnVjdHVyZSBleGlzdHNcbiAgICAgIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10gPSB7fTtcbiAgICAgIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2VsZW1lbnQuaWRdKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bZWxlbWVudC5pZF0gPSB7fTtcbiAgICAgIC8vIFNldCB0aGUgdHJhbnNsYXRlZCB2YWx1ZVxuICAgICAgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2VsZW1lbnQuaWRdW3BhdGhdID0gdmFsdWU7XG4gICAgICAvLyBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTsgLy8gVHJpZ2dlciByZWFjdGl2ZSB1cGRhdGVcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH0gICAgXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBzdWJUZXh0IH0pKTtcbiAgfVxuICBcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+IHtcbiAgICBsZXQgb2JqID0geyAuLi5lbCB9O1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWN1cnJlbnRba2V5XSkge1xuICAgICAgICAgIGN1cnJlbnRba2V5XSA9IGlzTmFOKE51bWJlcihrZXlzW2luZGV4ICsgMV0pKSA/IHt9IDogW107XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgXG4gIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbn1cbm9wdGlvblRyYW5zbGF0aW9uVXBkYXRlKG9wdGlvbjogYW55LCBldmVudDogYW55KXtcbiAgLy9TS1MyOEpVTDI1IFJlZnJlc2ggdGhlIGJvb2sgc2lnbmFsIGZyb20gc2VydmljZVxuICBjb25zdCB1cGRhdGVkQm9vayA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgdGhpcy5ib29rLnNldCh1cGRhdGVkQm9vayk7XG4gIC8vIFdvcmsgd2l0aCBhIG11dGFibGUgY29weVxuICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9vaygpO1xuICBjb25zdCB0cmFuc2xhdGlvbk1hcCA9IGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwIHx8IHt9O1xuICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEZvcm1CdWlsZGVyTGFuZ3VhZ2UoKTtcbiAgLy9TS1MyOEpVTDI1IEVuc3VyZSBuZXN0ZWQgc3RydWN0dXJlIGV4aXN0c1xuICBpZiAoIXRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddID0ge307XG4gIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW29wdGlvbi5pZF0pIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtvcHRpb24uaWRdID0ge307XG4gIC8vIFNldCB0aGUgdHJhbnNsYXRlZCB2YWx1ZVxuICB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb3B0aW9uLmlkXVsndmFsdWUnXSA9IGV2ZW50O1xuICAvLyBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgPSB0cmFuc2xhdGlvbk1hcDtcbiAgdGhpcy5ib29rLnNldChjdXJyZW50Qm9vayk7IC8vIFRyaWdnZXIgcmVhY3RpdmUgdXBkYXRlXG4gIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlQm9vayhjdXJyZW50Qm9vayk7XG59XG4gIGdldFN0eWxlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy5zdHlsZTtcbiAgICByZXR1cm4gc3R5bGUgJiYgdHlwZW9mIHN0eWxlID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKHN0eWxlKSA6IFtdO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudChlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgZWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgdGhpcy5zZWxlY3RDb2x1bW4oKSkge1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc2V0U2VsZWN0ZWRUYWJsZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB7IHVuaXF1ZUlkZW50aWZpZXI6IHRoaXMuc2VsZWN0Q29sdW1uKCkgfHwgbnVsbCB9KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnNldCh7IC4uLmVsZW1lbnQgfSk7IC8vIEVuc3VyZSByZWFjdGl2ZSB1cGRhdGVcbiAgICB9XG4gIH1cblxuICBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogc3RyaW5nLCBzZWxlY3RDb2x1bW46IHN0cmluZywga2V5UGF0aDogc3RyaW5nLCBpc1RhYmxlQ29sdW1uOiBib29sZWFuID0gZmFsc2UpOiBhbnkge1xuICAgIGlmIChpc1RhYmxlQ29sdW1uKSB7XG4gICAgICB0YXJnZXRBcnJheVBhdGggPSAnZmllbGRzTWV0YSc7XG4gICAgICB0YXJnZXRBcnJheUtleSA9ICd1bmlxdWVJZGVudGlmaWVyJztcbiAgICAgIGtleVBhdGggPSAncXVlc3Rpb24uJyArIGtleVBhdGg7XG4gICAgfVxuICAgIGxldCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0YXJnZXRBcnJheSA9IEpTT04ucGFyc2UodGFyZ2V0QXJyYXkgfHwgJ1tdJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgdGFyZ2V0QXJyYXk6JywgZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhcmdldEFycmF5KSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRhcmdldEFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW3RhcmdldEFycmF5S2V5XSA9PT0gc2VsZWN0Q29sdW1uKTtcbiAgICByZXR1cm4gZm91bmRJdGVtID8ga2V5UGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIGZvdW5kSXRlbSkgOiAnJztcbiAgfVxuICBcbiAgdXBkYXRlVmFsdWVCeUFycmF5UGF0aCh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IHN0cmluZywgc2VsZWN0Q29sdW1uOiBzdHJpbmcsIGtleVBhdGg6IHN0cmluZywgZXZlbnQ6IGFueSwgaXNUYWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlLGlzVHJhbnNsYXRlOmJvb2xlYW4gPSBmYWxzZSApIHtcbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIGVsZW1lbnQgY2hhbmdlc1xuICAgIHRoaXMuY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKTtcbiAgICAgICAgXG4gICAgaWYgKGlzVGFibGVDb2x1bW4pIHtcbiAgICAgIHRhcmdldEFycmF5UGF0aCA9ICdmaWVsZHNNZXRhJztcbiAgICAgIHRhcmdldEFycmF5S2V5ID0gJ3VuaXF1ZUlkZW50aWZpZXInO1xuICAgICAga2V5UGF0aCA9ICdxdWVzdGlvbi4nICsga2V5UGF0aDtcbiAgICB9XG4gICAgICAgIFxuICAgIGxldCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0YXJnZXRBcnJheSA9IEpTT04ucGFyc2UodGFyZ2V0QXJyYXkgfHwgJ1tdJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgdGFyZ2V0QXJyYXk6JywgZSk7XG4gICAgICAgIHRhcmdldEFycmF5ID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHtcbiAgICAgIHRhcmdldEFycmF5ID0gW107XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgICAgLi4uZWwsXG4gICAgICAgIFt0YXJnZXRBcnJheVBhdGhdOiB0YXJnZXRBcnJheVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBcbiAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSBzZWxlY3RDb2x1bW4pO1xuICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICBmb3VuZEl0ZW0gPSB7IFt0YXJnZXRBcnJheUtleV06IHNlbGVjdENvbHVtbiB9O1xuICAgICAgdGFyZ2V0QXJyYXkucHVzaChmb3VuZEl0ZW0pO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0ga2V5UGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCBvYmogPSBmb3VuZEl0ZW07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0ge307XG4gICAgICBvYmogPSBvYmpba2V5XTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgbGFzdEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQ6IGFueSA9IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IDogZXZlbnQ7XG4gICAgb2JqW2xhc3RLZXldID0gaW5wdXRFbGVtZW50Py50eXBlID09PSAnY2hlY2tib3gnID8gaW5wdXRFbGVtZW50LmNoZWNrZWQgOiBpbnB1dEVsZW1lbnQudmFsdWUgPyBpbnB1dEVsZW1lbnQudmFsdWUgOiBpbnB1dEVsZW1lbnQ7XG4gICAgaWYgKGlzVHJhbnNsYXRlKSB7XG4gICAgICAvLyBSZWZyZXNoIHRoZSBib29rXG4gICAgICB0aGlzLmJvb2suc2V0KHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKSk7XG4gICAgICAvL1NLUzI4SlVMMjUgV29yayB3aXRoIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzaWduYWwgdmFsdWVcbiAgICAgIGNvbnN0IGN1cnJlbnRCb29rID0gdGhpcy5ib29rKCk7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbk1hcCA9IGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwIHx8IHt9O1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5nZXRGb3JtQnVpbGRlckxhbmd1YWdlKCk7XG4gICAgICAvLyBJbml0aWFsaXplIG5lc3RlZCBzdHJ1Y3R1cmUgc2FmZWx5XG4gICAgICBpZiAoIXRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddID0ge307XG4gICAgICBpZiAoIXRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtvYmouaWRdKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb2JqLmlkXSA9IHt9O1xuICAgICAgLy8gU2V0IHRoZSB0cmFuc2xhdGVkIGlucHV0XG4gICAgICB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb2JqLmlkXVtsYXN0S2V5XSA9IGlucHV0RWxlbWVudDtcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgdGhlIGJvb2sgb2JqZWN0IGFuZCByZS1zZXQgdGhlIHNpZ25hbFxuICAgICAgY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgPSB0cmFuc2xhdGlvbk1hcDtcbiAgICAgIHRoaXMuYm9vay5zZXQoY3VycmVudEJvb2spO1xuICAgICAgLy8gT3B0aW9uYWxseSBpbmZvcm0gdGhlIHNlcnZpY2VcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH0gICAgXG4gICAgaWYgKGtleVBhdGggPT09ICdzdW1tYXJ5Q29sdW1uJykge1xuICAgICAgaWYgKG9ialsnc3VtbWFyeVJvdyddID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnc3VtbWFyeVJvdyddID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnY2FsY3VsYXRpb24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnVGV4dCc7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChrZXlQYXRoID09PSAnc3VtbWFyeVJvdycpIHtcbiAgICAgIGlmIChvYmpbJ3N1bW1hcnlDb2x1bW4nXSA9PT0gdHJ1ZSkge1xuICAgICAgICBvYmpbJ3N1bW1hcnlDb2x1bW4nXSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0RWxlbWVudC5jaGVja2VkID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ2NhbGN1bGF0aW9uJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ1RleHQnO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgIC4uLmVsLFxuICAgICAgW3RhcmdldEFycmF5UGF0aF06IHRhcmdldEFycmF5XG4gICAgfSkpO1xuICAgIFxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIGdldERhdGFCeVBhdGgocGF0aDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG5cbiAgZmxpcEhvcml6b250YWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgZmxpcEg6ICF0LmZsaXBIIH0pKTtcbiAgfVxuXG4gIGZsaXBWZXJ0aWNhbCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoeyAuLi50LCBmbGlwVjogIXQuZmxpcFYgfSkpO1xuICB9XG5cbiAgcmVzZXRJbWFnZSgpIHtcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLnNldCgwKTtcbiAgICB0aGlzLmNyb3BwZXIuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy50cmFuc2Zvcm0uc2V0KHtcbiAgICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgICBzY2FsZTogMSxcbiAgICAgIHJvdGF0ZTogMCxcbiAgICAgIGZsaXBIOiBmYWxzZSxcbiAgICAgIGZsaXBWOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfSk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHNjYWxlOiB0LnNjYWxlISAtIDAuMSB9KSk7XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgc2NhbGU6IHQuc2NhbGUhICsgMC4xIH0pKTtcbiAgfVxuXG4gIHJvdGF0ZUxlZnQoKSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24udXBkYXRlKGMgPT4gYyAtIDEpO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJvdGF0ZVJpZ2h0KCkge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLnVwZGF0ZShjID0+IGMgKyAxKTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlTGVmdCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoeyAuLi50LCB0cmFuc2xhdGVIOiB0LnRyYW5zbGF0ZUghIC0gMSB9KSk7XG4gIH1cblxuICBtb3ZlUmlnaHQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgdHJhbnNsYXRlSDogdC50cmFuc2xhdGVIISArIDEgfSkpO1xuICB9XG5cbiAgbW92ZURvd24oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgdHJhbnNsYXRlVjogdC50cmFuc2xhdGVWISArIDEgfSkpO1xuICB9XG5cbiAgbW92ZVVwKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHRyYW5zbGF0ZVY6IHQudHJhbnNsYXRlViEgLSAxIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7XG4gICAgICAuLi50LFxuICAgICAgZmxpcEg6IHQuZmxpcFYsXG4gICAgICBmbGlwVjogdC5mbGlwSCxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgaW1hZ2VDcm9wcGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5jb252ZXJ0QmxvYlRvQmFzZTY0KGV2ZW50Lm9iamVjdFVybCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHsgLi4uZWwsIGltYWdlRGF0YTogYmFzZTY0IH0pKTtcbiAgICAgIGF3YWl0IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gY29uc29sZS5lcnJvcihcIkVycm9yIGluIGltYWdlQ3JvcHBlZDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNyb3BwZXJSZWFkeShzb3VyY2VJbWFnZURpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIGNvbnZlcnRCbG9iVG9CYXNlNjQob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBmZXRjaChvYmplY3RVcmwpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpXG4gICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBjaGlsZEV2ZW50Q2FwdHVyZShldmVudDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAuLi5lbCxcbiAgICAgIHFiUmVmZXJlbmNlOiBldmVudC52YWx1ZU9iaj8ubmFtZSxcbiAgICAgIHFiUmVmZXJlbmNlUXVlc3Rpb25zOiBldmVudC52YWx1ZU9iaj8uanNvbkJvZHlcbiAgICB9KSk7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG5cbiAgbGlua1RvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNMaW5rRHJvcGRvd25PcGVuLnVwZGF0ZShvcGVuID0+ICFvcGVuKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJvcGRvd24gJiYgIXRoaXMuZHJvcGRvd24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzTGlua0Ryb3Bkb3duT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRyYWdnZWRJZCA9IGlkO1xuICAgIGV2ZW50LmRhdGFUcmFuc2ZlciEuZWZmZWN0QWxsb3dlZCA9IFwibW92ZVwiO1xuICB9XG5cbiAgLy8gQVAtMjhNQVIyNSBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgdG8gYWxsb3cgZHJvcFxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLy8gQVAtMjhNQVIyNSBTd2FwIHRoZSBkcmFnZ2VkIGl0ZW0gd2l0aCB0aGUgZHJvcHBlZCBwb3NpdGlvblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldElkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIi5vcHRpb24taXRlbXNcIik/LmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIik7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZElkICYmIHRhcmdldElkICYmIHRoaXMuZHJhZ2dlZElkICE9PSB0YXJnZXRJZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IFsuLi5lbFtrZXldXTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gdGhpcy5kcmFnZ2VkSWQpO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHRhcmdldElkKTtcbiAgICAgICAgaWYgKGRyYWdnZWRJbmRleCAhPT0gLTEgJiYgdGFyZ2V0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgW29wdGlvbnNbZHJhZ2dlZEluZGV4XSwgb3B0aW9uc1t0YXJnZXRJbmRleF1dID0gW29wdGlvbnNbdGFyZ2V0SW5kZXhdLCBvcHRpb25zW2RyYWdnZWRJbmRleF1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLmVsLCBba2V5XTogb3B0aW9ucyB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dlZElkID0gbnVsbDtcbiAgfVxuXG4gIGR1cGxpY2F0ZUZpZWxkKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICBjb25zdCBjb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50KSk7XG4gICAgLy9BUC0xOEFQUjI1IEdlbmVyYXRlIGEgbmV3IElEIHVzaW5nIHRoZSBzZXJ2aWNlJ3MgbWV0aG9kXG4gICAgY29weS5pZCA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgICAvL2NvcHkudXVpZCA9IGNvcHkuaWQ7IFxuICAgIC8vIEFQLTE4QVBSMjUgU2V0IHRoZSBxdWVzdGlvbk51bWJlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgbnVtYmVyXG4gICAgY29weS5xdWVzdGlvbk51bWJlciA9IGVsZW1lbnRzLmxlbmd0aCArIDE7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkRWxlbWVudChjb3B5KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhZ2dlZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdXBkYXRlQm9va1N1YnRleHQoa2V5OiAnZW5kcG9pbnQnIHwgJ3ZhcmlhYmxlJyB8ICdkZWZhdWx0RmllbGQnLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5ib29rU3VidGV4dC51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgW2tleV06IHZhbHVlLFxuICAgIH0pKTtcbiAgfSAgXG4gIHRyYWNrQnlQcm9wKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGl0ZW0/LmtleSA/PyBpbmRleDtcbiAgfVxuICBcbiAgZ2V0T3B0aW1pemVkU3ViUHJvcFZhbHVlKHN1YlByb3A6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVCeUFycmF5UGF0aChcbiAgICAgICAgc3ViUHJvcC50YXJnZXRBcnJheSwgXG4gICAgICAgIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIFxuICAgICAgICB0aGlzLnNlbGVjdENvbHVtbigpLCBcbiAgICAgICAgc3ViUHJvcC5rZXksIFxuICAgICAgICBzdWJQcm9wLmlzVGFibGVDb2x1bW5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCBlbGVtZW50KTtcbiAgfVxufSIsIjwhLS0gQVAgMjJKQU4yNSAtIEZpZWxkIGFuZCBFbGVtZW50IFByb3BlcnRpZXMgLS0+XG5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIoKSA9PT0gJ2F0dHJpYnV0ZXMnfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2F0dHJpYnV0ZXMnKVwiPnt7ICdBVFRSSUJVVEVTJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBdHRyaWJ1dGVzJyB9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYigpID09PSAncHJvcGVydHknfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ3Byb3BlcnR5JylcIj57eyAnUFJPUEVSVFknIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Byb3BlcnR5JyB9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYigpID09PSAnYXBwZWFyYW5jZSd9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYignYXBwZWFyYW5jZScpXCI+e3sgJ0FQUEVBUkFOQ0UnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FwcGVhcmFuY2UnIH19PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiAqbmdJZj1cImFjdGl2ZVRhYigpID09PSAnYXR0cmlidXRlcydcIj5cbiAgICBAZGVmZXIgKHdoZW4gZ2V0UHJvcGVydGllcygpKSB7XG4gICAgICA8ZGl2PlxuICAgICAgICBAZGVmZXIgKHdoZW4gc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdJbWFnZScpIHtcbiAgICAgICAgICA8aW1hZ2UtY3JvcHBlclxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKS5pbWFnZURhdGFcIlxuICAgICAgICAgICAgW2ltYWdlQmFzZTY0XT1cInNlbGVjdGVkRWxlbWVudCgpLm9yZ0ltYWdlRGF0YVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2FsaWduSW1hZ2VdPVwiYWxpZ25JbWFnZVwiXG4gICAgICAgICAgICBbcm91bmRDcm9wcGVyXT1cInJvdW5kQ3JvcHBlclwiXG4gICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cIid3aGl0ZSdcIlxuICAgICAgICAgICAgaW1hZ2VBbHRUZXh0PVwiQWx0ZXJuYXRpdmUgaW1hZ2UgdGV4dFwiXG4gICAgICAgICAgICBbYWxsb3dNb3ZlSW1hZ2VdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVSZXNpemVTcXVhcmVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjYW52YXNSb3RhdGlvbl09XCJjYW52YXNSb3RhdGlvbigpXCJcbiAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCJhc3BlY3RSYXRpb1wiXG4gICAgICAgICAgICBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljV2lkdGhdPVwiY3JvcHBlclN0YXRpY1dpZHRoXCJcbiAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljSGVpZ2h0XT1cImNyb3BwZXJTdGF0aWNIZWlnaHRcIlxuICAgICAgICAgICAgW2Nyb3BwZXJNaW5XaWR0aF09XCJjcm9wcGVyTWluV2lkdGhcIlxuICAgICAgICAgICAgW2Nyb3BwZXJNaW5IZWlnaHRdPVwiY3JvcHBlck1pbkhlaWdodFwiXG4gICAgICAgICAgICBbY3JvcHBlck1heFdpZHRoXT1cImNyb3BwZXJNYXhXaWR0aFwiXG4gICAgICAgICAgICBbY3JvcHBlck1heEhlaWdodF09XCJjcm9wcGVyTWF4SGVpZ2h0XCJcbiAgICAgICAgICAgIFtyZXNldENyb3BPbkFzcGVjdFJhdGlvQ2hhbmdlXT1cInRydWVcIlxuICAgICAgICAgICAgWyhjcm9wcGVyKV09XCJjcm9wcGVyXCJcbiAgICAgICAgICAgIFsodHJhbnNmb3JtKV09XCJ0cmFuc2Zvcm1cIlxuICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBvdXRwdXQ9XCJibG9iXCJcbiAgICAgICAgICAgIGZvcm1hdD1cInBuZ1wiXG4gICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjcm9wcGVyUmVhZHkpPVwiY3JvcHBlclJlYWR5KCRldmVudClcIlxuICAgICAgICAgID48L2ltYWdlLWNyb3BwZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudCgpLmltYWdlRGF0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiIHRpdGxlPVwie3sgJ1JPVEFURV9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSb3RhdGUgTGVmdCcgfX1cIj7in7I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlUmlnaHQoKVwiIHRpdGxlPVwie3sgJ1JPVEFURV9SSUdIVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUm90YXRlIFJpZ2h0JyB9fVwiPuKfszwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tT3V0KClcIiB0aXRsZT1cInt7ICdaT09NX09VVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWm9vbSBPdXQnIH19XCI+LTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tSW4oKVwiIHRpdGxlPVwie3sgJ1pPT01fSU4nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1pvb20gSW4nIH19XCI+KzwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlTGVmdCgpXCIgdGl0bGU9XCJ7eyAnTU9WRV9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIExlZnQnIH19XCI+4oaQPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVSaWdodCgpXCIgdGl0bGU9XCJ7eyAnTU9WRV9SSUdIVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTW92ZSBSaWdodCcgfX1cIj7ihpI8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVVwKClcIiB0aXRsZT1cInt7ICdNT1ZFX1VQJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIFVwJyB9fVwiPuKGkTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlRG93bigpXCIgdGl0bGU9XCJ7eyAnTU9WRV9ET1dOJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIERvd24nIH19XCI+4oaTPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBIb3Jpem9udGFsKClcIiBbbmdDbGFzc109XCJ7J2VuYWJsZWQnOiB0cmFuc2Zvcm0oKS5mbGlwSH1cIiB0aXRsZT1cInt7ICdGTElQX0hPUklaT05UQUxMWScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRmxpcCBIb3Jpem9udGFsbHknIH19XCI+4oaUPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBWZXJ0aWNhbCgpXCIgW25nQ2xhc3NdPVwieydlbmFibGVkJzogdHJhbnNmb3JtKCkuZmxpcFZ9XCIgdGl0bGU9XCJ7eyAnRkxJUF9WRVJUSUNBTExZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGbGlwIFZlcnRpY2FsbHknIH19XCI+4oaVPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJlc2V0SW1hZ2UoKVwiIHRpdGxlPVwie3sgJ1JFU0VUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSZXNldCcgfX1cIj7DlzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ0Jvb2snXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7ICdTRUFSQ0hfQk9PSycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoIEJvb2snIH19PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxuICAgICAgICAgICAgPG54dC1zZWFyY2gtYm94XG4gICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJzZWxlY3RlZEVsZW1lbnQoKVwiXG4gICAgICAgICAgICAgIFthcGlNZXRhXT1cImJvb2tTdWJ0ZXh0KClcIlxuICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJUZXh0XT1cIidTRUFSQ0gnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlYXJjaC4uLidcIlxuICAgICAgICAgICAgICAoc2VhcmNoVmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICA+PC9ueHQtc2VhcmNoLWJveD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWljb25cIj5cbiAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwibGlua1RvZ2dsZURyb3Bkb3duKCRldmVudClcIiBmaWxsPVwiIzAwMDAwMFwiIHZlcnNpb249XCIxLjFcIiBpZD1cIkNhcGFfMVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA0NTAgNDUwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMTguMTUsMjMwLjE5NWw3Ny45MzQtNzcuOTM3YzMxLjg5NC0zMS44OTIsMzEuODk0LTgzLjc4Mi0wLjAwNC0xMTUuNjc0bC0xMi42Ni0xMi42NlxuICAgICAgICAgIGMtMzEuODkzLTMxLjg5Ni04My43OC0zMS44OTYtMTE1LjY3NC0wLjAwNGwtNzcuOTM3LDc3LjkzNGMtMTcuNTg4LDE3LjU4OC0yNS40NTcsNDEuMjY0LTIzLjY0Niw2NC4zMTFcbiAgICAgICAgICBjLTIzLjA0NS0xLjgxMy00Ni43MjIsNi4wNTYtNjQuMzA4LDIzLjY0N0wyMy45MiwyNjcuNzQ4Yy0zMS44OTQsMzEuODg5LTMxLjg5NCw4My43NzksMCwxMTUuNjc0bDEyLjY2NCwxMi42NjJcbiAgICAgICAgICBjMzEuODkzLDMxLjg5Myw4My43ODMsMzEuODkzLDExNS42NzQsMGw3Ny45MzUtNzcuOTM2YzE3LjU5Mi0xNy41OSwyNS40NTktNDEuMjY2LDIzLjY0Ny02NC4zMDlcbiAgICAgICAgICBDMjc2Ljg4NCwyNTUuNjU0LDMwMC41NiwyNDcuNzgzLDMxOC4xNSwyMzAuMTk1eiBNMjAyLjY1MywyOTAuNjA1bC03Ny45MzYsNzcuOTM4Yy0xNi43MDUsMTYuNzAzLTQzLjg4OSwxNi43MDMtNjAuNTksMFxuICAgICAgICAgIGwtMTIuNjY2LTEyLjY2NmMtMTYuNzA1LTE2LjcwMS0xNi43MDMtNDMuODg1LDAtNjAuNTk0bDc3LjkzNi03Ny45MzJjMTQuMTQtMTQuMTQxLDM1Ljc3OS0xNi4zMDYsNTIuMjI2LTYuNTE2bC0zMi4zMDIsMzIuMzA3XG4gICAgICAgICAgYy03LjYwNiw3LjYwNC03LjYwNiwxOS45MzgsMCwyNy41NDFjNy42MDUsNy42MDcsMTkuOTM3LDcuNjA3LDI3LjU0MSwwbDMyLjMwNi0zMi4zMDNcbiAgICAgICAgICBDMjE4Ljk1OSwyNTQuODI4LDIxNi43OTUsMjc2LjQ2OSwyMDIuNjUzLDI5MC42MDV6IE0yMzguMzgyLDIwOS4xNjlsMzIuMjk5LTMyLjMwNmM3LjYwOC03LjYwMiw3LjYwOC0xOS45MzUsMC0yNy41MzhcbiAgICAgICAgICBjLTcuNjA0LTcuNjEtMTkuOTM2LTcuNjEtMjcuNTQxLTAuMDA0bC0zMi4zMDMsMzIuMzAzYy05Ljc5MS0xNi40NDYtNy42MjctMzguMDg3LDYuNTE0LTUyLjIyNmw3Ny45MzUtNzcuOTM1XG4gICAgICAgICAgYzE2LjcwNy0xNi43MDcsNDMuODktMTYuNzA3LDYwLjU5NCwwbDEyLjY2NCwxMi42NjRjMTYuNzA1LDE2LjcwNSwxNi43MDUsNDMuODg2LDAsNjAuNTkxbC03Ny45MzYsNzcuOTM3XG4gICAgICAgICAgQzI3Ni40NjgsMjE2Ljc5NywyNTQuODI4LDIxOC45NTksMjM4LjM4MiwyMDkuMTY5elwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzQzLjQ2NiwyNjEuNDY1Yy00NS4yODcsMC04MiwzNi43MTMtODIsODJzMzYuNzEzLDgyLDgyLDgyYzQ1LjI4NiwwLDgyLTM2LjcxMyw4Mi04MlMzODguNzUzLDI2MS40NjUsMzQzLjQ2NiwyNjEuNDY1elxuICAgICAgICAgICBNMzcyLjUwNSwzMzMuNTY0bC01Ni4wNDYsNTYuMTA0Yy0wLjIzOSwwLjIzOC0wLjUzNiwwLjQxLTAuODYyLDAuNDk2bC0yMi4zMTUsNS44NWMtMC42NDksMC4xNjgtMS4zNDctMC4wMi0xLjgyMi0wLjQ5NFxuICAgICAgICAgIGMtMC40NzctMC40NzktMC42NjYtMS4xNzItMC40OTYtMS44MjRsNS44MjYtMjIuMzE4YzAuMDg0LTAuMzI2LDAuMjU2LTAuNjI3LDAuNDk0LTAuODYzbDU2LjA0Ny01Ni4xMDRcbiAgICAgICAgICBjMC43NDItMC43NDIsMS45NDUtMC43NDQsMi42ODgtMC4wMDJsNC41NDgsNC41NDFjMC43MzksMC43NCwwLjc0MSwxLjk0MywwLDIuNjg4bC0zNy40MzMsMzcuNDcxbDQuNzA5LDQuNzAzbDM3LjQzNS0zNy40NzFcbiAgICAgICAgICBjMC43MzktMC43NDIsMS45NC0wLjc0MiwyLjY4Mi0wLjAwMmw0LjU1LDQuNTQxQzM3My4yNSwzMzEuNjE3LDM3My4yNSwzMzIuODIyLDM3Mi41MDUsMzMzLjU2NHogTTM5NS40NzIsMzEwLjU3NGwtMTcsMTcuMDE4XG4gICAgICAgICAgYy0wLjczOSwwLjc0NC0xLjk0MiwwLjc0NC0yLjY4NSwwLjAwMmwtMTYuNDg5LTE2LjQ3NWMtMC43NDQtMC43NC0wLjc0NC0xLjk0My0wLjAwMi0yLjY4OGwxNy0xNy4wMlxuICAgICAgICAgIGMwLjc0MS0wLjc0LDEuOTQ0LTAuNzQsMi42ODgtMC4wMDJsMTYuNDg3LDE2LjQ3N0MzOTYuMjE2LDMwOC42MjksMzk2LjIxNiwzMDkuODMyLDM5NS40NzIsMzEwLjU3NHpcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzTGlua0Ryb3Bkb3duT3BlbigpXCIgI2Ryb3Bkb3duPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRU5EX1BPSU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbmRwb2ludCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJib29rU3VidGV4dCgpLmVuZHBvaW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQm9va1N1YnRleHQoJ2VuZHBvaW50JywgJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdWQVJJQUJMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnVmFyaWFibGUnIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYm9va1N1YnRleHQoKS52YXJpYWJsZVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUJvb2tTdWJ0ZXh0KCd2YXJpYWJsZScsICRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRklFTEQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0ZpZWxkJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImZpZWxkQXNTdHJpbmcoKVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnREVGQVVMVF9GSUVMRCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVmYXVsdCBGaWVsZCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJib29rU3VidGV4dCgpLmRlZmF1bHRGaWVsZFwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUJvb2tTdWJ0ZXh0KCdkZWZhdWx0RmllbGQnLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpPy5lbGVtZW50UHJvcHM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInByb3AudHlwZSAhPT0gJ2NoZWNrYm94JyAmJiBwcm9wLnR5cGUgIT09ICdzdWJRdWVzdGlvbidcIiBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnaGVscFRleHQnICYmIHNlbGVjdGVkRWxlbWVudCgpPy5oZWxwVGV4dFwiPnt7IHNlbGVjdGVkRWxlbWVudCgpPy5oZWxwVGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGVhZGVyU2VsZWN0KCkgPyBib29rKCkucmVjb3Jkc1swXS50aXRsZSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gKGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhlYWRlclNlbGVjdCgpID8gdXBkYXRlVGl0bGUoJGV2ZW50KSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMHB4O1wiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N1YlF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgIDxkaXY+e3sgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViUHJvcCBvZiBwcm9wLnN1YlF1ZXN0aW9uXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmMmZmOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBzdWJQcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHN1YlByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYXJyYXknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGZpbHRlcmVkQ29sdW1ucygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic3ViUHJvcC5vcGVyYW5kcyA/IHN1YlByb3Aub3BlcmFuZHMuaW5jbHVkZXMoY29sdW1uLmFwaU5hbWUpIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZShzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUsICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5hcGlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmaWx0ZXJlZENvbHVtbnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInN1YlByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5KSA9PT0gY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25SYWRpb0NoYW5nZShzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2x1bW4uYXBpTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5KSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChzdWJQcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgc3ViUHJvcC5rZXksICRldmVudCxmYWxzZSwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50KSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHN1YlByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnc2VsZWN0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChzdWJQcm9wLnRhcmdldEFycmF5IHx8IHN1YlByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgc3ViUHJvcC5rZXksIHN1YlByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBzdWJQcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5LCAkZXZlbnQsIHN1YlByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN1YlByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnYWxpZ24nXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiAoY2xpY2spPVwib25BbGlnblNlbGVjdChvcHRpb24udmFsdWUpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBzZWxlY3RlZEVsZW1lbnQoKT8udGV4dEFsaWduID09PSBvcHRpb24udmFsdWV9XCIgW3RpdGxlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N0eWxlJ1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgKGNsaWNrKT1cIm9uU3R5bGVTZWxlY3Qob3B0aW9uLnZhbHVlKVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNTdHlsZUFjdGl2ZShvcHRpb24udmFsdWUpfVwiIFt0aXRsZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiJy4uL2Fzc2V0cy9pY29ucy8nICsgb3B0aW9uLmljb24gKyAnLnN2ZydcIiBbYWx0XT1cIm9wdGlvbi52YWx1ZVwiIGNsYXNzPVwiaWNvbi1zaXplXCIgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIihzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ3RpdGxlJ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTVweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogMjBweDsgYm9yZGVyLXJhZGl1czogMTJweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTmV3QnV0dG9uKClcIiBjbGFzcz1cImFkZC1idXR0b25cIj4rIHt7ICdBRERfQlVUVE9OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgQnV0dG9uJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnRuIG9mIGJvb2soKT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gfHwgW107IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJ1dHRvbi1jb25maWctY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0JVVFRPTl9OQU1FJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCdXR0b24gTmFtZScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYnRuLm5hbWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICduYW1lJywgJGV2ZW50LHRydWUpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBidXR0b24gbmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0VWRU5UX05BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0V2ZW50IE5hbWUnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImJ0bi5ldmVudHRvZW1pdFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ2V2ZW50dG9lbWl0JywgJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXZlbnQgdG8gZW1pdFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0FMVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWx0JyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJidG4uYWx0XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnYWx0JywgJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiQnV0dG9uIGFsdCB0ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRU5EX1BPSU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbmRwb2ludCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYnRuLmVuZHBvaW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnZW5kcG9pbnQnLCAkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJBUEkgZW5kcG9pbnRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdNRVRIT0QnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01ldGhvZCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCJidG4ubWV0aG9kXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnbWV0aG9kJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQT1NUXCI+UE9TVDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFVUXCI+UFVUPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJERUxFVEVcIj5ERUxFVEU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0JBQ0tHUk9VTkRfQ09MT1InIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0JhY2tncm91bmQgQ29sb3InIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbbmdNb2RlbF09XCJidG4uYmdDb2xvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ2JnQ29sb3InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQk9SREVSX1JBRElVUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQm9yZGVyIFJhZGl1cycgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCI1MFwiIFtuZ01vZGVsXT1cImJ0bi5ib3JkZXJSYWRpdXNcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICdib3JkZXJSYWRpdXMnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBidG4uYm9yZGVyUmFkaXVzIH19cHg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQlVUVE9OX1dJRFRIX1BYJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCdXR0b24gV2lkdGggKHB4KScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbbmdNb2RlbF09XCJidG4ud2lkdGhcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICd3aWR0aCcsICRldmVudClcIiBtaW49XCI1MFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgd2lkdGggaW4gcHhcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdURVhUX0NPTE9SJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdUZXh0IENvbG9yJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgW25nTW9kZWxdPVwiYnRuLnRleHRDb2xvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ3RleHRDb2xvcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdQT1NJVElPTl9QRVJDRU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdQb3NpdGlvbiAoJSknIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgW25nTW9kZWxdPVwiYnRuLnBvc2l0aW9uUGVyY2VudFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ3Bvc2l0aW9uUGVyY2VudCcsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ0bi5wb3NpdGlvblBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZUJ1dHRvbihidG4pXCIgY2xhc3M9XCJyZW1vdmUtYnV0dG9uXCI+w5cge3sgJ1JFTU9WRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVtb3ZlJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnR5J1wiPlxuICAgIEBkZWZlciAod2hlbiBnZXRQcm9wZXJ0aWVzKCkpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbD5MYWJlbCBJZDwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDExcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAgICB7eyBoZWFkZXJTZWxlY3QoKSA/IGJvb2tJZCgpIDogc2VsZWN0ZWRFbGVtZW50KCk/LmlkIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wIG9mIGdldFByb3BlcnRpZXMoKT8uZmllbGRQcm9wczsgdHJhY2tCeTogdHJhY2tCeVByb3BcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsICAqbmdJZj1cInByb3AudHlwZSAhPT0gJ3N1YlF1ZXN0aW9uJ1wiIGNsYXNzPVwidGV4dC1zbVwiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAndG9nZ2xlR3JvdXAnXCIgY2xhc3M9XCJ0b2dnbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc09wdGlvbmFsJywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc09wdGlvbmFsJylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc09wdGlvbmFsJywgJGV2ZW50LCB0cnVlLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKCdpc09wdGlvbmFsJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ1JFUVVJUkVEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSZXF1aXJlZCcgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc1JlYWRPbmx5JywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc1JlYWRPbmx5JylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc1JlYWRPbmx5JywgJGV2ZW50LCB0cnVlLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKCdpc1JlYWRPbmx5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ1JFQURfT05MWScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVhZCBPbmx5JyB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgJ2lzSGlkZGVuJywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc0hpZGRlbicpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCAnaXNIaWRkZW4nLCAkZXZlbnQsIHRydWUsIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UoJ2lzSGlkZGVuJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ0lTX0hJREUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0lzIEhpZGUnIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIgcHJvcC50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3AudHlwZSA9PT0gJ3JhZGlvJyB8fCBwcm9wLmtleSA9PT0gJ29wdGlvbnMnXCIgY2xhc3M9XCJvcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWxpc3RcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgcHJvcC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpID8gZ2V0VmFsdWVCeUFycmF5UGF0aCgnZmllbGRzTWV0YScsICd1bmlxdWVJZGVudGlmaWVyJywgc2VsZWN0Q29sdW1uKCksICBwcm9wLmtleSwgdHJ1ZSkgOiBzZWxlY3RlZEVsZW1lbnQoKVtwcm9wLmtleV0gOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJvcHRpb24taXRlbXNcIiBbYXR0ci5kYXRhLWlkXT1cIm9wdGlvbi5pZFwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgb3B0aW9uLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwib3B0aW9uLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib3B0aW9uLnZhbHVlID0gJGV2ZW50OyBvcHRpb25UcmFuc2xhdGlvblVwZGF0ZShvcHRpb24sJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uXCIgY2xhc3M9XCJvcHRpb25zXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVPcHRpb24oc2VsZWN0ZWRFbGVtZW50KClbcHJvcC5rZXldLCBvcHRpb24uaWQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyYWctaGFuZGxlXCI+4piwPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkT3B0aW9uKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpID8gZ2V0VmFsdWVCeUFycmF5UGF0aCgnZmllbGRzTWV0YScsICd1bmlxdWVJZGVudGlmaWVyJywgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCB0cnVlKSA6IHNlbGVjdGVkRWxlbWVudCgpW3Byb3Aua2V5XSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXZhcmllbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZ1wiPis8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQUREJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGVhZGVyU2VsZWN0KCkgPyBib29rKCkucmVjb3Jkc1swXS50aXRsZSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoZWFkZXJTZWxlY3QoKSA/IHVwZGF0ZVRpdGxlKCRldmVudCkgOiAoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgICBbY2xhc3MucmVhZC1vbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJzZWxlY3RlZEVsZW1lbnQoKT8ucmVhZE9ubHlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdWJRdWVzdGlvbidcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0eWxlLXRvZ2dsZS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlU3ViUXVlc3Rpb24ocHJvcClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPlN1YiBUZXh0PC9kaXY+XG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImlzRXhwYW5kZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJUb2dnbGUgQXJyb3dcIiBjbGFzcz1cImFycm93LWljb25cIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0V4cGFuZGVkXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViUHJvcCBvZiBwcm9wLnN1YlF1ZXN0aW9uOyB0cmFja0J5OiB0cmFja0J5UHJvcFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U3ZjJmZjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgc3ViUHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBzdWJQcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzdWJQcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE9wdGltaXplZFN1YlByb3BWYWx1ZShzdWJQcm9wKVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHN1YlByb3AudGFyZ2V0QXJyYXksIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBzdWJQcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgPCEtLSBBUC0wMkFQUjI1IFJlbmRlciBpbnB1dCBmaWVsZCBvbmx5IGlmIHN1YlByb3AudHlwZSBpcyAnYXJyYXknIC0tPlxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYXJyYXknXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUsIHByb3AuaXNUcmFuc2xhdGUpXCIgLz5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIj57eyBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0eWxlLXRvZ2dsZS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlU3R5bGVTZWN0aW9uKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPnt7ICdTVFlMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU3R5bGUnIH19PC9kaXY+XG4gICAgICAgICAgPGltZyBbc3JjXT1cImlzU3R5bGVFeHBhbmRlZCgpID8gJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1kb3duLnN2ZycgOiAnLi4vYXNzZXRzL2ljb25zL2Fycm93LXJpZ2h0LnN2ZydcIiBhbHQ9XCJUb2dnbGUgQXJyb3dcIiBjbGFzcz1cImFycm93LWljb25cIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc1N0eWxlRXhwYW5kZWQoKVwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRTdHlsZUtleXMoKVwiPlxuICAgICAgICAgICAgICA8bGFiZWw+e3sga2V5IH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiBzZWxlY3RDb2x1bW4oKSA/IGdldFZhbHVlQnlBcnJheVBhdGgoJ2ZpZWxkc01ldGEnLCAndW5pcXVlSWRlbnRpZmllcicsIHNlbGVjdENvbHVtbigpLCdzdHlsZS4nICsga2V5LCB0cnVlKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogJ3N0eWxlLicgKyBrZXkpXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpICkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKCdmaWVsZHNNZXRhJywgJ3VuaXF1ZUlkZW50aWZpZXInLCBzZWxlY3RDb2x1bW4oKSwgJ3N0eWxlLicgKyBrZXksICRldmVudC50YXJnZXQudmFsdWUsIHRydWUpIDogc2V0VmFsdWVCeVBhdGgoJ3N0eWxlLicgKyBrZXksICRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHt7IGtleSB9fVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiICpuZ0lmPVwiYWN0aXZlVGFiKCkgPT09ICdhcHBlYXJhbmNlJ1wiPlxuICAgIEBkZWZlciAod2hlbiBnZXRQcm9wZXJ0aWVzKCkpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpPy5hcHBlYXJhbmNlOyB0cmFja0J5OiB0cmFja0J5UHJvcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RleHQnXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY29sb3InXCIgY2xhc3M9XCJjb2xvci1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRWxlbWVudCgpPy5mb250Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2ZvbnRDb2xvcicsICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIiBjbGFzcz1cImhleC1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnSEVYX0NPREUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0hFWCBDb2RlJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdidXR0b24tdG9nZ2xlJ1wiIGNsYXNzPVwiYnV0dG9uLXRvZ2dsZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1idXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVGaWVsZChzZWxlY3RlZEVsZW1lbnQoKSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdBRERfRFVQTElDQVRFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgRHVwbGljYXRlJyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cIiF0ZW1wbGF0ZVNlbGVjdGVkXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idG5cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPnt7ICdDQU5DRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NhbmNlbCcgfX08L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idG5cIiAoY2xpY2spPVwiaGFuZGxlQnV0dG9uQ2xpY2soKVwiPnt7ICdTQVZFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTYXZlJyB9fTwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiICpuZ0lmPVwidGVtcGxhdGVTZWxlY3RlZFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idG5cIiAoY2xpY2spPVwiaGFuZGxlVGVtcGxhdGVTYXZlKClcIj57eyAnU0FWRV9URU1QTEFURScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2F2ZSBUZW1wbGF0ZScgfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=