@entake/particle 18.0.0 → 18.0.1
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.
|
@@ -602,7 +602,7 @@ export class DropdownComponent {
|
|
|
602
602
|
useExisting: forwardRef(() => DropdownComponent),
|
|
603
603
|
multi: true
|
|
604
604
|
}
|
|
605
|
-
], queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "dropdownButton", first: true, predicate: ["dropdownButton"], descendants: true }, { propertyName: "dropdownList", first: true, predicate: ["dropdownList"], descendants: true }, { propertyName: "dropdownOptions", predicate: ["dropdownOption"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"!isMobile else mobile\">\r\n<div #dropdown\r\n class=\"row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n style=\"cursor:default;overflow:hidden;\"\r\n [ngClass]=\"classList ? classList : ''\">\r\n <button #dropdownButton\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n type=\"button\"\r\n (click)=\"openDropdown($event)\"\r\n (focus)=\"setSelectionIndex()\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [attr.aria-expanded]=\"opened\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btnset clear center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 v_center ptl_input_text_size ptl_input_padding border_none width100 overflow_hide\">\r\n <ng-container *ngIf=\"selectedDataContext$ | async as dataContext else placeholderTemplate\">\r\n <ng-container *ngIf=\"!!template else noCustomTemplate\">\r\n <div class=\"row v_center text_ellipsis min_w0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(dataContext)\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <div class=\"ent_r2l_txt\">{{dataContext['$implicit'] || dataContext.label}}</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ptl_placeholder ent_r2l_txt\">{{text.placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"buttonClassList ? buttonClassList : 'ptl_brdr_color'\">\r\n <div class=\"center_center height100 width100\">\r\n <i class=\"fas fa-caret-down ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n<div [style.display]=\"render ? '' : 'none'\"\r\n [attr.aria-hidden]=\"!render\"\r\n class=\"particle_dropdown_overlay\">\r\n <div #dropdownList\r\n [@openClose]=\"opened ? 'open' : 'close'\"\r\n (@openClose.start)=\"onAnimationStart($event)\"\r\n (@openClose.done)=\"onAnimationDone($event)\"\r\n class=\"position_absolute\">\r\n <div class=\"particle_dropdown_options content_color ent_r2l_dir\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <div class=\"particle_dropdown_list\" role=\"listbox\" tabindex=\"-1\" [attr.aria-label]=\"text.placeholder\">\r\n <!-- CUSTOM TEMPLATE -->\r\n <ng-container *ngIf=\"!!template else defaultOptionTemplate\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(groupOption.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(option.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <!-- NO CUSTOM TEMPLATE -->\r\n <ng-template #defaultOptionTemplate>\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-label]=\"groupOption.label\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"particle_dropdown_option ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{groupOption.label}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n class=\"particle_dropdown_option ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{option.label}}\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-content select=\"template\"></ng-content>\r\n</ng-container>\r\n\r\n<ng-template #mobile>\r\n <select\r\n class=\"access ptl_input ptl_input_height ptl_input_text_size ptl_input_padding ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onModelChangeMobile($event)\"\r\n [(ngModel)]=\"value\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <ng-container *ngFor=\"let option of options\">\r\n <ng-container *ngIf=\"option.type === 'group'\">\r\n <optgroup class=\"input_bg_color min_h50 pad_10\" [label]=\"option.groupLabel\">\r\n <ng-container *ngFor=\"let groupOption of option.options\">\r\n <option\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"groupOption.value\"\r\n >\r\n {{groupOption.label}}\r\n </option>\r\n </ng-container>\r\n </optgroup>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <option\r\n [disabled]=\"option.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"option.value\"\r\n >\r\n {{option.label}}\r\n </option>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n</ng-template>\r\n", styles: [":host{width:100%}.particle_dropdown{width:100%;min-width:150px;position:relative}.particle_dropdown:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_dropdown_input{position:absolute;display:flex;align-items:center;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.particle_dropdown_input:not([disabled]){cursor:pointer}.particle_dropdown_input::-ms-expand{display:none}.particle_dropdown_caret{position:absolute;top:.5em;right:1em;z-index:var(--z-frame);background:transparent;pointer-events:none}.particle_dropdown_placeholder{opacity:.5;display:inline}.particle_dropdown_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_dropdown_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);max-height:250px;width:100%;overflow-y:auto;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.particle_dropdown_heading{font-size:14pt;font-weight:600;opacity:.8;padding:10px 12px 4px}.particle_dropdown_list{padding:0;margin:0;outline:none}.particle_dropdown_option{font-size:14pt;padding:7px 12px;cursor:pointer;border:none;width:100%;text-align:left;display:flex;align-items:center;transition:.2s background-color ease;background-color:transparent;color:inherit}.particle_dropdown_option.unselected:focus{background-color:#8080801a}.particle_dropdown_option:not(.unselected){background-color:#80808026}.particle_dropdown_option:not(.unselected):focus{background-color:#8080803d}.particle_dropdown_option[disabled]{cursor:default}\n/*!* option hover/focus state *!*/\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], animations: [
|
|
605
|
+
], queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "dropdownButton", first: true, predicate: ["dropdownButton"], descendants: true }, { propertyName: "dropdownList", first: true, predicate: ["dropdownList"], descendants: true }, { propertyName: "dropdownOptions", predicate: ["dropdownOption"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"!isMobile else mobile\">\r\n<div #dropdown\r\n class=\"row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n style=\"cursor:default;overflow:hidden;\"\r\n [ngClass]=\"classList ? classList : ''\">\r\n <button #dropdownButton\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n type=\"button\"\r\n (click)=\"openDropdown($event)\"\r\n (focus)=\"setSelectionIndex()\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [attr.aria-expanded]=\"opened\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btnset clear center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 v_center ptl_input_text_size ptl_input_padding border_none width100 overflow_hide\">\r\n <ng-container *ngIf=\"selectedDataContext$ | async as dataContext else placeholderTemplate\">\r\n <ng-container *ngIf=\"!!template else noCustomTemplate\">\r\n <div class=\"row v_center text_ellipsis min_w0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(dataContext)\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <div class=\"ent_r2l_txt\">{{dataContext['$implicit'] || dataContext.label}}</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ptl_placeholder ent_r2l_txt\">{{text.placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"buttonClassList ? buttonClassList : 'ptl_brdr_color'\">\r\n <div class=\"center_center height100 width100\">\r\n <i class=\"fas fa-caret-down ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n<div [style.display]=\"render ? '' : 'none'\"\r\n [attr.aria-hidden]=\"!render\"\r\n class=\"particle_dropdown_overlay\">\r\n <div #dropdownList\r\n [@openClose]=\"opened ? 'open' : 'close'\"\r\n (@openClose.start)=\"onAnimationStart($event)\"\r\n (@openClose.done)=\"onAnimationDone($event)\"\r\n class=\"position_absolute\">\r\n <div class=\"particle_dropdown_options content_color ent_r2l_dir\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <div class=\"particle_dropdown_list\" role=\"listbox\" tabindex=\"-1\" [attr.aria-label]=\"text.placeholder\">\r\n <!-- CUSTOM TEMPLATE -->\r\n <ng-container *ngIf=\"!!template else defaultOptionTemplate\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(groupOption.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(option.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <!-- NO CUSTOM TEMPLATE -->\r\n <ng-template #defaultOptionTemplate>\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-label]=\"groupOption.label\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{groupOption.label}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{option.label}}\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-content select=\"template\"></ng-content>\r\n</ng-container>\r\n\r\n<ng-template #mobile>\r\n <select\r\n class=\"access ptl_input ptl_input_height ptl_input_text_size ptl_input_padding ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onModelChangeMobile($event)\"\r\n [(ngModel)]=\"value\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <ng-container *ngFor=\"let option of options\">\r\n <ng-container *ngIf=\"option.type === 'group'\">\r\n <optgroup class=\"input_bg_color min_h50 pad_10\" [label]=\"option.groupLabel\">\r\n <ng-container *ngFor=\"let groupOption of option.options\">\r\n <option\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"groupOption.value\"\r\n >\r\n {{groupOption.label}}\r\n </option>\r\n </ng-container>\r\n </optgroup>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <option\r\n [disabled]=\"option.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"option.value\"\r\n >\r\n {{option.label}}\r\n </option>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n</ng-template>\r\n", styles: [":host{width:100%}.particle_dropdown{width:100%;min-width:150px;position:relative}.particle_dropdown:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_dropdown_input{position:absolute;display:flex;align-items:center;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.particle_dropdown_input:not([disabled]){cursor:pointer}.particle_dropdown_input::-ms-expand{display:none}.particle_dropdown_caret{position:absolute;top:.5em;right:1em;z-index:var(--z-frame);background:transparent;pointer-events:none}.particle_dropdown_placeholder{opacity:.5;display:inline}.particle_dropdown_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_dropdown_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);max-height:250px;width:100%;overflow-y:auto;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.particle_dropdown_heading{font-weight:600;opacity:.8;padding:10px 12px 4px}.particle_dropdown_list{padding:0;margin:0;outline:none}.particle_dropdown_option{padding:7px 12px;cursor:pointer;border:none;width:100%;text-align:left;display:flex;align-items:center;transition:.2s background-color ease;background-color:transparent;color:inherit}.particle_dropdown_option.unselected:focus{background-color:#8080801a}.particle_dropdown_option:not(.unselected){background-color:#80808026}.particle_dropdown_option:not(.unselected):focus{background-color:#8080803d}.particle_dropdown_option[disabled]{cursor:default}\n/*!* option hover/focus state *!*/\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], animations: [
|
|
606
606
|
trigger('openClose', [
|
|
607
607
|
transition('close => open', [
|
|
608
608
|
style({ transform: 'scaleY(0.5)', opacity: 0 }),
|
|
@@ -634,7 +634,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
|
|
|
634
634
|
useExisting: forwardRef(() => DropdownComponent),
|
|
635
635
|
multi: true
|
|
636
636
|
}
|
|
637
|
-
], template: "<ng-container *ngIf=\"!isMobile else mobile\">\r\n<div #dropdown\r\n class=\"row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n style=\"cursor:default;overflow:hidden;\"\r\n [ngClass]=\"classList ? classList : ''\">\r\n <button #dropdownButton\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n type=\"button\"\r\n (click)=\"openDropdown($event)\"\r\n (focus)=\"setSelectionIndex()\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [attr.aria-expanded]=\"opened\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btnset clear center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 v_center ptl_input_text_size ptl_input_padding border_none width100 overflow_hide\">\r\n <ng-container *ngIf=\"selectedDataContext$ | async as dataContext else placeholderTemplate\">\r\n <ng-container *ngIf=\"!!template else noCustomTemplate\">\r\n <div class=\"row v_center text_ellipsis min_w0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(dataContext)\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <div class=\"ent_r2l_txt\">{{dataContext['$implicit'] || dataContext.label}}</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ptl_placeholder ent_r2l_txt\">{{text.placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"buttonClassList ? buttonClassList : 'ptl_brdr_color'\">\r\n <div class=\"center_center height100 width100\">\r\n <i class=\"fas fa-caret-down ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n<div [style.display]=\"render ? '' : 'none'\"\r\n [attr.aria-hidden]=\"!render\"\r\n class=\"particle_dropdown_overlay\">\r\n <div #dropdownList\r\n [@openClose]=\"opened ? 'open' : 'close'\"\r\n (@openClose.start)=\"onAnimationStart($event)\"\r\n (@openClose.done)=\"onAnimationDone($event)\"\r\n class=\"position_absolute\">\r\n <div class=\"particle_dropdown_options content_color ent_r2l_dir\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <div class=\"particle_dropdown_list\" role=\"listbox\" tabindex=\"-1\" [attr.aria-label]=\"text.placeholder\">\r\n <!-- CUSTOM TEMPLATE -->\r\n <ng-container *ngIf=\"!!template else defaultOptionTemplate\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(groupOption.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(option.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <!-- NO CUSTOM TEMPLATE -->\r\n <ng-template #defaultOptionTemplate>\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-label]=\"groupOption.label\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"particle_dropdown_option ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{groupOption.label}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n class=\"particle_dropdown_option ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{option.label}}\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-content select=\"template\"></ng-content>\r\n</ng-container>\r\n\r\n<ng-template #mobile>\r\n <select\r\n class=\"access ptl_input ptl_input_height ptl_input_text_size ptl_input_padding ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onModelChangeMobile($event)\"\r\n [(ngModel)]=\"value\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <ng-container *ngFor=\"let option of options\">\r\n <ng-container *ngIf=\"option.type === 'group'\">\r\n <optgroup class=\"input_bg_color min_h50 pad_10\" [label]=\"option.groupLabel\">\r\n <ng-container *ngFor=\"let groupOption of option.options\">\r\n <option\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"groupOption.value\"\r\n >\r\n {{groupOption.label}}\r\n </option>\r\n </ng-container>\r\n </optgroup>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <option\r\n [disabled]=\"option.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"option.value\"\r\n >\r\n {{option.label}}\r\n </option>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n</ng-template>\r\n", styles: [":host{width:100%}.particle_dropdown{width:100%;min-width:150px;position:relative}.particle_dropdown:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_dropdown_input{position:absolute;display:flex;align-items:center;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.particle_dropdown_input:not([disabled]){cursor:pointer}.particle_dropdown_input::-ms-expand{display:none}.particle_dropdown_caret{position:absolute;top:.5em;right:1em;z-index:var(--z-frame);background:transparent;pointer-events:none}.particle_dropdown_placeholder{opacity:.5;display:inline}.particle_dropdown_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_dropdown_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);max-height:250px;width:100%;overflow-y:auto;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.particle_dropdown_heading{font-size:14pt;font-weight:600;opacity:.8;padding:10px 12px 4px}.particle_dropdown_list{padding:0;margin:0;outline:none}.particle_dropdown_option{font-size:14pt;padding:7px 12px;cursor:pointer;border:none;width:100%;text-align:left;display:flex;align-items:center;transition:.2s background-color ease;background-color:transparent;color:inherit}.particle_dropdown_option.unselected:focus{background-color:#8080801a}.particle_dropdown_option:not(.unselected){background-color:#80808026}.particle_dropdown_option:not(.unselected):focus{background-color:#8080803d}.particle_dropdown_option[disabled]{cursor:default}\n/*!* option hover/focus state *!*/\n"] }]
|
|
637
|
+
], template: "<ng-container *ngIf=\"!isMobile else mobile\">\r\n<div #dropdown\r\n class=\"row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n style=\"cursor:default;overflow:hidden;\"\r\n [ngClass]=\"classList ? classList : ''\">\r\n <button #dropdownButton\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n type=\"button\"\r\n (click)=\"openDropdown($event)\"\r\n (focus)=\"setSelectionIndex()\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [attr.aria-expanded]=\"opened\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btnset clear center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 v_center ptl_input_text_size ptl_input_padding border_none width100 overflow_hide\">\r\n <ng-container *ngIf=\"selectedDataContext$ | async as dataContext else placeholderTemplate\">\r\n <ng-container *ngIf=\"!!template else noCustomTemplate\">\r\n <div class=\"row v_center text_ellipsis min_w0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(dataContext)\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <div class=\"ent_r2l_txt\">{{dataContext['$implicit'] || dataContext.label}}</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ptl_placeholder ent_r2l_txt\">{{text.placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"buttonClassList ? buttonClassList : 'ptl_brdr_color'\">\r\n <div class=\"center_center height100 width100\">\r\n <i class=\"fas fa-caret-down ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n<div [style.display]=\"render ? '' : 'none'\"\r\n [attr.aria-hidden]=\"!render\"\r\n class=\"particle_dropdown_overlay\">\r\n <div #dropdownList\r\n [@openClose]=\"opened ? 'open' : 'close'\"\r\n (@openClose.start)=\"onAnimationStart($event)\"\r\n (@openClose.done)=\"onAnimationDone($event)\"\r\n class=\"position_absolute\">\r\n <div class=\"particle_dropdown_options content_color ent_r2l_dir\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <div class=\"particle_dropdown_list\" role=\"listbox\" tabindex=\"-1\" [attr.aria-label]=\"text.placeholder\">\r\n <!-- CUSTOM TEMPLATE -->\r\n <ng-container *ngIf=\"!!template else defaultOptionTemplate\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(groupOption.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n type=\"button\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\" role=\"option\" tabindex=\"0\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(option.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <!-- NO CUSTOM TEMPLATE -->\r\n <ng-template #defaultOptionTemplate>\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_dropdown_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i + j)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + groupOption.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== groupOption.value }\"\r\n [attr.aria-label]=\"groupOption.label\"\r\n [attr.aria-selected]=\"(_internalValue | async) === groupOption.value\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{groupOption.label}}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #dropdownOption\r\n (click)=\"onDropdownOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onDropdownOptionMouseEnter(dropdownOption, i)\"\r\n (mousemove)=\"onDropdownOptionMouseMove(dropdownOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"dropdownId + '-' + option.value\"\r\n [ngClass]=\"{ 'unselected' : (_internalValue | async) !== option.value }\"\r\n [attr.aria-selected]=\"(_internalValue | async) === option.value\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled\"\r\n class=\"particle_dropdown_option ptl_input_text_size ent_r2l_txt\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n {{option.label}}\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-content select=\"template\"></ng-content>\r\n</ng-container>\r\n\r\n<ng-template #mobile>\r\n <select\r\n class=\"access ptl_input ptl_input_height ptl_input_text_size ptl_input_padding ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius\"\r\n [id]=\"dropdownId\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onModelChangeMobile($event)\"\r\n [(ngModel)]=\"value\">\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <ng-container *ngFor=\"let option of options\">\r\n <ng-container *ngIf=\"option.type === 'group'\">\r\n <optgroup class=\"input_bg_color min_h50 pad_10\" [label]=\"option.groupLabel\">\r\n <ng-container *ngFor=\"let groupOption of option.options\">\r\n <option\r\n [disabled]=\"groupOption.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"groupOption.value\"\r\n >\r\n {{groupOption.label}}\r\n </option>\r\n </ng-container>\r\n </optgroup>\r\n </ng-container>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <option\r\n [disabled]=\"option.disabled\"\r\n class=\"input_bg_color min_h50 pad_10\"\r\n [value]=\"option.value\"\r\n >\r\n {{option.label}}\r\n </option>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </select>\r\n</ng-template>\r\n", styles: [":host{width:100%}.particle_dropdown{width:100%;min-width:150px;position:relative}.particle_dropdown:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_dropdown_input{position:absolute;display:flex;align-items:center;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.particle_dropdown_input:not([disabled]){cursor:pointer}.particle_dropdown_input::-ms-expand{display:none}.particle_dropdown_caret{position:absolute;top:.5em;right:1em;z-index:var(--z-frame);background:transparent;pointer-events:none}.particle_dropdown_placeholder{opacity:.5;display:inline}.particle_dropdown_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_dropdown_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);max-height:250px;width:100%;overflow-y:auto;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.particle_dropdown_heading{font-weight:600;opacity:.8;padding:10px 12px 4px}.particle_dropdown_list{padding:0;margin:0;outline:none}.particle_dropdown_option{padding:7px 12px;cursor:pointer;border:none;width:100%;text-align:left;display:flex;align-items:center;transition:.2s background-color ease;background-color:transparent;color:inherit}.particle_dropdown_option.unselected:focus{background-color:#8080801a}.particle_dropdown_option:not(.unselected){background-color:#80808026}.particle_dropdown_option:not(.unselected):focus{background-color:#8080803d}.particle_dropdown_option[disabled]{cursor:default}\n/*!* option hover/focus state *!*/\n"] }]
|
|
638
638
|
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { value: [{
|
|
639
639
|
type: Input
|
|
640
640
|
}], options: [{
|
|
@@ -679,4 +679,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
|
|
|
679
679
|
type: HostListener,
|
|
680
680
|
args: ['window:click', ['$event']]
|
|
681
681
|
}] } });
|
|
682
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFrQixLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFBRSxVQUFVLEVBQ3hCLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxHQUFHLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFVbkQ7O0dBRUc7QUEyQkgsTUFBTSxPQUFPLGlCQUFpQjtJQWlDUjtJQUE2QjtJQS9CakQ7OztPQUdHO0lBQ0gsSUFDSSxLQUFLLENBQUMsS0FBc0I7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLE9BQU8sQ0FBQyxPQUE0QjtRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFvQixRQUFtQixFQUFVLGlCQUFvQztRQUFqRSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNuRixNQUFNLFVBQVUsR0FBRyxnRUFBZ0UsQ0FBQztRQUNwRixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBVSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFFakQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFVLFVBQVUsR0FBRyxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXpGOztPQUVHO0lBRUgsUUFBUSxHQUErQixJQUFXLENBQUM7SUFFbkQ7O09BRUc7SUFFSCxjQUFjLEdBQWtDLElBQVcsQ0FBQztJQUU1RDs7T0FFRztJQUVILFlBQVksR0FBK0IsSUFBVyxDQUFDO0lBRXZEOztPQUVHO0lBRUgsZUFBZSxHQUE2QyxJQUFXLENBQUM7SUFFeEU7O09BRUc7SUFFSCxRQUFRLEdBQTZCLElBQVcsQ0FBQztJQUVqRDs7T0FFRztJQUVILFFBQVEsR0FBWSxLQUFLLENBQUM7SUFHMUIsSUFBSSxHQUFpQjtRQUNsQixXQUFXLEVBQUUsa0JBQWtCO0tBQ2pDLENBQUE7SUFFRDs7T0FFRztJQUVILFNBQVMsR0FBVyxJQUFXLENBQUM7SUFHaEMsZUFBZSxHQUFXLElBQVcsQ0FBQztJQUV0Qzs7T0FFRztJQUVELDREQUE0RDtJQUM5RCxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFFN0M7O09BRUc7SUFDTSxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQXNCLElBQVcsQ0FBQyxDQUFDO0lBRTFFOzs7T0FHRztJQUNLLFdBQVcsR0FBMEIsSUFBVyxDQUFDO0lBRXpEOzs7T0FHRztJQUNLLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztJQUV2Qzs7O09BR0c7SUFDSyxRQUFRLEdBQUcsSUFBVyxDQUFDO0lBRy9COztPQUVHO0lBQ00sY0FBYyxHQUFHLElBQUksZUFBZSxDQUFrQixJQUFXLENBQUMsQ0FBQztJQUU1RTs7T0FFRztJQUNjLGVBQWUsR0FBZ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hILEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNaLElBQUksY0FBYyxHQUFvRCxJQUFXLENBQUM7UUFFbEYsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFFcEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ3hCLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN6QyxjQUFjLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDbEcsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksYUFBYSxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNuQyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDeEYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVGOztPQUVHO0lBQ00sb0JBQW9CLEdBQTJDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUM5RixjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFO1FBQzlCLElBQUksV0FBVyxHQUErQixJQUFXLENBQUM7UUFFMUQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFNUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1osV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBNEI7UUFDdkQsTUFBTSxVQUFVLEdBQTBCLEVBQUUsQ0FBQztRQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzFCLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQy9CLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEQsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUF3QixDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDTSxVQUFVLENBQUM7SUFFcEI7O09BRUc7SUFDSCxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWY7O09BRUc7SUFDSCxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWY7O09BRUc7SUFDSCxjQUFjLEdBQVcsSUFBVyxDQUFDO0lBRXJDOztPQUVHO0lBQ0gsUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO0lBRXBDOzs7T0FHRztJQUNLLE1BQU0sR0FBb0IsSUFBVyxDQUFDO0lBRTlDOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQTRCO1FBQzdELE1BQU0sZ0JBQWdCLEdBQXdCLEVBQUUsQ0FBQztRQUVqRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxZQUFZLEdBQTBCLEVBQUUsQ0FBQztnQkFDL0MsS0FBSyxNQUFNLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDakQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDOUUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ2hFLGVBQWUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUM3RyxlQUFlLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQzt3QkFFL0IsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDckMsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDMUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDakcsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDdEQsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzlGLFVBQVUsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO29CQUUzQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBYSxFQUFFLFdBQXVDO1FBQ3pGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksYUFBdUIsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFM0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNqQixXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLEdBQXlCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUUxQzs7T0FFRztJQUNILFNBQVMsR0FBYyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFaEM7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLEtBQXNCO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUUsVUFBbUI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUVILGNBQWMsQ0FBQyxLQUFVO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO1FBRS9DLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBRUgsU0FBUyxDQUFDLEtBQW9CO1FBQzVCLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBRXRCLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBRUgsT0FBTyxDQUFDLEtBQW9CO1FBQzFCLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RSxNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBSyxDQUFDO1lBRXBCLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLHlCQUF5QixJQUFJLEdBQUcsQ0FBQztnQkFDdEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFFM0UsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ3ZELE9BQU8sTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQTtnQkFDNUcsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUVILE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztZQUU3QixJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0YsTUFBTSxjQUFjLEdBQUcsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDO2dCQUN2RCxNQUFNLGNBQWMsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUM7Z0JBQ3ZELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLENBQUM7Z0JBRXhELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsS0FBWTtRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUVqQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsMEJBQTBCLENBQUMsTUFBeUIsRUFBRSxLQUFhO1FBQ2pFLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHlCQUF5QixDQUFDLE1BQXlCLEVBQUUsS0FBYTtRQUNoRSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQixDQUFDLEtBQXNCLEVBQUUsUUFBaUI7UUFDOUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxLQUFpQjtRQUM1QixLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEtBQXFCO1FBQ3BDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUV6QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO3lCQUNoRCxhQUFhO3lCQUNiLEtBQUssRUFBRSxDQUFDO2dCQUNiLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLEtBQXFCO1FBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBVyxDQUFDO1FBRWxDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDekUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVELE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDekQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hGLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBVyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDBCQUEwQixDQUFDLEtBQXNCO1FBQ3ZELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFFbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQVU7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CO1FBQzFCLE1BQU0sRUFBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDaEYsTUFBTSxFQUFDLFlBQVksRUFBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1FBQ3ZELE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDO1FBQzFDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsQ0FBQztRQUM3RSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztRQUM5QixNQUFNLGdCQUFnQixHQUFHLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUMvRSxJQUFJLGVBQXVCLEVBQUUsV0FBbUIsQ0FBQztRQUVqRCxJQUFJLG9CQUFvQixHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDNUMsZUFBZSxHQUFHLFVBQVUsQ0FBQztZQUM3QixXQUFXLEdBQUcsR0FBRywwQkFBMEIsR0FBRyxpQkFBaUIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDO1FBQzNGLENBQUM7YUFBTSxJQUFJLGlCQUFpQixHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDaEQsZUFBZSxHQUFHLGFBQWEsQ0FBQztZQUNoQyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsZ0JBQWdCLElBQUksQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN0QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7Z0JBQ3pELFdBQVcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsRCxDQUFDO1lBRUQsZUFBZSxHQUFHLFVBQVUsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN4QixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDNUUsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztRQUUzQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQUMsR0FBVztRQUM5QixJQUFJLEdBQUcsS0FBSyxXQUFXLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRWhELElBQUksY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM1QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFXLENBQUMsQ0FBQztnQkFDdkYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxHQUFHLEtBQUssWUFBWSxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFeEMsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNoQixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3JCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQVcsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxhQUFhO1FBQ25CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1lBRTdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSTtZQUNqQyxDQUFDLENBQUMsSUFBVztZQUNiLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxjQUFjLEdBQXNCLElBQVcsQ0FBQztRQUVwRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVwRCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFFN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLGNBQWMsR0FBRyxNQUFNLENBQUM7b0JBQ3hCLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQzt1R0F4ckJVLGlCQUFpQjsyRkFBakIsaUJBQWlCLDRZQVJqQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixnRUFzRmEsV0FBVywrYUM3STNCLCtuVkFtTUEsc21HRGhLYztZQUNWLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLFVBQVUsQ0FBQyxlQUFlLEVBQUU7b0JBQzFCLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUMvQyxPQUFPLENBQUMsWUFBWSxFQUNsQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNqRCxDQUFDO2dCQUNGLFVBQVUsQ0FBQyxlQUFlLEVBQUU7b0JBQzFCLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUM3QyxPQUFPLENBQUMsWUFBWSxFQUNsQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuRCxDQUFDO2FBQ0gsQ0FBQztTQUNIOzsyRkFTVSxpQkFBaUI7a0JBMUI3QixTQUFTOytCQUNFLG1CQUFtQixjQUdqQjt3QkFDVixPQUFPLENBQUMsV0FBVyxFQUFFOzRCQUNuQixVQUFVLENBQUMsZUFBZSxFQUFFO2dDQUMxQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQ0FDL0MsT0FBTyxDQUFDLFlBQVksRUFDbEIsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDakQsQ0FBQzs0QkFDRixVQUFVLENBQUMsZUFBZSxFQUFFO2dDQUMxQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQ0FDN0MsT0FBTyxDQUFDLFlBQVksRUFDbEIsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDbkQsQ0FBQzt5QkFDSCxDQUFDO3FCQUNILGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUM7NEJBQ2hELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhHQVNHLEtBQUs7c0JBRFIsS0FBSztnQkFnQkYsT0FBTztzQkFEVixLQUFLO2dCQXdDTixRQUFRO3NCQURQLFNBQVM7dUJBQUMsVUFBVTtnQkFPckIsY0FBYztzQkFEYixTQUFTO3VCQUFDLGdCQUFnQjtnQkFPM0IsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWM7Z0JBT3pCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTzlCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxXQUFXO2dCQU96QixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO2dCQVNOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7O1FBT0osNERBQTREO1FBQzlELE1BQU07c0JBRkwsTUFBTTtnQkFtUFAsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFlekMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdCMUMsT0FBTztzQkFETixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFpQ3hDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge21hcCwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtEcm9wZG93bk9wdGlvbn0gZnJvbSAnLi9tb2RlbHMvZHJvcGRvd24tb3B0aW9uLm1vZGVsJztcclxuaW1wb3J0IHtEcm9wZG93bk9wdGlvbkdyb3VwfSBmcm9tICcuL21vZGVscy9kcm9wZG93bi1vcHRpb24tZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQge0Ryb3Bkb3duVGV4dH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIGRyb3Bkb3duIGNvbXBvbmVudCBvcHRpb24gaW5wdXRcclxuICovXHJcbmRlY2xhcmUgdHlwZSBEcm9wZG93bk9wdGlvbklucHV0ID0gQXJyYXk8RHJvcGRvd25PcHRpb24gfCBEcm9wZG93bk9wdGlvbkdyb3VwPjtcclxuXHJcbi8qKlxyXG4gKiBEcm9wZG93biBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGFydGljbGUtZHJvcGRvd24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LmNzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ29wZW5DbG9zZScsIFtcclxuICAgICAgdHJhbnNpdGlvbignY2xvc2UgPT4gb3BlbicsIFtcclxuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlWSgwLjUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlJyxcclxuICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJywgb3BhY2l0eTogMSB9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ29wZW4gPT4gY2xvc2UnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLCBvcGFjaXR5OiAxIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoJzIwMG1zIGVhc2UnLFxyXG4gICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMC41KScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgXSlcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHJvcGRvd25Db21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBkcm9wZG93blxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2ludGVybmFsVmFsdWUubmV4dCh2YWx1ZSk7XHJcblxyXG4gICAgdGhpcy5zZXRTZWxlY3Rpb25JbmRleCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZHJvcGRvd24gb3B0aW9ucy9vcHRpb24gZ3JvdXBzXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgb3B0aW9ucyhvcHRpb25zOiBEcm9wZG93bk9wdGlvbklucHV0KSB7XHJcbiAgICB0aGlzLl9vcHRpb25zLm5leHQoRHJvcGRvd25Db21wb25lbnQuc2FuaXRpemVPcHRpb25JbnB1dChvcHRpb25zKSk7XHJcbiAgICB0aGlzLl9hbGxPcHRpb25zID0gRHJvcGRvd25Db21wb25lbnQuZ2V0QWxsT3B0aW9ucyh0aGlzLl9vcHRpb25zLnZhbHVlKTtcclxuICAgIHRoaXMuc2V0U2VsZWN0aW9uSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlcGVuZGVuY3kgaW5qZWN0aW9uIHNpdGVcclxuICAgKiBAcGFyYW0gcmVuZGVyZXIgdGhlIEFuZ3VsYXIgcmVuZGVyZXJcclxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgcmVmZXJlbmNlIHRvIHRoZSBBbmd1bGFyIGNoYW5nZSBkZXRlY3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xyXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xyXG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVycy5sZW5ndGgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRyb3Bkb3duSWQgPSBgZHJvcGRvd24tJHtyZXN1bHR9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGFtb3VudCBvZiBvZmZzZXQgKGluIHBpeGVscykgdG8gcGxhY2UgYmV0d2VlbiB0aGUgZHJvcGRvd25cclxuICAgKiBhbmQgaXRzIGxpc3Qgb3ZlcmxheVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJPUERPV05fTElTVF9PRkZTRVQgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBMaXN0IG9mIGFycm93IGtleSBrZXljb2Rlc1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJST1dfS0VZUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkcm9wZG93blxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJylcclxuICBkcm9wZG93bjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkcm9wZG93biBidXR0b25cclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdkcm9wZG93bkJ1dHRvbicpXHJcbiAgZHJvcGRvd25CdXR0b246IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFZpZXdDaGlsZCBvZiB0aGUgZHJvcGRvd24gbGlzdFxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duTGlzdCcpXHJcbiAgZHJvcGRvd25MaXN0OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBRdWVyeUxpc3Qgb2YgZHJvcGRvd24gb3B0aW9uIFZpZXdDaGlsZHJlblxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2Ryb3Bkb3duT3B0aW9uJylcclxuICBkcm9wZG93bk9wdGlvbnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29udGVudENoaWxkIG9mIHRoZSBkcm9wZG93biBvcHRpb24gdGVtcGxhdGVcclxuICAgKi9cclxuICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxyXG4gIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gc2hvdWxkIGJlIGRpc2FibGVkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHRleHQ6IERyb3Bkb3duVGV4dCA9IHtcclxuICAgICBwbGFjZWhvbGRlcjogJ01ha2UgYSBzZWxlY3Rpb24nXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGFzcyBsaXN0IHRvIGFzc2lnbiB0byB0aGUgZHJvcGRvd25cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGNsYXNzTGlzdDogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYnV0dG9uQ2xhc3NMaXN0OiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCBvbiB2YWx1ZSBjaGFuZ2UsIGVtaXRzIHRoZSBuZXcgdmFsdWVcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxyXG4gIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyPigpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGlucHV0IGRyb3Bkb3duIG9wdGlvbnMvb3B0aW9uIGdyb3Vwc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9vcHRpb25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEcm9wZG93bk9wdGlvbklucHV0PihudWxsIGFzIGFueSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bGwgbGlzdCBvZiBhbGwgYWN0aXZlIG9wdGlvbnMsIHdoZXRoZXIgdGhleSBhcmUgaW4gYSBncm91cCBvciBub3RcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FsbE9wdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBUeXBlYWhlYWQgc3RyaW5nIHdoaWxlIHVzZXJzIGFyZSB0eXBpbmcgaW50byB0aGUgaW5wdXQgZmllbGRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Z1bGxQcmVkaWN0aXZlVGV4dFN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBUaW1lb3V0IHRvIGNsZWFyIHRoZSBfZnVsbFByZWRpY3RpdmVUZXh0U3RyaW5nIGFmdGVyIGEgdXNlciBzdG9wcyB0eXBpbmcgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdGltZW91dCA9IG51bGwgYXMgYW55O1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkcm9wZG93blxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9pbnRlcm5hbFZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCBzdHJpbmc+KG51bGwgYXMgYW55KTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBtYXAgb2Ygb3B0aW9uIHZhbHVlIChzdHJpbmdpZmllZCBpZiBhIG51bWJlcikgdG8gZGF0YSBjb250ZXh0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhQ29udGV4dE1hcCQ6IE9ic2VydmFibGU8eyBbdmFsdWU6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9IH0+ID0gdGhpcy5fb3B0aW9ucy5waXBlKFxyXG4gICAgbWFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICBsZXQgZGF0YUNvbnRleHRNYXA6IHsgW3ZhbHVlOiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB9ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gICAgICBpZiAoISFvcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICBkYXRhQ29udGV4dE1hcCA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoJ29wdGlvbnMnIGluIG9wdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3B0aW9uIG9mIG9wdGlvbi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUNvbnRleHRNYXBbU3RyaW5nKGdyb3VwT3B0aW9uLnZhbHVlKV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwT3B0aW9uLmRhdGFDb250ZXh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoJ2RhdGFDb250ZXh0JyBpbiBvcHRpb24pIHtcclxuICAgICAgICAgICAgZGF0YUNvbnRleHRNYXBbU3RyaW5nKG9wdGlvbi52YWx1ZSldID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb24uZGF0YUNvbnRleHQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRhQ29udGV4dE1hcDtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRhdGEgY29udGV4dCBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGFzIGFuIE9ic2VydmFibGVcclxuICAgKi9cclxuICByZWFkb25seSBzZWxlY3RlZERhdGFDb250ZXh0JDogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4gPSB0aGlzLl9pbnRlcm5hbFZhbHVlLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmRhdGFDb250ZXh0TWFwJCksXHJcbiAgICBtYXAoKFt2YWx1ZSwgZGF0YUNvbnRleHRNYXBdKSA9PiB7XHJcbiAgICAgIGxldCBkYXRhQ29udGV4dDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBkYXRhQ29udGV4dE1hcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZGF0YUNvbnRleHRNYXBbU3RyaW5nKHZhbHVlKV07XHJcblxyXG4gICAgICAgIGlmICghIWVudHJ5KSB7XHJcbiAgICAgICAgICBkYXRhQ29udGV4dCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRhQ29udGV4dDtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0QWxsT3B0aW9ucyhvcHRpb25zOiBEcm9wZG93bk9wdGlvbklucHV0KTogQXJyYXk8RHJvcGRvd25PcHRpb24+IHtcclxuICAgIGNvbnN0IGFsbE9wdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICBpZiAob3B0aW9uLnR5cGUgPT09ICdncm91cCcpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3B0aW9uIG9mIG9wdGlvbi5vcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoIWdyb3VwT3B0aW9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGFsbE9wdGlvbnMucHVzaChncm91cE9wdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi50eXBlID09PSAnb3B0aW9uJyAmJiAhb3B0aW9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgYWxsT3B0aW9ucy5wdXNoKG9wdGlvbiBhcyBEcm9wZG93bk9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWxsT3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBJRCB0byBhc3NpZ24gdG8gdGhlIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZHJvcGRvd25JZDtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gc2hvdWxkIGJlIHJlbmRlcmVkXHJcbiAgICovXHJcbiAgcmVuZGVyID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGRyb3Bkb3duIGlzIG9wZW5cclxuICAgKi9cclxuICBvcGVuZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGluZGV4IG9mIHRoZSBmb2N1c2VkIG9wdGlvbiBpbiB0aGUgZHJvcGRvd24gbGlzdFxyXG4gICAqL1xyXG4gIHNlbGVjdGlvbkluZGV4OiBudW1iZXIgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gbW9iaWxlIChzY3JlZW4gd2lkdGggaXMgbGVzcyB0aGFuIDc2OCksIHN3YXAgdG8gYSBuYXRpdmUgaW5wdXRcclxuICAgKi9cclxuICBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDc2ODtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRyb3Bkb3duXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgb3B0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGJvdGggYSBsYWJlbCBhbmQgYSB2YWx1ZSxcclxuICAgKiBhbHNvIHJlbW92ZXMgZW1wdHkgZ3JvdXBzIChvciBncm91cHMgdGhhdCBoYXZlIG5vIHZhbGlkIG9wdGlvbnMpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gc2FuaXRpemVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplT3B0aW9uSW5wdXQob3B0aW9uczogRHJvcGRvd25PcHRpb25JbnB1dCk6IERyb3Bkb3duT3B0aW9uSW5wdXQge1xyXG4gICAgY29uc3Qgc2FuaXRpemVkT3B0aW9uczogRHJvcGRvd25PcHRpb25JbnB1dCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgaWYgKCgnZ3JvdXBMYWJlbCcgaW4gb3B0aW9uKSAmJiAoJ29wdGlvbnMnIGluIG9wdGlvbikpIHtcclxuICAgICAgICBjb25zdCB2YWxpZE9wdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXBPcHRpb24gb2YgKG9wdGlvbi5vcHRpb25zID8/IFtdKSkge1xyXG4gICAgICAgICAgaWYgKCEhZ3JvdXBPcHRpb24ubGFiZWwgJiYgKCEhZ3JvdXBPcHRpb24udmFsdWUgfHwgKCtncm91cE9wdGlvbi52YWx1ZSA+PSAwKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBPcHRpb25Db3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShncm91cE9wdGlvbikpO1xyXG4gICAgICAgICAgICBncm91cE9wdGlvbkNvcHkuZGF0YUNvbnRleHQgPSB0aGlzLmFkZExhYmVsVG9EYXRhQ29udGV4dChncm91cE9wdGlvbkNvcHkubGFiZWwsIGdyb3VwT3B0aW9uQ29weS5kYXRhQ29udGV4dCk7XHJcbiAgICAgICAgICAgIGdyb3VwT3B0aW9uQ29weS50eXBlID0gJ2dyb3VwJztcclxuXHJcbiAgICAgICAgICAgIHZhbGlkT3B0aW9ucy5wdXNoKGdyb3VwT3B0aW9uQ29weSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISF2YWxpZE9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBzYW5pdGl6ZWRPcHRpb25zLnB1c2goeyBncm91cExhYmVsOiBvcHRpb24uZ3JvdXBMYWJlbCwgb3B0aW9uczogdmFsaWRPcHRpb25zLCB0eXBlOiAnZ3JvdXAnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgoJ2xhYmVsJyBpbiBvcHRpb24pICYmICgndmFsdWUnIGluIG9wdGlvbikpIHtcclxuICAgICAgICBpZiAoISFvcHRpb24ubGFiZWwgJiYgKCEhb3B0aW9uLnZhbHVlIHx8ICgrb3B0aW9uLnZhbHVlID49IDApKSkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9uKSk7XHJcbiAgICAgICAgICBvcHRpb25Db3B5LmRhdGFDb250ZXh0ID0gdGhpcy5hZGRMYWJlbFRvRGF0YUNvbnRleHQob3B0aW9uQ29weS5sYWJlbCwgb3B0aW9uQ29weS5kYXRhQ29udGV4dCk7XHJcbiAgICAgICAgICBvcHRpb25Db3B5LnR5cGUgPSAnb3B0aW9uJztcclxuXHJcbiAgICAgICAgICBzYW5pdGl6ZWRPcHRpb25zLnB1c2gob3B0aW9uQ29weSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNhbml0aXplZE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgb3B0aW9uIGxhYmVsIHRvIGRhdGEgY29udGV4dCBpZiBub3QgcHJlc2VudC4gSWYgJGltcGxpY2l0XHJcbiAgICogdmFsdWUgaXMgbm90IHByZXNlbnQsIGl0IHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgbGFiZWwgYXMgaXRzIHZhbHVlLlxyXG4gICAqIElmICRpbXBsaWNpdCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IHdpbGwgYWRkIGEgbGFiZWwga2V5IHRvIHRoZSBjb250ZXh0XHJcbiAgICogQHBhcmFtIGxhYmVsIHRoZSBvcHRpb24gbGFiZWxcclxuICAgKiBAcGFyYW0gZGF0YUNvbnRleHQgdGhlIG9wdGlvbiBkYXRhIGNvbnRleHRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGFkZExhYmVsVG9EYXRhQ29udGV4dChsYWJlbDogc3RyaW5nLCBkYXRhQ29udGV4dDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB7XHJcbiAgICBpZiAoIWRhdGFDb250ZXh0KSB7XHJcbiAgICAgIGRhdGFDb250ZXh0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhbGFiZWwpIHtcclxuICAgICAgY29uc3QgaW1wbGljaXRWYWx1ZSA9IGRhdGFDb250ZXh0WyckaW1wbGljaXQnXTtcclxuXHJcbiAgICAgIGlmICghIWltcGxpY2l0VmFsdWUgfHwgaW1wbGljaXRWYWx1ZSBhcyBudW1iZXIgPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsRXhpc3RzID0gISFkYXRhQ29udGV4dFsnbGFiZWwnXTtcclxuXHJcbiAgICAgICAgaWYgKCFsYWJlbEV4aXN0cykge1xyXG4gICAgICAgICAgZGF0YUNvbnRleHRbJ2xhYmVsJ10gPSBsYWJlbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YUNvbnRleHRbJyRpbXBsaWNpdCddID0gbGFiZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YUNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIGNoYW5nZVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIHRvdWNoXHJcbiAgICovXHJcbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXHJcbiAgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gY2hhbmdlXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gdG91Y2hcclxuICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZGlzYWJsZWQgc3RhdGVcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBkaXNhYmxlZCBvciBub3RcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXBvc2l0aW9uIGFuZCByZXNpemUgdGhlIGRyb3Bkb3duIG9uIHdpbmRvdyByZXNpemVcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvbldpbmRvd1Jlc2l6ZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzTW9iaWxlID0gZXZlbnQudGFyZ2V0LmlubmVyV2lkdGggPD0gNzY4O1xyXG5cclxuICAgIGlmICh0aGlzLm9wZW5lZCkge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd25MaXN0KCk7XHJcbiAgICAgIHRoaXMucmVzaXplRHJvcGRvd25MaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGFycm93IGtleSBrZXlkb3duIGV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBrZXlkb3duIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uaWQ/LmluY2x1ZGVzKHRoaXMuZHJvcGRvd25JZCkgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgY29uc3QgeyBrZXkgfSA9IGV2ZW50O1xyXG5cclxuICAgICAgaWYgKERyb3Bkb3duQ29tcG9uZW50LkFSUk9XX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIHRoZSBkcm9wZG93biBsaXN0IG9uIHRhYiBhbmQgaGFuZGxlIGFycm93IGtleSBuYXZpZ2F0aW9uXHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBrZXl1cCBLZXlib2FyZEV2ZW50XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcclxuICBvbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uaWQ/LmluY2x1ZGVzKHRoaXMuZHJvcGRvd25JZCkgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgY29uc3Qge2tleX0gPSBldmVudDtcclxuXHJcbiAgICAgIGlmIChEcm9wZG93bkNvbXBvbmVudC5BUlJPV19LRVlTLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICB0aGlzLm9uQXJyb3dLZXlVcChrZXkpO1xyXG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ1RhYicpIHtcclxuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9mdWxsUHJlZGljdGl2ZVRleHRTdHJpbmcgKz0ga2V5O1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9mdWxsUHJlZGljdGl2ZVRleHRTdHJpbmcgPSAnJywgNTAwKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gdGhpcy5fYWxsT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHtcclxuICAgICAgICAgIHJldHVybiBvcHRpb24ubGFiZWwgJiYgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0aGlzLl9mdWxsUHJlZGljdGl2ZVRleHRTdHJpbmcudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGZpbHRlcmVkT3B0aW9ucyAmJiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcm9wZG93bk9wdGlvblNlbGVjdChmaWx0ZXJlZE9wdGlvbnNbMF0udmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgdGhlIGRyb3Bkb3duIGxpc3QgKGlmIG9wZW5lZCkgb24gY2xpY2sgaWYgb3V0c2lkZSB0aGUgbGlzdFxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2xpY2sgTW91c2VFdmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgIGNvbnN0IHtwYWdlWCwgcGFnZVl9ID0gZXZlbnQ7XHJcblxyXG4gICAgICBpZiAocGFnZVggPiAwICYmIHBhZ2VZID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIH0gPSB0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHhQb3NpdGlvblZhbGlkID0gcGFnZVggPj0gbGVmdCAmJiBwYWdlWCA8PSByaWdodDtcclxuICAgICAgICBjb25zdCB5UG9zaXRpb25WYWxpZCA9IHBhZ2VZID49IHRvcCAmJiBwYWdlWSA8PSBib3R0b207XHJcbiAgICAgICAgY29uc3Qgc2hvdWxkQ2xvc2UgPSAhKHhQb3NpdGlvblZhbGlkICYmIHlQb3NpdGlvblZhbGlkKTtcclxuXHJcbiAgICAgICAgaWYgKHNob3VsZENsb3NlKSB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcclxuICAgICAgICAgIHRoaXMuZHJvcGRvd25CdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZHJvcGRvd24gb24gZXNjYXBlIGtleXVwIGFuZCBmb2N1cyBvbiBkcm9wZG93biBidXR0b25cclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleXVwIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBvbkVzY2FwZUtleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25CdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGZvY3VzIHRvIGRyb3Bkb3duIG9wdGlvbiBvbiBtb3VzZSBlbnRlciBhbmQgdXBkYXRlIHNlbGVjdGVkIGluZGV4XHJcbiAgICogQHBhcmFtIG9wdGlvbiB0aGUgZHJvcGRvd24gb3B0aW9uIHRvIGZvY3VzXHJcbiAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRvIGZvY3VzXHJcbiAgICovXHJcbiAgb25Ecm9wZG93bk9wdGlvbk1vdXNlRW50ZXIob3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25JbmRleCA9IGluZGV4O1xyXG4gICAgb3B0aW9uLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZm9jdXMgdG8gZHJvcGRvd24gb3B0aW9uIG9uIG1vdXNlIG1vdmUgYW5kIHVwZGF0ZSBzZWxlY3RlZCBpbmRleFxyXG4gICAqIEBwYXJhbSBvcHRpb24gdGhlIGRyb3Bkb3duIG9wdGlvbiB0byBmb2N1c1xyXG4gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG9wdGlvbiB0byBmb2N1c1xyXG4gICAqL1xyXG4gIG9uRHJvcGRvd25PcHRpb25Nb3VzZU1vdmUob3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5kZXggIT09IGluZGV4KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpbmRleDtcclxuICAgICAgb3B0aW9uLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZSB2YWx1ZSBhbmQgY2xvc2UgZHJvcGRvd24gb24gb3B0aW9uIHNlbGVjdFxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcclxuICAgKiBAcGFyYW0gZGlzYWJsZWQgd2hldGhlciBvciBub3QgdGhlIHNlbGVjdGVkIG9wdGlvbiBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIG9uRHJvcGRvd25PcHRpb25TZWxlY3QodmFsdWU6IHN0cmluZyB8IG51bWJlciwgZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5oYW5kbGVEcm9wZG93bk9wdGlvblNlbGVjdCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gdGhlIGRyb3Bkb3duIGxpc3QgYW5kIGFsaWduIGl0XHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjbGljayBNb3VzZUV2ZW50XHJcbiAgICovXHJcbiAgb3BlbkRyb3Bkb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgZHJvcGRvd24gbGlzdFxyXG4gICAqL1xyXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZW5lZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zaXRpb24gYW5kIHJlc2l6ZSBkcm9wZG93biBsaXN0IG9uIGFuaW1hdGlvbiBzdGFydCBpZiB0b1N0YXRlIGlzIG9wZW5cclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIEFuZ3VsYXIgQW5pbWF0aW9uRXZlbnRcclxuICAgKi9cclxuICBvbkFuaW1hdGlvblN0YXJ0KGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdvcGVuJykge1xyXG4gICAgICB0aGlzLnJlc2l6ZURyb3Bkb3duTGlzdCgpO1xyXG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkluZGV4KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25JbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kcm9wZG93bk9wdGlvbnMudG9BcnJheSgpW3RoaXMuc2VsZWN0aW9uSW5kZXhdXHJcbiAgICAgICAgICAgIC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKlxyXG4gICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGRyb3Bkb3duIGxpc3QgaXMgemVybyBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGFib3ZlIGNvZGUgZXhlY3V0ZXMsXHJcbiAgICAgICAgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gYWxpZ24gdGhlIGxpc3QgYWZ0ZXIgaXRzIGhlaWdodCBpcyBrbm93biB0byBhdm9pZCBhIGZyYW1lXHJcbiAgICAgICAgb3IgdHdvIG9mIHRoZSBsaXN0IGF0IG9yaWdpblxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAndG9wJywgJy05OTlweCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25MaXN0Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgJy05OTlweCcpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9zaXRpb25Ecm9wZG93bkxpc3QoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdG9wIHJlbmRlcmluZyBkcm9wZG93biBsaXN0IG9uIGFuaW1hdGlvbiBkb25lIGlmIHRvU3RhdGUgaXMgY2xvc2VcclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIEFuZ3VsYXIgQW5pbWF0aW9uRXZlbnRcclxuICAgKi9cclxuICBvbkFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2Nsb3NlJykge1xyXG4gICAgICB0aGlzLnJlbmRlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9jdXMgb24gdGhlIHNlbGVjdGVkIGRyb3Bkb3duIG9wdGlvbiBvbiBkcm9wZG93biBvcGVuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBzZXRTZWxlY3Rpb25JbmRleCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICBpZiAoKCEhdGhpcy52YWx1ZSB8fCArdGhpcy52YWx1ZSA+PSAwKSAmJiAhIXRoaXMuZHJvcGRvd25PcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZHJvcGRvd25PcHRpb25zQXJyYXkgPSB0aGlzLmRyb3Bkb3duT3B0aW9ucy50b0FycmF5KCk7XHJcbiAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBkcm9wZG93bk9wdGlvbnNBcnJheS5maW5kSW5kZXgob3B0aW9uID0+IHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpID09PSBvcHRpb24ubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGlvbkluZGV4ID0gZm91bmRJbmRleCA+IC0xID8gZm91bmRJbmRleCA6IG51bGwgYXMgYW55O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGludGVybmFsIHZhbHVlIGFuZCBlbWl0IGNoYW5nZSBldmVudHMgaWYgaW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIGN1cnJlbnQgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHNlbGVjdGVkIHZhbHVlXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZURyb3Bkb3duT3B0aW9uU2VsZWN0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZhbHVlICE9PSB2YWx1ZSAmJiAhdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk1vZGVsQ2hhbmdlTW9iaWxlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbGlnbiB0aGUgZHJvcGRvd24gbGlzdCB3aXRoIHRoZSBkcm9wZG93blxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwb3NpdGlvbkRyb3Bkb3duTGlzdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtsZWZ0LCB0b3AsIGJvdHRvbX0gPSB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB7b2Zmc2V0SGVpZ2h0fSA9IHRoaXMuZHJvcGRvd25MaXN0Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkYXRlUGlja2VyQm90dG9tTGVmdEFuY2hvciA9IGJvdHRvbTtcclxuICAgIGNvbnN0IGF2YWlsYWJsZUJvdHRvbVNwYWNlID0gd2luZG93LmlubmVySGVpZ2h0IC0gZGF0ZVBpY2tlckJvdHRvbUxlZnRBbmNob3I7XHJcbiAgICBjb25zdCBhdmFpbGFibGVUb3BTcGFjZSA9IHRvcDtcclxuICAgIGNvbnN0IG9mZnNldExpc3RIZWlnaHQgPSBvZmZzZXRIZWlnaHQgKyBEcm9wZG93bkNvbXBvbmVudC5EUk9QRE9XTl9MSVNUX09GRlNFVDtcclxuICAgIGxldCB0cmFuc2Zvcm1PcmlnaW46IHN0cmluZywgcG9zaXRpb25Ub3A6IHN0cmluZztcclxuXHJcbiAgICBpZiAoYXZhaWxhYmxlQm90dG9tU3BhY2UgPiBvZmZzZXRMaXN0SGVpZ2h0KSB7XHJcbiAgICAgIHRyYW5zZm9ybU9yaWdpbiA9ICd0b3AgbGVmdCc7XHJcbiAgICAgIHBvc2l0aW9uVG9wID0gYCR7ZGF0ZVBpY2tlckJvdHRvbUxlZnRBbmNob3IgKyBEcm9wZG93bkNvbXBvbmVudC5EUk9QRE9XTl9MSVNUX09GRlNFVH1weGA7XHJcbiAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZVRvcFNwYWNlID4gb2Zmc2V0TGlzdEhlaWdodCkge1xyXG4gICAgICB0cmFuc2Zvcm1PcmlnaW4gPSAnYm90dG9tIGxlZnQnO1xyXG4gICAgICBwb3NpdGlvblRvcCA9IGAke3RvcCAtIG9mZnNldExpc3RIZWlnaHR9cHhgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKG9mZnNldEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xyXG4gICAgICAgIHBvc2l0aW9uVG9wID0gJzBweCc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBvZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgcG9zaXRpb25Ub3AgPSBgJHtTdHJpbmcoYXZhaWxhYmxlU3BhY2UgLyAyKX1weGA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyYW5zZm9ybU9yaWdpbiA9ICd0b3AgbGVmdCc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtLW9yaWdpbicsIHRyYW5zZm9ybU9yaWdpbik7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25MaXN0Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7bGVmdH1weGApO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAndG9wJywgcG9zaXRpb25Ub3ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWF0Y2ggdGhlIGRyb3Bkb3duIGxpc3Qgd2lkdGggdG8gdGhlIGRyb3Bkb3duJ3Mgd2lkdGhcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzaXplRHJvcGRvd25MaXN0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCBgJHt3aWR0aH1weGApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGFycm93IGtleXVwIGV2ZW50XHJcbiAgICogQHBhcmFtIGtleSB0aGUgYXJyb3cga2V5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbkFycm93S2V5VXAoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnIHx8IGtleSA9PT0gJ0Fycm93VXAnKSB7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzT3B0aW9uID0gdGhpcy5nZXRQcmV2aW91c09wdGlvbigpO1xyXG5cclxuICAgICAgaWYgKHByZXZpb3VzT3B0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgICAgICBwcmV2aW91c09wdGlvbi5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZURyb3Bkb3duT3B0aW9uU2VsZWN0KHByZXZpb3VzT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIGFzIHN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcclxuICAgICAgY29uc3QgbmV4dE9wdGlvbiA9IHRoaXMuZ2V0TmV4dE9wdGlvbigpO1xyXG5cclxuICAgICAgaWYgKG5leHRPcHRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHtcclxuICAgICAgICAgIG5leHRPcHRpb24uZm9jdXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcm9wZG93bk9wdGlvblNlbGVjdChuZXh0T3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIGFzIHN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIG5leHQgZW5hYmxlZCBkcm9wZG93biBvcHRpb24gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbmRleCkuXHJcbiAgICogSWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGZpbmFsIGF2YWlsYWJsZSBvcHRpb24sIGl0IGlzXHJcbiAgICogcmV0dXJuZWQuIElmIG5vIHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlLCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9wdGlvbiBpcyByZXR1cm5lZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXROZXh0T3B0aW9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcclxuICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMuZHJvcGRvd25PcHRpb25zLnRvQXJyYXkoKTtcclxuXHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zZWxlY3Rpb25JbmRleCA9PT0gbnVsbCA/IDAgOiB0aGlzLnNlbGVjdGlvbkluZGV4ICsgMTtcclxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgb3B0aW9uc0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNBcnJheVtpXS5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkluZGV4ID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkluZGV4ID09PSBudWxsXHJcbiAgICAgID8gbnVsbCBhcyBhbnlcclxuICAgICAgOiBvcHRpb25zQXJyYXlbdGhpcy5zZWxlY3Rpb25JbmRleF0ubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcHJldmlvdXMgZW5hYmxlZCBkcm9wZG93biBvcHRpb24gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbmRleCkuXHJcbiAgICogSWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGZpcnN0IGF2YWlsYWJsZSBvcHRpb24sIGl0IGlzXHJcbiAgICogcmV0dXJuZWRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNPcHRpb24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xyXG4gICAgbGV0IHByZXZpb3VzT3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMuZHJvcGRvd25PcHRpb25zLnRvQXJyYXkoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlbGVjdGlvbkluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zQXJyYXlbaV0ubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpO1xyXG4gICAgICAgICAgcHJldmlvdXNPcHRpb24gPSBvcHRpb247XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJldmlvdXNPcHRpb247XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGUgZWxzZSBtb2JpbGVcIj5cclxuPGRpdiAjZHJvcGRvd25cclxuICAgICBjbGFzcz1cInJvdyBwdGxfaW5wdXQgcHRsX2lucHV0X2hlaWdodCBwdGxfaW5wdXRfYmdfY29sb3IgcHRsX2JyZHJfY29sb3IgcHRsX2JyZHJfc2l6ZSBwdGxfYnJkcl9yYWRpdXMgZW50X3IybF9kaXJcIlxyXG4gICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCJcclxuICAgICBzdHlsZT1cImN1cnNvcjpkZWZhdWx0O292ZXJmbG93OmhpZGRlbjtcIlxyXG4gICAgIFtuZ0NsYXNzXT1cImNsYXNzTGlzdCA/IGNsYXNzTGlzdCA6ICcnXCI+XHJcbiAgPGJ1dHRvbiAjZHJvcGRvd25CdXR0b25cclxuICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXHJcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuRHJvcGRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwic2V0U2VsZWN0aW9uSW5kZXgoKVwiXHJcbiAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbaWRdPVwiZHJvcGRvd25JZFwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbmVkXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuc2V0IGNsZWFyIGNlbnRlcl9jZW50ZXIgaGVpZ2h0MTAwIHdpZHRoMTAwXCJcclxuICAgICAgICAgIHN0eWxlPVwib3V0bGluZS1vZmZzZXQ6IC0ycHg7XCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIHNpemVfMSBoZWlnaHQxMDAgd2lkdGgxMDAgdl9jZW50ZXIgcHRsX2lucHV0X3RleHRfc2l6ZSBwdGxfaW5wdXRfcGFkZGluZyBib3JkZXJfbm9uZSB3aWR0aDEwMCBvdmVyZmxvd19oaWRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRGF0YUNvbnRleHQkIHwgYXN5bmMgYXMgZGF0YUNvbnRleHQgZWxzZSBwbGFjZWhvbGRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISF0ZW1wbGF0ZSBlbHNlIG5vQ3VzdG9tVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB2X2NlbnRlciB0ZXh0X2VsbGlwc2lzIG1pbl93MFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogJGFueShkYXRhQ29udGV4dClcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9DdXN0b21UZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudF9yMmxfdHh0XCI+e3tkYXRhQ29udGV4dFsnJGltcGxpY2l0J10gfHwgZGF0YUNvbnRleHQubGFiZWx9fTwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVGVtcGxhdGU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHRsX3BsYWNlaG9sZGVyIGVudF9yMmxfdHh0XCI+e3t0ZXh0LnBsYWNlaG9sZGVyfX08L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIG1pbl93NTAgaGVpZ2h0MTAwIGNlbnRlcl9jZW50ZXIgYm9yZGVyX2xlZnRcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJidXR0b25DbGFzc0xpc3QgPyBidXR0b25DbGFzc0xpc3QgOiAncHRsX2JyZHJfY29sb3InXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJfY2VudGVyIGhlaWdodDEwMCB3aWR0aDEwMFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhcmV0LWRvd24gcHRsX2lucHV0X3RleHRfc2l6ZVwiPjwvaT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IFtzdHlsZS5kaXNwbGF5XT1cInJlbmRlciA/ICcnIDogJ25vbmUnXCJcclxuICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhcmVuZGVyXCJcclxuICAgICBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX292ZXJsYXlcIj5cclxuICA8ZGl2ICNkcm9wZG93bkxpc3RcclxuICAgICAgIFtAb3BlbkNsb3NlXT1cIm9wZW5lZCA/ICdvcGVuJyA6ICdjbG9zZSdcIlxyXG4gICAgICAgKEBvcGVuQ2xvc2Uuc3RhcnQpPVwib25BbmltYXRpb25TdGFydCgkZXZlbnQpXCJcclxuICAgICAgIChAb3BlbkNsb3NlLmRvbmUpPVwib25BbmltYXRpb25Eb25lKCRldmVudClcIlxyXG4gICAgICAgY2xhc3M9XCJwb3NpdGlvbl9hYnNvbHV0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX29wdGlvbnMgY29udGVudF9jb2xvciBlbnRfcjJsX2RpclwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX29wdGlvbnMgfCBhc3luYyBhcyBvcHRpb25zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX2xpc3RcIiByb2xlPVwibGlzdGJveFwiIHRhYmluZGV4PVwiLTFcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQucGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgIDwhLS0gQ1VTVE9NIFRFTVBMQVRFIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhdGVtcGxhdGUgZWxzZSBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnM7IGluZGV4IGFzIGlcIj5cclxuICAgICAgICAgICAgICA8IS0tIE9QVElPTiBHUk9VUCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09ICdncm91cCcgZWxzZSBub25Hcm91cE9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX2hlYWRpbmcgZW50X3IybF90eHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57e29wdGlvbi5ncm91cExhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwT3B0aW9uIG9mIG9wdGlvbi5vcHRpb25zOyBpbmRleCBhcyBqXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gI2Ryb3Bkb3duT3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRHJvcGRvd25PcHRpb25TZWxlY3QoZ3JvdXBPcHRpb24udmFsdWUsIGdyb3VwT3B0aW9uLmRpc2FibGVkISlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRHJvcGRvd25PcHRpb25Nb3VzZUVudGVyKGRyb3Bkb3duT3B0aW9uLCBpICsgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25Ecm9wZG93bk9wdGlvbk1vdXNlTW92ZShkcm9wZG93bk9wdGlvbiwgaSArIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImRyb3Bkb3duSWQgKyAnLScgKyBncm91cE9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAndW5zZWxlY3RlZCcgOiAoX2ludGVybmFsVmFsdWUgfCBhc3luYykgIT09IGdyb3VwT3B0aW9uLnZhbHVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpID09PSBncm91cE9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS12YWx1ZV09XCJncm91cE9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwT3B0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX29wdGlvbiBlbnRfcjJsX3R4dFwiIHJvbGU9XCJvcHRpb25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6ICRhbnkoZ3JvdXBPcHRpb24uZGF0YUNvbnRleHQhKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gU0lOR1VMQVIgT1BUSU9OIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uR3JvdXBPcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09ICdvcHRpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gI2Ryb3Bkb3duT3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRHJvcGRvd25PcHRpb25TZWxlY3Qob3B0aW9uLnZhbHVlLCBvcHRpb24uZGlzYWJsZWQhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Ecm9wZG93bk9wdGlvbk1vdXNlRW50ZXIoZHJvcGRvd25PcHRpb24sIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uRHJvcGRvd25PcHRpb25Nb3VzZU1vdmUoZHJvcGRvd25PcHRpb24sIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImRyb3Bkb3duSWQgKyAnLScgKyBvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2VsZWN0ZWQnIDogKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpICE9PSBvcHRpb24udmFsdWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYykgPT09IG9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS12YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljbGVfZHJvcGRvd25fb3B0aW9uIGVudF9yMmxfdHh0XCIgcm9sZT1cIm9wdGlvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogJGFueShvcHRpb24uZGF0YUNvbnRleHQhKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIE5PIENVU1RPTSBURU1QTEFURSAtLT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9wdGlvblRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uczsgaW5kZXggYXMgaVwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gT1BUSU9OIEdST1VQIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gJ2dyb3VwJyBlbHNlIG5vbkdyb3VwT3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZHJvcGRvd25faGVhZGluZyBlbnRfcjJsX3R4dFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7b3B0aW9uLmdyb3VwTGFiZWx9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXBPcHRpb24gb2Ygb3B0aW9uLm9wdGlvbnM7IGluZGV4IGFzIGpcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAjZHJvcGRvd25PcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ecm9wZG93bk9wdGlvblNlbGVjdChncm91cE9wdGlvbi52YWx1ZSwgZ3JvdXBPcHRpb24uZGlzYWJsZWQhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Ecm9wZG93bk9wdGlvbk1vdXNlRW50ZXIoZHJvcGRvd25PcHRpb24sIGkgKyBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkRyb3Bkb3duT3B0aW9uTW91c2VNb3ZlKGRyb3Bkb3duT3B0aW9uLCBpICsgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwib25Fc2NhcGVLZXlVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZHJvcGRvd25JZCArICctJyArIGdyb3VwT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd1bnNlbGVjdGVkJyA6IChfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKSAhPT0gZ3JvdXBPcHRpb24udmFsdWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJncm91cE9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYykgPT09IGdyb3VwT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXZhbHVlXT1cImdyb3VwT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRpYWxvZy1jbG9zZS1vdmVycmlkZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXBPcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljbGVfZHJvcGRvd25fb3B0aW9uIGVudF9yMmxfdHh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tncm91cE9wdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSBTSU5HVUxBUiBPUFRJT04gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub25Hcm91cE9wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gJ29wdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAjZHJvcGRvd25PcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ecm9wZG93bk9wdGlvblNlbGVjdChvcHRpb24udmFsdWUsIG9wdGlvbi5kaXNhYmxlZCEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRyb3Bkb3duT3B0aW9uTW91c2VFbnRlcihkcm9wZG93bk9wdGlvbiwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25Ecm9wZG93bk9wdGlvbk1vdXNlTW92ZShkcm9wZG93bk9wdGlvbiwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwib25Fc2NhcGVLZXlVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZHJvcGRvd25JZCArICctJyArIG9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAndW5zZWxlY3RlZCcgOiAoX2ludGVybmFsVmFsdWUgfCBhc3luYykgIT09IG9wdGlvbi52YWx1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIihfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKSA9PT0gb3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYXJ0aWNsZV9kcm9wZG93bl9vcHRpb24gZW50X3IybF90eHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy1jb250ZW50IHNlbGVjdD1cInRlbXBsYXRlXCI+PC9uZy1jb250ZW50PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbW9iaWxlPlxyXG4gIDxzZWxlY3RcclxuICAgIGNsYXNzPVwiYWNjZXNzIHB0bF9pbnB1dCBwdGxfaW5wdXRfaGVpZ2h0IHB0bF9pbnB1dF90ZXh0X3NpemUgcHRsX2lucHV0X3BhZGRpbmcgcHRsX2lucHV0X2JnX2NvbG9yIHB0bF9icmRyX2NvbG9yIHB0bF9icmRyX3NpemUgcHRsX2JyZHJfcmFkaXVzXCJcclxuICAgIFtpZF09XCJkcm9wZG93bklkXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlTW9iaWxlKCRldmVudClcIlxyXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9vcHRpb25zIHwgYXN5bmMgYXMgb3B0aW9uc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gJ2dyb3VwJ1wiPlxyXG4gICAgICAgICAgPG9wdGdyb3VwIGNsYXNzPVwiaW5wdXRfYmdfY29sb3IgbWluX2g1MCBwYWRfMTBcIiBbbGFiZWxdPVwib3B0aW9uLmdyb3VwTGFiZWxcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXBPcHRpb24gb2Ygb3B0aW9uLm9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXBPcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dF9iZ19jb2xvciBtaW5faDUwIHBhZF8xMFwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7Z3JvdXBPcHRpb24ubGFiZWx9fVxyXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvb3B0Z3JvdXA+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbi50eXBlID09PSAnb3B0aW9uJ1wiPlxyXG4gICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dF9iZ19jb2xvciBtaW5faDUwIHBhZF8xMFwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7e29wdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L3NlbGVjdD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
|
|
682
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFrQixLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFBRSxVQUFVLEVBQ3hCLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxHQUFHLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFVbkQ7O0dBRUc7QUEyQkgsTUFBTSxPQUFPLGlCQUFpQjtJQWlDUjtJQUE2QjtJQS9CakQ7OztPQUdHO0lBQ0gsSUFDSSxLQUFLLENBQUMsS0FBc0I7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLE9BQU8sQ0FBQyxPQUE0QjtRQUN0QyxJQUFJLENBQUMs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STtzQkFESCxLQUFLO2dCQVNOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7O1FBT0osNERBQTREO1FBQzlELE1BQU07c0JBRkwsTUFBTTtnQkFtUFAsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFlekMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdCMUMsT0FBTztzQkFETixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFpQ3hDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge21hcCwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtEcm9wZG93bk9wdGlvbn0gZnJvbSAnLi9tb2RlbHMvZHJvcGRvd24tb3B0aW9uLm1vZGVsJztcclxuaW1wb3J0IHtEcm9wZG93bk9wdGlvbkdyb3VwfSBmcm9tICcuL21vZGVscy9kcm9wZG93bi1vcHRpb24tZ3JvdXAubW9kZWwnO1xyXG5pbXBvcnQge0Ryb3Bkb3duVGV4dH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIGRyb3Bkb3duIGNvbXBvbmVudCBvcHRpb24gaW5wdXRcclxuICovXHJcbmRlY2xhcmUgdHlwZSBEcm9wZG93bk9wdGlvbklucHV0ID0gQXJyYXk8RHJvcGRvd25PcHRpb24gfCBEcm9wZG93bk9wdGlvbkdyb3VwPjtcclxuXHJcbi8qKlxyXG4gKiBEcm9wZG93biBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGFydGljbGUtZHJvcGRvd24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LmNzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ29wZW5DbG9zZScsIFtcclxuICAgICAgdHJhbnNpdGlvbignY2xvc2UgPT4gb3BlbicsIFtcclxuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlWSgwLjUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlJyxcclxuICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJywgb3BhY2l0eTogMSB9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ29wZW4gPT4gY2xvc2UnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLCBvcGFjaXR5OiAxIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoJzIwMG1zIGVhc2UnLFxyXG4gICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMC41KScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgXSlcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHJvcGRvd25Db21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBkcm9wZG93blxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2ludGVybmFsVmFsdWUubmV4dCh2YWx1ZSk7XHJcblxyXG4gICAgdGhpcy5zZXRTZWxlY3Rpb25JbmRleCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZHJvcGRvd24gb3B0aW9ucy9vcHRpb24gZ3JvdXBzXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgb3B0aW9ucyhvcHRpb25zOiBEcm9wZG93bk9wdGlvbklucHV0KSB7XHJcbiAgICB0aGlzLl9vcHRpb25zLm5leHQoRHJvcGRvd25Db21wb25lbnQuc2FuaXRpemVPcHRpb25JbnB1dChvcHRpb25zKSk7XHJcbiAgICB0aGlzLl9hbGxPcHRpb25zID0gRHJvcGRvd25Db21wb25lbnQuZ2V0QWxsT3B0aW9ucyh0aGlzLl9vcHRpb25zLnZhbHVlKTtcclxuICAgIHRoaXMuc2V0U2VsZWN0aW9uSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlcGVuZGVuY3kgaW5qZWN0aW9uIHNpdGVcclxuICAgKiBAcGFyYW0gcmVuZGVyZXIgdGhlIEFuZ3VsYXIgcmVuZGVyZXJcclxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgcmVmZXJlbmNlIHRvIHRoZSBBbmd1bGFyIGNoYW5nZSBkZXRlY3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xyXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xyXG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVycy5sZW5ndGgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRyb3Bkb3duSWQgPSBgZHJvcGRvd24tJHtyZXN1bHR9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGFtb3VudCBvZiBvZmZzZXQgKGluIHBpeGVscykgdG8gcGxhY2UgYmV0d2VlbiB0aGUgZHJvcGRvd25cclxuICAgKiBhbmQgaXRzIGxpc3Qgb3ZlcmxheVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJPUERPV05fTElTVF9PRkZTRVQgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBMaXN0IG9mIGFycm93IGtleSBrZXljb2Rlc1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJST1dfS0VZUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkcm9wZG93blxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJylcclxuICBkcm9wZG93bjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkcm9wZG93biBidXR0b25cclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdkcm9wZG93bkJ1dHRvbicpXHJcbiAgZHJvcGRvd25CdXR0b246IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFZpZXdDaGlsZCBvZiB0aGUgZHJvcGRvd24gbGlzdFxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duTGlzdCcpXHJcbiAgZHJvcGRvd25MaXN0OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBRdWVyeUxpc3Qgb2YgZHJvcGRvd24gb3B0aW9uIFZpZXdDaGlsZHJlblxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2Ryb3Bkb3duT3B0aW9uJylcclxuICBkcm9wZG93bk9wdGlvbnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29udGVudENoaWxkIG9mIHRoZSBkcm9wZG93biBvcHRpb24gdGVtcGxhdGVcclxuICAgKi9cclxuICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxyXG4gIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gc2hvdWxkIGJlIGRpc2FibGVkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHRleHQ6IERyb3Bkb3duVGV4dCA9IHtcclxuICAgICBwbGFjZWhvbGRlcjogJ01ha2UgYSBzZWxlY3Rpb24nXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGFzcyBsaXN0IHRvIGFzc2lnbiB0byB0aGUgZHJvcGRvd25cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGNsYXNzTGlzdDogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYnV0dG9uQ2xhc3NMaXN0OiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCBvbiB2YWx1ZSBjaGFuZ2UsIGVtaXRzIHRoZSBuZXcgdmFsdWVcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxyXG4gIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyPigpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGlucHV0IGRyb3Bkb3duIG9wdGlvbnMvb3B0aW9uIGdyb3Vwc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9vcHRpb25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEcm9wZG93bk9wdGlvbklucHV0PihudWxsIGFzIGFueSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bGwgbGlzdCBvZiBhbGwgYWN0aXZlIG9wdGlvbnMsIHdoZXRoZXIgdGhleSBhcmUgaW4gYSBncm91cCBvciBub3RcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FsbE9wdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBUeXBlYWhlYWQgc3RyaW5nIHdoaWxlIHVzZXJzIGFyZSB0eXBpbmcgaW50byB0aGUgaW5wdXQgZmllbGRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Z1bGxQcmVkaWN0aXZlVGV4dFN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBUaW1lb3V0IHRvIGNsZWFyIHRoZSBfZnVsbFByZWRpY3RpdmVUZXh0U3RyaW5nIGFmdGVyIGEgdXNlciBzdG9wcyB0eXBpbmcgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdGltZW91dCA9IG51bGwgYXMgYW55O1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkcm9wZG93blxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9pbnRlcm5hbFZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCBzdHJpbmc+KG51bGwgYXMgYW55KTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBtYXAgb2Ygb3B0aW9uIHZhbHVlIChzdHJpbmdpZmllZCBpZiBhIG51bWJlcikgdG8gZGF0YSBjb250ZXh0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhQ29udGV4dE1hcCQ6IE9ic2VydmFibGU8eyBbdmFsdWU6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9IH0+ID0gdGhpcy5fb3B0aW9ucy5waXBlKFxyXG4gICAgbWFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICBsZXQgZGF0YUNvbnRleHRNYXA6IHsgW3ZhbHVlOiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB9ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gICAgICBpZiAoISFvcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICBkYXRhQ29udGV4dE1hcCA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoJ29wdGlvbnMnIGluIG9wdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3B0aW9uIG9mIG9wdGlvbi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUNvbnRleHRNYXBbU3RyaW5nKGdyb3VwT3B0aW9uLnZhbHVlKV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwT3B0aW9uLmRhdGFDb250ZXh0KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoJ2RhdGFDb250ZXh0JyBpbiBvcHRpb24pIHtcclxuICAgICAgICAgICAgZGF0YUNvbnRleHRNYXBbU3RyaW5nKG9wdGlvbi52YWx1ZSldID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb24uZGF0YUNvbnRleHQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRhQ29udGV4dE1hcDtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRhdGEgY29udGV4dCBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGFzIGFuIE9ic2VydmFibGVcclxuICAgKi9cclxuICByZWFkb25seSBzZWxlY3RlZERhdGFDb250ZXh0JDogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4gPSB0aGlzLl9pbnRlcm5hbFZhbHVlLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmRhdGFDb250ZXh0TWFwJCksXHJcbiAgICBtYXAoKFt2YWx1ZSwgZGF0YUNvbnRleHRNYXBdKSA9PiB7XHJcbiAgICAgIGxldCBkYXRhQ29udGV4dDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBkYXRhQ29udGV4dE1hcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZGF0YUNvbnRleHRNYXBbU3RyaW5nKHZhbHVlKV07XHJcblxyXG4gICAgICAgIGlmICghIWVudHJ5KSB7XHJcbiAgICAgICAgICBkYXRhQ29udGV4dCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRhQ29udGV4dDtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0QWxsT3B0aW9ucyhvcHRpb25zOiBEcm9wZG93bk9wdGlvbklucHV0KTogQXJyYXk8RHJvcGRvd25PcHRpb24+IHtcclxuICAgIGNvbnN0IGFsbE9wdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICBpZiAob3B0aW9uLnR5cGUgPT09ICdncm91cCcpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwT3B0aW9uIG9mIG9wdGlvbi5vcHRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoIWdyb3VwT3B0aW9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGFsbE9wdGlvbnMucHVzaChncm91cE9wdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi50eXBlID09PSAnb3B0aW9uJyAmJiAhb3B0aW9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgYWxsT3B0aW9ucy5wdXNoKG9wdGlvbiBhcyBEcm9wZG93bk9wdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWxsT3B0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBJRCB0byBhc3NpZ24gdG8gdGhlIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZHJvcGRvd25JZDtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gc2hvdWxkIGJlIHJlbmRlcmVkXHJcbiAgICovXHJcbiAgcmVuZGVyID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGRyb3Bkb3duIGlzIG9wZW5cclxuICAgKi9cclxuICBvcGVuZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGluZGV4IG9mIHRoZSBmb2N1c2VkIG9wdGlvbiBpbiB0aGUgZHJvcGRvd24gbGlzdFxyXG4gICAqL1xyXG4gIHNlbGVjdGlvbkluZGV4OiBudW1iZXIgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gbW9iaWxlIChzY3JlZW4gd2lkdGggaXMgbGVzcyB0aGFuIDc2OCksIHN3YXAgdG8gYSBuYXRpdmUgaW5wdXRcclxuICAgKi9cclxuICBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDc2ODtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRyb3Bkb3duXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgb3B0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGJvdGggYSBsYWJlbCBhbmQgYSB2YWx1ZSxcclxuICAgKiBhbHNvIHJlbW92ZXMgZW1wdHkgZ3JvdXBzIChvciBncm91cHMgdGhhdCBoYXZlIG5vIHZhbGlkIG9wdGlvbnMpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gc2FuaXRpemVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplT3B0aW9uSW5wdXQob3B0aW9uczogRHJvcGRvd25PcHRpb25JbnB1dCk6IERyb3Bkb3duT3B0aW9uSW5wdXQge1xyXG4gICAgY29uc3Qgc2FuaXRpemVkT3B0aW9uczogRHJvcGRvd25PcHRpb25JbnB1dCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgaWYgKCgnZ3JvdXBMYWJlbCcgaW4gb3B0aW9uKSAmJiAoJ29wdGlvbnMnIGluIG9wdGlvbikpIHtcclxuICAgICAgICBjb25zdCB2YWxpZE9wdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXBPcHRpb24gb2YgKG9wdGlvbi5vcHRpb25zID8/IFtdKSkge1xyXG4gICAgICAgICAgaWYgKCEhZ3JvdXBPcHRpb24ubGFiZWwgJiYgKCEhZ3JvdXBPcHRpb24udmFsdWUgfHwgKCtncm91cE9wdGlvbi52YWx1ZSA+PSAwKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBPcHRpb25Db3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShncm91cE9wdGlvbikpO1xyXG4gICAgICAgICAgICBncm91cE9wdGlvbkNvcHkuZGF0YUNvbnRleHQgPSB0aGlzLmFkZExhYmVsVG9EYXRhQ29udGV4dChncm91cE9wdGlvbkNvcHkubGFiZWwsIGdyb3VwT3B0aW9uQ29weS5kYXRhQ29udGV4dCk7XHJcbiAgICAgICAgICAgIGdyb3VwT3B0aW9uQ29weS50eXBlID0gJ2dyb3VwJztcclxuXHJcbiAgICAgICAgICAgIHZhbGlkT3B0aW9ucy5wdXNoKGdyb3VwT3B0aW9uQ29weSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISF2YWxpZE9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBzYW5pdGl6ZWRPcHRpb25zLnB1c2goeyBncm91cExhYmVsOiBvcHRpb24uZ3JvdXBMYWJlbCwgb3B0aW9uczogdmFsaWRPcHRpb25zLCB0eXBlOiAnZ3JvdXAnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgoJ2xhYmVsJyBpbiBvcHRpb24pICYmICgndmFsdWUnIGluIG9wdGlvbikpIHtcclxuICAgICAgICBpZiAoISFvcHRpb24ubGFiZWwgJiYgKCEhb3B0aW9uLnZhbHVlIHx8ICgrb3B0aW9uLnZhbHVlID49IDApKSkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9uKSk7XHJcbiAgICAgICAgICBvcHRpb25Db3B5LmRhdGFDb250ZXh0ID0gdGhpcy5hZGRMYWJlbFRvRGF0YUNvbnRleHQob3B0aW9uQ29weS5sYWJlbCwgb3B0aW9uQ29weS5kYXRhQ29udGV4dCk7XHJcbiAgICAgICAgICBvcHRpb25Db3B5LnR5cGUgPSAnb3B0aW9uJztcclxuXHJcbiAgICAgICAgICBzYW5pdGl6ZWRPcHRpb25zLnB1c2gob3B0aW9uQ29weSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNhbml0aXplZE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgb3B0aW9uIGxhYmVsIHRvIGRhdGEgY29udGV4dCBpZiBub3QgcHJlc2VudC4gSWYgJGltcGxpY2l0XHJcbiAgICogdmFsdWUgaXMgbm90IHByZXNlbnQsIGl0IHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgbGFiZWwgYXMgaXRzIHZhbHVlLlxyXG4gICAqIElmICRpbXBsaWNpdCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IHdpbGwgYWRkIGEgbGFiZWwga2V5IHRvIHRoZSBjb250ZXh0XHJcbiAgICogQHBhcmFtIGxhYmVsIHRoZSBvcHRpb24gbGFiZWxcclxuICAgKiBAcGFyYW0gZGF0YUNvbnRleHQgdGhlIG9wdGlvbiBkYXRhIGNvbnRleHRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGFkZExhYmVsVG9EYXRhQ29udGV4dChsYWJlbDogc3RyaW5nLCBkYXRhQ29udGV4dDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB7XHJcbiAgICBpZiAoIWRhdGFDb250ZXh0KSB7XHJcbiAgICAgIGRhdGFDb250ZXh0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhbGFiZWwpIHtcclxuICAgICAgY29uc3QgaW1wbGljaXRWYWx1ZSA9IGRhdGFDb250ZXh0WyckaW1wbGljaXQnXTtcclxuXHJcbiAgICAgIGlmICghIWltcGxpY2l0VmFsdWUgfHwgaW1wbGljaXRWYWx1ZSBhcyBudW1iZXIgPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsRXhpc3RzID0gISFkYXRhQ29udGV4dFsnbGFiZWwnXTtcclxuXHJcbiAgICAgICAgaWYgKCFsYWJlbEV4aXN0cykge1xyXG4gICAgICAgICAgZGF0YUNvbnRleHRbJ2xhYmVsJ10gPSBsYWJlbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YUNvbnRleHRbJyRpbXBsaWNpdCddID0gbGFiZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YUNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIGNoYW5nZVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIHRvdWNoXHJcbiAgICovXHJcbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXHJcbiAgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gY2hhbmdlXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gdG91Y2hcclxuICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZGlzYWJsZWQgc3RhdGVcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBkaXNhYmxlZCBvciBub3RcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXBvc2l0aW9uIGFuZCByZXNpemUgdGhlIGRyb3Bkb3duIG9uIHdpbmRvdyByZXNpemVcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvbldpbmRvd1Jlc2l6ZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzTW9iaWxlID0gZXZlbnQudGFyZ2V0LmlubmVyV2lkdGggPD0gNzY4O1xyXG5cclxuICAgIGlmICh0aGlzLm9wZW5lZCkge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd25MaXN0KCk7XHJcbiAgICAgIHRoaXMucmVzaXplRHJvcGRvd25MaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGFycm93IGtleSBrZXlkb3duIGV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBrZXlkb3duIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uaWQ/LmluY2x1ZGVzKHRoaXMuZHJvcGRvd25JZCkgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgY29uc3QgeyBrZXkgfSA9IGV2ZW50O1xyXG5cclxuICAgICAgaWYgKERyb3Bkb3duQ29tcG9uZW50LkFSUk9XX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIHRoZSBkcm9wZG93biBsaXN0IG9uIHRhYiBhbmQgaGFuZGxlIGFycm93IGtleSBuYXZpZ2F0aW9uXHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBrZXl1cCBLZXlib2FyZEV2ZW50XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcclxuICBvbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uaWQ/LmluY2x1ZGVzKHRoaXMuZHJvcGRvd25JZCkgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgY29uc3Qge2tleX0gPSBldmVudDtcclxuXHJcbiAgICAgIGlmIChEcm9wZG93bkNvbXBvbmVudC5BUlJPV19LRVlTLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICB0aGlzLm9uQXJyb3dLZXlVcChrZXkpO1xyXG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ1RhYicpIHtcclxuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9mdWxsUHJlZGljdGl2ZVRleHRTdHJpbmcgKz0ga2V5O1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9mdWxsUHJlZGljdGl2ZVRleHRTdHJpbmcgPSAnJywgNTAwKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gdGhpcy5fYWxsT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHtcclxuICAgICAgICAgIHJldHVybiBvcHRpb24ubGFiZWwgJiYgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0aGlzLl9mdWxsUHJlZGljdGl2ZVRleHRTdHJpbmcudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGZpbHRlcmVkT3B0aW9ucyAmJiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcm9wZG93bk9wdGlvblNlbGVjdChmaWx0ZXJlZE9wdGlvbnNbMF0udmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgdGhlIGRyb3Bkb3duIGxpc3QgKGlmIG9wZW5lZCkgb24gY2xpY2sgaWYgb3V0c2lkZSB0aGUgbGlzdFxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2xpY2sgTW91c2VFdmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgIGNvbnN0IHtwYWdlWCwgcGFnZVl9ID0gZXZlbnQ7XHJcblxyXG4gICAgICBpZiAocGFnZVggPiAwICYmIHBhZ2VZID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIH0gPSB0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHhQb3NpdGlvblZhbGlkID0gcGFnZVggPj0gbGVmdCAmJiBwYWdlWCA8PSByaWdodDtcclxuICAgICAgICBjb25zdCB5UG9zaXRpb25WYWxpZCA9IHBhZ2VZID49IHRvcCAmJiBwYWdlWSA8PSBib3R0b207XHJcbiAgICAgICAgY29uc3Qgc2hvdWxkQ2xvc2UgPSAhKHhQb3NpdGlvblZhbGlkICYmIHlQb3NpdGlvblZhbGlkKTtcclxuXHJcbiAgICAgICAgaWYgKHNob3VsZENsb3NlKSB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcclxuICAgICAgICAgIHRoaXMuZHJvcGRvd25CdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZHJvcGRvd24gb24gZXNjYXBlIGtleXVwIGFuZCBmb2N1cyBvbiBkcm9wZG93biBidXR0b25cclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleXVwIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBvbkVzY2FwZUtleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25CdXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGZvY3VzIHRvIGRyb3Bkb3duIG9wdGlvbiBvbiBtb3VzZSBlbnRlciBhbmQgdXBkYXRlIHNlbGVjdGVkIGluZGV4XHJcbiAgICogQHBhcmFtIG9wdGlvbiB0aGUgZHJvcGRvd24gb3B0aW9uIHRvIGZvY3VzXHJcbiAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRvIGZvY3VzXHJcbiAgICovXHJcbiAgb25Ecm9wZG93bk9wdGlvbk1vdXNlRW50ZXIob3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25JbmRleCA9IGluZGV4O1xyXG4gICAgb3B0aW9uLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZm9jdXMgdG8gZHJvcGRvd24gb3B0aW9uIG9uIG1vdXNlIG1vdmUgYW5kIHVwZGF0ZSBzZWxlY3RlZCBpbmRleFxyXG4gICAqIEBwYXJhbSBvcHRpb24gdGhlIGRyb3Bkb3duIG9wdGlvbiB0byBmb2N1c1xyXG4gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG9wdGlvbiB0byBmb2N1c1xyXG4gICAqL1xyXG4gIG9uRHJvcGRvd25PcHRpb25Nb3VzZU1vdmUob3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5kZXggIT09IGluZGV4KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpbmRleDtcclxuICAgICAgb3B0aW9uLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZSB2YWx1ZSBhbmQgY2xvc2UgZHJvcGRvd24gb24gb3B0aW9uIHNlbGVjdFxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcclxuICAgKiBAcGFyYW0gZGlzYWJsZWQgd2hldGhlciBvciBub3QgdGhlIHNlbGVjdGVkIG9wdGlvbiBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIG9uRHJvcGRvd25PcHRpb25TZWxlY3QodmFsdWU6IHN0cmluZyB8IG51bWJlciwgZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5oYW5kbGVEcm9wZG93bk9wdGlvblNlbGVjdCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gdGhlIGRyb3Bkb3duIGxpc3QgYW5kIGFsaWduIGl0XHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjbGljayBNb3VzZUV2ZW50XHJcbiAgICovXHJcbiAgb3BlbkRyb3Bkb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgZHJvcGRvd24gbGlzdFxyXG4gICAqL1xyXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZW5lZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zaXRpb24gYW5kIHJlc2l6ZSBkcm9wZG93biBsaXN0IG9uIGFuaW1hdGlvbiBzdGFydCBpZiB0b1N0YXRlIGlzIG9wZW5cclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIEFuZ3VsYXIgQW5pbWF0aW9uRXZlbnRcclxuICAgKi9cclxuICBvbkFuaW1hdGlvblN0YXJ0KGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdvcGVuJykge1xyXG4gICAgICB0aGlzLnJlc2l6ZURyb3Bkb3duTGlzdCgpO1xyXG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkluZGV4KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25JbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kcm9wZG93bk9wdGlvbnMudG9BcnJheSgpW3RoaXMuc2VsZWN0aW9uSW5kZXhdXHJcbiAgICAgICAgICAgIC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgIC5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKlxyXG4gICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGRyb3Bkb3duIGxpc3QgaXMgemVybyBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGFib3ZlIGNvZGUgZXhlY3V0ZXMsXHJcbiAgICAgICAgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gYWxpZ24gdGhlIGxpc3QgYWZ0ZXIgaXRzIGhlaWdodCBpcyBrbm93biB0byBhdm9pZCBhIGZyYW1lXHJcbiAgICAgICAgb3IgdHdvIG9mIHRoZSBsaXN0IGF0IG9yaWdpblxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAndG9wJywgJy05OTlweCcpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25MaXN0Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgJy05OTlweCcpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9zaXRpb25Ecm9wZG93bkxpc3QoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdG9wIHJlbmRlcmluZyBkcm9wZG93biBsaXN0IG9uIGFuaW1hdGlvbiBkb25lIGlmIHRvU3RhdGUgaXMgY2xvc2VcclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIEFuZ3VsYXIgQW5pbWF0aW9uRXZlbnRcclxuICAgKi9cclxuICBvbkFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2Nsb3NlJykge1xyXG4gICAgICB0aGlzLnJlbmRlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9jdXMgb24gdGhlIHNlbGVjdGVkIGRyb3Bkb3duIG9wdGlvbiBvbiBkcm9wZG93biBvcGVuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBzZXRTZWxlY3Rpb25JbmRleCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICBpZiAoKCEhdGhpcy52YWx1ZSB8fCArdGhpcy52YWx1ZSA+PSAwKSAmJiAhIXRoaXMuZHJvcGRvd25PcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZHJvcGRvd25PcHRpb25zQXJyYXkgPSB0aGlzLmRyb3Bkb3duT3B0aW9ucy50b0FycmF5KCk7XHJcbiAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBkcm9wZG93bk9wdGlvbnNBcnJheS5maW5kSW5kZXgob3B0aW9uID0+IHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpID09PSBvcHRpb24ubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGlvbkluZGV4ID0gZm91bmRJbmRleCA+IC0xID8gZm91bmRJbmRleCA6IG51bGwgYXMgYW55O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGludGVybmFsIHZhbHVlIGFuZCBlbWl0IGNoYW5nZSBldmVudHMgaWYgaW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIGN1cnJlbnQgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHNlbGVjdGVkIHZhbHVlXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZURyb3Bkb3duT3B0aW9uU2VsZWN0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZhbHVlICE9PSB2YWx1ZSAmJiAhdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk1vZGVsQ2hhbmdlTW9iaWxlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbGlnbiB0aGUgZHJvcGRvd24gbGlzdCB3aXRoIHRoZSBkcm9wZG93blxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwb3NpdGlvbkRyb3Bkb3duTGlzdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtsZWZ0LCB0b3AsIGJvdHRvbX0gPSB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB7b2Zmc2V0SGVpZ2h0fSA9IHRoaXMuZHJvcGRvd25MaXN0Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkYXRlUGlja2VyQm90dG9tTGVmdEFuY2hvciA9IGJvdHRvbTtcclxuICAgIGNvbnN0IGF2YWlsYWJsZUJvdHRvbVNwYWNlID0gd2luZG93LmlubmVySGVpZ2h0IC0gZGF0ZVBpY2tlckJvdHRvbUxlZnRBbmNob3I7XHJcbiAgICBjb25zdCBhdmFpbGFibGVUb3BTcGFjZSA9IHRvcDtcclxuICAgIGNvbnN0IG9mZnNldExpc3RIZWlnaHQgPSBvZmZzZXRIZWlnaHQgKyBEcm9wZG93bkNvbXBvbmVudC5EUk9QRE9XTl9MSVNUX09GRlNFVDtcclxuICAgIGxldCB0cmFuc2Zvcm1PcmlnaW46IHN0cmluZywgcG9zaXRpb25Ub3A6IHN0cmluZztcclxuXHJcbiAgICBpZiAoYXZhaWxhYmxlQm90dG9tU3BhY2UgPiBvZmZzZXRMaXN0SGVpZ2h0KSB7XHJcbiAgICAgIHRyYW5zZm9ybU9yaWdpbiA9ICd0b3AgbGVmdCc7XHJcbiAgICAgIHBvc2l0aW9uVG9wID0gYCR7ZGF0ZVBpY2tlckJvdHRvbUxlZnRBbmNob3IgKyBEcm9wZG93bkNvbXBvbmVudC5EUk9QRE9XTl9MSVNUX09GRlNFVH1weGA7XHJcbiAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZVRvcFNwYWNlID4gb2Zmc2V0TGlzdEhlaWdodCkge1xyXG4gICAgICB0cmFuc2Zvcm1PcmlnaW4gPSAnYm90dG9tIGxlZnQnO1xyXG4gICAgICBwb3NpdGlvblRvcCA9IGAke3RvcCAtIG9mZnNldExpc3RIZWlnaHR9cHhgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKG9mZnNldEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xyXG4gICAgICAgIHBvc2l0aW9uVG9wID0gJzBweCc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBvZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgcG9zaXRpb25Ub3AgPSBgJHtTdHJpbmcoYXZhaWxhYmxlU3BhY2UgLyAyKX1weGA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyYW5zZm9ybU9yaWdpbiA9ICd0b3AgbGVmdCc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtLW9yaWdpbicsIHRyYW5zZm9ybU9yaWdpbik7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25MaXN0Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7bGVmdH1weGApO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAndG9wJywgcG9zaXRpb25Ub3ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWF0Y2ggdGhlIGRyb3Bkb3duIGxpc3Qgd2lkdGggdG8gdGhlIGRyb3Bkb3duJ3Mgd2lkdGhcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzaXplRHJvcGRvd25MaXN0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duTGlzdC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCBgJHt3aWR0aH1weGApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGFycm93IGtleXVwIGV2ZW50XHJcbiAgICogQHBhcmFtIGtleSB0aGUgYXJyb3cga2V5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbkFycm93S2V5VXAoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnIHx8IGtleSA9PT0gJ0Fycm93VXAnKSB7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzT3B0aW9uID0gdGhpcy5nZXRQcmV2aW91c09wdGlvbigpO1xyXG5cclxuICAgICAgaWYgKHByZXZpb3VzT3B0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgICAgICBwcmV2aW91c09wdGlvbi5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZURyb3Bkb3duT3B0aW9uU2VsZWN0KHByZXZpb3VzT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIGFzIHN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcclxuICAgICAgY29uc3QgbmV4dE9wdGlvbiA9IHRoaXMuZ2V0TmV4dE9wdGlvbigpO1xyXG5cclxuICAgICAgaWYgKG5leHRPcHRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHtcclxuICAgICAgICAgIG5leHRPcHRpb24uZm9jdXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcm9wZG93bk9wdGlvblNlbGVjdChuZXh0T3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIGFzIHN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIG5leHQgZW5hYmxlZCBkcm9wZG93biBvcHRpb24gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbmRleCkuXHJcbiAgICogSWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGZpbmFsIGF2YWlsYWJsZSBvcHRpb24sIGl0IGlzXHJcbiAgICogcmV0dXJuZWQuIElmIG5vIHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlLCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9wdGlvbiBpcyByZXR1cm5lZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXROZXh0T3B0aW9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcclxuICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMuZHJvcGRvd25PcHRpb25zLnRvQXJyYXkoKTtcclxuXHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zZWxlY3Rpb25JbmRleCA9PT0gbnVsbCA/IDAgOiB0aGlzLnNlbGVjdGlvbkluZGV4ICsgMTtcclxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgb3B0aW9uc0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNBcnJheVtpXS5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkluZGV4ID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkluZGV4ID09PSBudWxsXHJcbiAgICAgID8gbnVsbCBhcyBhbnlcclxuICAgICAgOiBvcHRpb25zQXJyYXlbdGhpcy5zZWxlY3Rpb25JbmRleF0ubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcHJldmlvdXMgZW5hYmxlZCBkcm9wZG93biBvcHRpb24gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbmRleCkuXHJcbiAgICogSWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGZpcnN0IGF2YWlsYWJsZSBvcHRpb24sIGl0IGlzXHJcbiAgICogcmV0dXJuZWRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNPcHRpb24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xyXG4gICAgbGV0IHByZXZpb3VzT3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMuZHJvcGRvd25PcHRpb25zLnRvQXJyYXkoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlbGVjdGlvbkluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zQXJyYXlbaV0ubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpO1xyXG4gICAgICAgICAgcHJldmlvdXNPcHRpb24gPSBvcHRpb247XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJldmlvdXNPcHRpb247XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGUgZWxzZSBtb2JpbGVcIj5cclxuPGRpdiAjZHJvcGRvd25cclxuICAgICBjbGFzcz1cInJvdyBwdGxfaW5wdXQgcHRsX2lucHV0X2hlaWdodCBwdGxfaW5wdXRfYmdfY29sb3IgcHRsX2JyZHJfY29sb3IgcHRsX2JyZHJfc2l6ZSBwdGxfYnJkcl9yYWRpdXMgZW50X3IybF9kaXJcIlxyXG4gICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCJcclxuICAgICBzdHlsZT1cImN1cnNvcjpkZWZhdWx0O292ZXJmbG93OmhpZGRlbjtcIlxyXG4gICAgIFtuZ0NsYXNzXT1cImNsYXNzTGlzdCA/IGNsYXNzTGlzdCA6ICcnXCI+XHJcbiAgPGJ1dHRvbiAjZHJvcGRvd25CdXR0b25cclxuICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXHJcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuRHJvcGRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwic2V0U2VsZWN0aW9uSW5kZXgoKVwiXHJcbiAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbaWRdPVwiZHJvcGRvd25JZFwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbmVkXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuc2V0IGNsZWFyIGNlbnRlcl9jZW50ZXIgaGVpZ2h0MTAwIHdpZHRoMTAwXCJcclxuICAgICAgICAgIHN0eWxlPVwib3V0bGluZS1vZmZzZXQ6IC0ycHg7XCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIHNpemVfMSBoZWlnaHQxMDAgd2lkdGgxMDAgdl9jZW50ZXIgcHRsX2lucHV0X3RleHRfc2l6ZSBwdGxfaW5wdXRfcGFkZGluZyBib3JkZXJfbm9uZSB3aWR0aDEwMCBvdmVyZmxvd19oaWRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRGF0YUNvbnRleHQkIHwgYXN5bmMgYXMgZGF0YUNvbnRleHQgZWxzZSBwbGFjZWhvbGRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISF0ZW1wbGF0ZSBlbHNlIG5vQ3VzdG9tVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB2X2NlbnRlciB0ZXh0X2VsbGlwc2lzIG1pbl93MFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogJGFueShkYXRhQ29udGV4dClcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9DdXN0b21UZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVudF9yMmxfdHh0XCI+e3tkYXRhQ29udGV4dFsnJGltcGxpY2l0J10gfHwgZGF0YUNvbnRleHQubGFiZWx9fTwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVGVtcGxhdGU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHRsX3BsYWNlaG9sZGVyIGVudF9yMmxfdHh0XCI+e3t0ZXh0LnBsYWNlaG9sZGVyfX08L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIG1pbl93NTAgaGVpZ2h0MTAwIGNlbnRlcl9jZW50ZXIgYm9yZGVyX2xlZnRcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJidXR0b25DbGFzc0xpc3QgPyBidXR0b25DbGFzc0xpc3QgOiAncHRsX2JyZHJfY29sb3InXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJfY2VudGVyIGhlaWdodDEwMCB3aWR0aDEwMFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhcmV0LWRvd24gcHRsX2lucHV0X3RleHRfc2l6ZVwiPjwvaT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IFtzdHlsZS5kaXNwbGF5XT1cInJlbmRlciA/ICcnIDogJ25vbmUnXCJcclxuICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhcmVuZGVyXCJcclxuICAgICBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX292ZXJsYXlcIj5cclxuICA8ZGl2ICNkcm9wZG93bkxpc3RcclxuICAgICAgIFtAb3BlbkNsb3NlXT1cIm9wZW5lZCA/ICdvcGVuJyA6ICdjbG9zZSdcIlxyXG4gICAgICAgKEBvcGVuQ2xvc2Uuc3RhcnQpPVwib25BbmltYXRpb25TdGFydCgkZXZlbnQpXCJcclxuICAgICAgIChAb3BlbkNsb3NlLmRvbmUpPVwib25BbmltYXRpb25Eb25lKCRldmVudClcIlxyXG4gICAgICAgY2xhc3M9XCJwb3NpdGlvbl9hYnNvbHV0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX29wdGlvbnMgY29udGVudF9jb2xvciBlbnRfcjJsX2RpclwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX29wdGlvbnMgfCBhc3luYyBhcyBvcHRpb25zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX2xpc3RcIiByb2xlPVwibGlzdGJveFwiIHRhYmluZGV4PVwiLTFcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQucGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgIDwhLS0gQ1VTVE9NIFRFTVBMQVRFIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhdGVtcGxhdGUgZWxzZSBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnM7IGluZGV4IGFzIGlcIj5cclxuICAgICAgICAgICAgICA8IS0tIE9QVElPTiBHUk9VUCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09ICdncm91cCcgZWxzZSBub25Hcm91cE9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX2hlYWRpbmcgcHRsX2lucHV0X3RleHRfc2l6ZSBlbnRfcjJsX3R4dFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7b3B0aW9uLmdyb3VwTGFiZWx9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXBPcHRpb24gb2Ygb3B0aW9uLm9wdGlvbnM7IGluZGV4IGFzIGpcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAjZHJvcGRvd25PcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ecm9wZG93bk9wdGlvblNlbGVjdChncm91cE9wdGlvbi52YWx1ZSwgZ3JvdXBPcHRpb24uZGlzYWJsZWQhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Ecm9wZG93bk9wdGlvbk1vdXNlRW50ZXIoZHJvcGRvd25PcHRpb24sIGkgKyBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkRyb3Bkb3duT3B0aW9uTW91c2VNb3ZlKGRyb3Bkb3duT3B0aW9uLCBpICsgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwib25Fc2NhcGVLZXlVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZHJvcGRvd25JZCArICctJyArIGdyb3VwT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd1bnNlbGVjdGVkJyA6IChfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKSAhPT0gZ3JvdXBPcHRpb24udmFsdWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYykgPT09IGdyb3VwT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXZhbHVlXT1cImdyb3VwT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRpYWxvZy1jbG9zZS1vdmVycmlkZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXBPcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljbGVfZHJvcGRvd25fb3B0aW9uIHB0bF9pbnB1dF90ZXh0X3NpemUgZW50X3IybF90eHRcIiByb2xlPVwib3B0aW9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAkYW55KGdyb3VwT3B0aW9uLmRhdGFDb250ZXh0ISlcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tIFNJTkdVTEFSIE9QVElPTiAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkdyb3VwT3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbi50eXBlID09PSAnb3B0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICNkcm9wZG93bk9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRyb3Bkb3duT3B0aW9uU2VsZWN0KG9wdGlvbi52YWx1ZSwgb3B0aW9uLmRpc2FibGVkISlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRHJvcGRvd25PcHRpb25Nb3VzZUVudGVyKGRyb3Bkb3duT3B0aW9uLCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkRyb3Bkb3duT3B0aW9uTW91c2VNb3ZlKGRyb3Bkb3duT3B0aW9uLCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJvbkVzY2FwZUtleVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJkcm9wZG93bklkICsgJy0nICsgb3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd1bnNlbGVjdGVkJyA6IChfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKSAhPT0gb3B0aW9uLnZhbHVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpID09PSBvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRpYWxvZy1jbG9zZS1vdmVycmlkZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhcnRpY2xlX2Ryb3Bkb3duX29wdGlvbiBwdGxfaW5wdXRfdGV4dF9zaXplIGVudF9yMmxfdHh0XCIgcm9sZT1cIm9wdGlvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogJGFueShvcHRpb24uZGF0YUNvbnRleHQhKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIE5PIENVU1RPTSBURU1QTEFURSAtLT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9wdGlvblRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uczsgaW5kZXggYXMgaVwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gT1BUSU9OIEdST1VQIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gJ2dyb3VwJyBlbHNlIG5vbkdyb3VwT3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZHJvcGRvd25faGVhZGluZyBwdGxfaW5wdXRfdGV4dF9zaXplIGVudF9yMmxfdHh0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3tvcHRpb24uZ3JvdXBMYWJlbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cE9wdGlvbiBvZiBvcHRpb24ub3B0aW9uczsgaW5kZXggYXMgalwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uICNkcm9wZG93bk9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRyb3Bkb3duT3B0aW9uU2VsZWN0KGdyb3VwT3B0aW9uLnZhbHVlLCBncm91cE9wdGlvbi5kaXNhYmxlZCEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRyb3Bkb3duT3B0aW9uTW91c2VFbnRlcihkcm9wZG93bk9wdGlvbiwgaSArIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uRHJvcGRvd25PcHRpb25Nb3VzZU1vdmUoZHJvcGRvd25PcHRpb24sIGkgKyBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJvbkVzY2FwZUtleVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJkcm9wZG93bklkICsgJy0nICsgZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2VsZWN0ZWQnIDogKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpICE9PSBncm91cE9wdGlvbi52YWx1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdyb3VwT3B0aW9uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIihfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKSA9PT0gZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdmFsdWVdPVwiZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cE9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYXJ0aWNsZV9kcm9wZG93bl9vcHRpb24gcHRsX2lucHV0X3RleHRfc2l6ZSBlbnRfcjJsX3R4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Z3JvdXBPcHRpb24ubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gU0lOR1VMQVIgT1BUSU9OIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uR3JvdXBPcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09ICdvcHRpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gI2Ryb3Bkb3duT3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRHJvcGRvd25PcHRpb25TZWxlY3Qob3B0aW9uLnZhbHVlLCBvcHRpb24uZGlzYWJsZWQhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Ecm9wZG93bk9wdGlvbk1vdXNlRW50ZXIoZHJvcGRvd25PcHRpb24sIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uRHJvcGRvd25PcHRpb25Nb3VzZU1vdmUoZHJvcGRvd25PcHRpb24sIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImRyb3Bkb3duSWQgKyAnLScgKyBvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Vuc2VsZWN0ZWQnIDogKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpICE9PSBvcHRpb24udmFsdWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYykgPT09IG9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS12YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljbGVfZHJvcGRvd25fb3B0aW9uIHB0bF9pbnB1dF90ZXh0X3NpemUgZW50X3IybF90eHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy1jb250ZW50IHNlbGVjdD1cInRlbXBsYXRlXCI+PC9uZy1jb250ZW50PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbW9iaWxlPlxyXG4gIDxzZWxlY3RcclxuICAgIGNsYXNzPVwiYWNjZXNzIHB0bF9pbnB1dCBwdGxfaW5wdXRfaGVpZ2h0IHB0bF9pbnB1dF90ZXh0X3NpemUgcHRsX2lucHV0X3BhZGRpbmcgcHRsX2lucHV0X2JnX2NvbG9yIHB0bF9icmRyX2NvbG9yIHB0bF9icmRyX3NpemUgcHRsX2JyZHJfcmFkaXVzXCJcclxuICAgIFtpZF09XCJkcm9wZG93bklkXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlTW9iaWxlKCRldmVudClcIlxyXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9vcHRpb25zIHwgYXN5bmMgYXMgb3B0aW9uc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gJ2dyb3VwJ1wiPlxyXG4gICAgICAgICAgPG9wdGdyb3VwIGNsYXNzPVwiaW5wdXRfYmdfY29sb3IgbWluX2g1MCBwYWRfMTBcIiBbbGFiZWxdPVwib3B0aW9uLmdyb3VwTGFiZWxcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXBPcHRpb24gb2Ygb3B0aW9uLm9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXBPcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dF9iZ19jb2xvciBtaW5faDUwIHBhZF8xMFwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7Z3JvdXBPcHRpb24ubGFiZWx9fVxyXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvb3B0Z3JvdXA+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbi50eXBlID09PSAnb3B0aW9uJ1wiPlxyXG4gICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dF9iZ19jb2xvciBtaW5faDUwIHBhZF8xMFwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7e29wdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L3NlbGVjdD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
|