@energycap/components 0.39.17-ECAP-23124-menu-item-divider-improvements.20240523-1631 → 0.39.17-ECAP-25250-eclipse-formula-builder-proto.20240529-1651
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.
- package/energycap-components.min.css +1 -1
- package/esm2020/lib/controls/combobox/combobox.component.mjs +40 -38
- package/esm2020/lib/controls/form-control/form-control.component.mjs +2 -2
- package/esm2020/lib/controls/menu/menu.component.mjs +40 -68
- package/fesm2015/energycap-components.mjs +985 -1011
- package/fesm2015/energycap-components.mjs.map +1 -1
- package/fesm2020/energycap-components.mjs +988 -1013
- package/fesm2020/energycap-components.mjs.map +1 -1
- package/lib/controls/combobox/combobox.component.d.ts +0 -5
- package/lib/controls/menu/menu.component.d.ts +11 -26
- package/package.json +1 -1
- package/src/styles/_global-variables.scss +1 -1
@@ -38,10 +38,10 @@ export class FormControlComponent {
|
|
38
38
|
}
|
39
39
|
}
|
40
40
|
FormControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FormControlComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
41
|
-
FormControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FormControlComponent, selector: "ec-form-control", inputs: { id: "id", icon: "icon", actionIcon: "actionIcon", showClear: "showClear", pending: "pending", required: "required", readonly: "readonly" }, outputs: { actionClicked: "actionClicked" }, host: { listeners: { "click": "onClick()" }, properties: { "class.is-pending": "this.pending", "class.is-required": "this.required", "class.is-readonly": "this.readonly", "class.is-empty": "this.empty", "class.is-invalid": "this.invalid", "class.is-disabled": "this.disabled" } }, queries: [{ propertyName: "formModel", first: true, predicate: FormControlDirective, descendants: true }], ngImport: i0, template: "<ng-content></ng-content>\r\n<i id=\"{{id + '_icon'}}\" class=\"ec-form-control-icon ec-icon {{icon}}\"></i>\r\n<i id=\"{{id + '_loading'}}\" class=\"ec-form-control-icon ec-icon icon-loading\"></i>\r\n<i id=\"{{id + '_required'}}\" class=\"ec-form-control-icon ec-icon icon-required\"></i>\r\n<i id=\"{{id + '_invalid'}}\" class=\"ec-form-control-icon ec-icon icon-invalid\"></i>\r\n<i id=\"{{id + '_clear'}}\" *ngIf=\"showClear\" class=\"ec-form-control-clear ec-icon icon-cancel\" (click)=\"clear()\"></i>\r\n<i id=\"{{id + '_action'}}\" *ngIf=\"actionIcon\" class=\"ec-form-control-action ec-icon {{actionIcon}}\" (click)=\"actionClicked.emit()\"></i>\r\n<div class=\"ec-focus-ring\"></div>", styles: ["ec-form-control{background-color:var(--ec-form-control-background-color);background-clip:padding-box;border:1px solid var(--ec-form-control-border-color);border-radius:var(--ec-border-radius);padding:0 .5rem;position:relative;color:var(--ec-form-control-color);display:flex;font-size:var(--ec-form-control-font-size);min-height:2rem;width:100%}ec-form-control>input,ec-form-control>select,ec-form-control>textarea{color:inherit;flex:1 1;min-width:0;border:0;background-color:transparent;order:2}ec-form-control>input::selection,ec-form-control>select::selection,ec-form-control>textarea::selection{background-color:var(--ec-form-control-background-color-selection);color:var(--ec-form-control-color-selection)}ec-form-control>input::-webkit-input-placeholder,ec-form-control>select::-webkit-input-placeholder,ec-form-control>textarea::-webkit-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input::-moz-placeholder,ec-form-control>select::-moz-placeholder,ec-form-control>textarea::-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:-ms-input-placeholder,ec-form-control>select:-ms-input-placeholder,ec-form-control>textarea:-ms-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input:-moz-placeholder,ec-form-control>select:-moz-placeholder,ec-form-control>textarea:-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:focus,ec-form-control>select:focus,ec-form-control>textarea:focus{outline:none}ec-form-control>input:focus~.ec-focus-ring,ec-form-control>select:focus~.ec-focus-ring,ec-form-control>textarea:focus~.ec-focus-ring{display:block}ec-form-control>input,ec-form-control>textarea,ec-form-control>select,ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{padding:calc((1.875rem - (var(--ec-font-size-body) * 1.25)) / 2) 0;line-height:1.25;font-size:inherit}ec-form-control>textarea{resize:none;padding:.3125rem 0}ec-form-control .ec-form-control-icon{margin-top:.4375rem;margin-right:.25rem;order:1}ec-form-control .ec-form-control-icon:not([class*=icon-]){display:none}ec-form-control .icon-required,ec-form-control .icon-invalid{color:var(--ec-form-control-border-color-invalid)}ec-form-control .ec-form-control-clear,ec-form-control .ec-form-control-action{cursor:pointer;flex:none;height:1.875rem;width:2rem;order:3}ec-form-control .ec-form-control-clear:last-of-type,ec-form-control .ec-form-control-action:last-of-type{margin-right:-.5rem}ec-form-control .ec-form-control-clear:hover,ec-form-control .ec-form-control-action:hover{background-color:var(--ec-background-color-hover)}ec-form-control .ec-form-control-clear{width:1.5rem}ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{color:var(--ec-color-secondary-dark);flex:none;cursor:default}ec-form-control .ec-form-control-prefix{margin-right:.125rem;order:2}ec-form-control .ec-form-control-suffix{margin-left:.125rem;order:3}ec-form-control .ec-focus-ring{position:absolute;inset:-1px;border:.125rem solid var(--ec-form-control-border-color-focus);pointer-events:none;display:none;border-radius:var(--ec-form-control-border-radius);z-index:1}ec-form-control.is-pending .icon-invalid,ec-form-control.is-pending .icon-required{display:none}ec-form-control.is-invalid{border-color:var(--ec-form-control-border-color-invalid);background-color:var(--ec-form-control-background-color-invalid)}ec-form-control.is-invalid .icon-required{display:none}ec-form-control.is-empty .ec-form-control-clear{display:none}ec-form-control.is-required.is-empty .ec-form-control-icon:first-of-type{display:none}ec-form-control:not(.is-pending) .icon-loading{display:none}ec-form-control:not(.is-required) .icon-required,ec-form-control:not(.is-empty) .icon-required{display:none}ec-form-control:not(.is-invalid) .icon-invalid{display:none}ec-form-control.is-readonly,ec-form-control.is-disabled{background-color:var(--ec-form-control-background-color-disabled)}ec-form-control.is-readonly .icon-loading,ec-form-control.is-readonly .icon-invalid,ec-form-control.is-readonly .icon-required,ec-form-control.is-readonly .ec-form-control-clear,ec-form-control.is-disabled .icon-loading,ec-form-control.is-disabled .icon-invalid,ec-form-control.is-disabled .icon-required,ec-form-control.is-disabled .ec-form-control-clear{display:none}ec-form-control.is-readonly{border-color:var(--ec-form-control-border-color-readonly);color:var(--ec-form-control-color-readonly)}ec-form-control.is-readonly .ec-form-control-action{display:none}ec-form-control.is-disabled:not(.is-readonly){color:var(--ec-form-control-color-disabled);opacity:.6}ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-prefix,ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-suffix{color:inherit}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None });
|
41
|
+
FormControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FormControlComponent, selector: "ec-form-control", inputs: { id: "id", icon: "icon", actionIcon: "actionIcon", showClear: "showClear", pending: "pending", required: "required", readonly: "readonly" }, outputs: { actionClicked: "actionClicked" }, host: { listeners: { "click": "onClick()" }, properties: { "class.is-pending": "this.pending", "class.is-required": "this.required", "class.is-readonly": "this.readonly", "class.is-empty": "this.empty", "class.is-invalid": "this.invalid", "class.is-disabled": "this.disabled" } }, queries: [{ propertyName: "formModel", first: true, predicate: FormControlDirective, descendants: true }], ngImport: i0, template: "<ng-content></ng-content>\r\n<i id=\"{{id + '_icon'}}\" class=\"ec-form-control-icon ec-icon {{icon}}\"></i>\r\n<i id=\"{{id + '_loading'}}\" class=\"ec-form-control-icon ec-icon icon-loading\"></i>\r\n<i id=\"{{id + '_required'}}\" class=\"ec-form-control-icon ec-icon icon-required\"></i>\r\n<i id=\"{{id + '_invalid'}}\" class=\"ec-form-control-icon ec-icon icon-invalid\"></i>\r\n<i id=\"{{id + '_clear'}}\" *ngIf=\"showClear\" class=\"ec-form-control-clear ec-icon icon-cancel\" (click)=\"clear()\"></i>\r\n<i id=\"{{id + '_action'}}\" *ngIf=\"actionIcon\" class=\"ec-form-control-action ec-icon {{actionIcon}}\" (click)=\"actionClicked.emit()\"></i>\r\n<div class=\"ec-focus-ring\"></div>", styles: ["ec-form-control{background-color:var(--ec-form-control-background-color);background-clip:padding-box;border:1px solid var(--ec-form-control-border-color);border-radius:var(--ec-border-radius);padding:0 .5rem;position:relative;color:var(--ec-form-control-color);display:flex;font-size:var(--ec-form-control-font-size);min-height:2rem;width:100%}ec-form-control>input,ec-form-control>select,ec-form-control>textarea,ec-form-control>div[contenteditable=true]{color:inherit;flex:1 1;min-width:0;border:0;background-color:transparent;order:2}ec-form-control>input::selection,ec-form-control>select::selection,ec-form-control>textarea::selection,ec-form-control>div[contenteditable=true]::selection{background-color:var(--ec-form-control-background-color-selection);color:var(--ec-form-control-color-selection)}ec-form-control>input::-webkit-input-placeholder,ec-form-control>select::-webkit-input-placeholder,ec-form-control>textarea::-webkit-input-placeholder,ec-form-control>div[contenteditable=true]::-webkit-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input::-moz-placeholder,ec-form-control>select::-moz-placeholder,ec-form-control>textarea::-moz-placeholder,ec-form-control>div[contenteditable=true]::-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:-ms-input-placeholder,ec-form-control>select:-ms-input-placeholder,ec-form-control>textarea:-ms-input-placeholder,ec-form-control>div[contenteditable=true]:-ms-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input:-moz-placeholder,ec-form-control>select:-moz-placeholder,ec-form-control>textarea:-moz-placeholder,ec-form-control>div[contenteditable=true]:-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:focus,ec-form-control>select:focus,ec-form-control>textarea:focus,ec-form-control>div[contenteditable=true]:focus{outline:none}ec-form-control>input:focus~.ec-focus-ring,ec-form-control>select:focus~.ec-focus-ring,ec-form-control>textarea:focus~.ec-focus-ring,ec-form-control>div[contenteditable=true]:focus~.ec-focus-ring{display:block}ec-form-control>input,ec-form-control>textarea,ec-form-control>select,ec-form-control>div[contenteditable=true],ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{padding:calc((1.875rem - (var(--ec-font-size-body) * 1.25)) / 2) 0;line-height:1.25;font-size:inherit}ec-form-control>textarea{resize:none;padding:.3125rem 0}ec-form-control .ec-form-control-icon{margin-top:.4375rem;margin-right:.25rem;order:1}ec-form-control .ec-form-control-icon:not([class*=icon-]){display:none}ec-form-control .icon-required,ec-form-control .icon-invalid{color:var(--ec-form-control-border-color-invalid)}ec-form-control .ec-form-control-clear,ec-form-control .ec-form-control-action{cursor:pointer;flex:none;height:1.875rem;width:2rem;order:3}ec-form-control .ec-form-control-clear:last-of-type,ec-form-control .ec-form-control-action:last-of-type{margin-right:-.5rem}ec-form-control .ec-form-control-clear:hover,ec-form-control .ec-form-control-action:hover{background-color:var(--ec-background-color-hover)}ec-form-control .ec-form-control-clear{width:1.5rem}ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{color:var(--ec-color-secondary-dark);flex:none;cursor:default}ec-form-control .ec-form-control-prefix{margin-right:.125rem;order:2}ec-form-control .ec-form-control-suffix{margin-left:.125rem;order:3}ec-form-control .ec-focus-ring{position:absolute;inset:-1px;border:.125rem solid var(--ec-form-control-border-color-focus);pointer-events:none;display:none;border-radius:var(--ec-form-control-border-radius);z-index:1}ec-form-control.is-pending .icon-invalid,ec-form-control.is-pending .icon-required{display:none}ec-form-control.is-invalid{border-color:var(--ec-form-control-border-color-invalid);background-color:var(--ec-form-control-background-color-invalid)}ec-form-control.is-invalid .icon-required{display:none}ec-form-control.is-empty .ec-form-control-clear{display:none}ec-form-control.is-required.is-empty .ec-form-control-icon:first-of-type{display:none}ec-form-control:not(.is-pending) .icon-loading{display:none}ec-form-control:not(.is-required) .icon-required,ec-form-control:not(.is-empty) .icon-required{display:none}ec-form-control:not(.is-invalid) .icon-invalid{display:none}ec-form-control.is-readonly,ec-form-control.is-disabled{background-color:var(--ec-form-control-background-color-disabled)}ec-form-control.is-readonly .icon-loading,ec-form-control.is-readonly .icon-invalid,ec-form-control.is-readonly .icon-required,ec-form-control.is-readonly .ec-form-control-clear,ec-form-control.is-disabled .icon-loading,ec-form-control.is-disabled .icon-invalid,ec-form-control.is-disabled .icon-required,ec-form-control.is-disabled .ec-form-control-clear{display:none}ec-form-control.is-readonly{border-color:var(--ec-form-control-border-color-readonly);color:var(--ec-form-control-color-readonly)}ec-form-control.is-readonly .ec-form-control-action{display:none}ec-form-control.is-disabled:not(.is-readonly){color:var(--ec-form-control-color-disabled);opacity:.6}ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-prefix,ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-suffix{color:inherit}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None });
|
42
42
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FormControlComponent, decorators: [{
|
43
43
|
type: Component,
|
44
|
-
args: [{ selector: 'ec-form-control', encapsulation: ViewEncapsulation.None, template: "<ng-content></ng-content>\r\n<i id=\"{{id + '_icon'}}\" class=\"ec-form-control-icon ec-icon {{icon}}\"></i>\r\n<i id=\"{{id + '_loading'}}\" class=\"ec-form-control-icon ec-icon icon-loading\"></i>\r\n<i id=\"{{id + '_required'}}\" class=\"ec-form-control-icon ec-icon icon-required\"></i>\r\n<i id=\"{{id + '_invalid'}}\" class=\"ec-form-control-icon ec-icon icon-invalid\"></i>\r\n<i id=\"{{id + '_clear'}}\" *ngIf=\"showClear\" class=\"ec-form-control-clear ec-icon icon-cancel\" (click)=\"clear()\"></i>\r\n<i id=\"{{id + '_action'}}\" *ngIf=\"actionIcon\" class=\"ec-form-control-action ec-icon {{actionIcon}}\" (click)=\"actionClicked.emit()\"></i>\r\n<div class=\"ec-focus-ring\"></div>", styles: ["ec-form-control{background-color:var(--ec-form-control-background-color);background-clip:padding-box;border:1px solid var(--ec-form-control-border-color);border-radius:var(--ec-border-radius);padding:0 .5rem;position:relative;color:var(--ec-form-control-color);display:flex;font-size:var(--ec-form-control-font-size);min-height:2rem;width:100%}ec-form-control>input,ec-form-control>select,ec-form-control>textarea{color:inherit;flex:1 1;min-width:0;border:0;background-color:transparent;order:2}ec-form-control>input::selection,ec-form-control>select::selection,ec-form-control>textarea::selection{background-color:var(--ec-form-control-background-color-selection);color:var(--ec-form-control-color-selection)}ec-form-control>input::-webkit-input-placeholder,ec-form-control>select::-webkit-input-placeholder,ec-form-control>textarea::-webkit-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input::-moz-placeholder,ec-form-control>select::-moz-placeholder,ec-form-control>textarea::-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:-ms-input-placeholder,ec-form-control>select:-ms-input-placeholder,ec-form-control>textarea:-ms-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input:-moz-placeholder,ec-form-control>select:-moz-placeholder,ec-form-control>textarea:-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:focus,ec-form-control>select:focus,ec-form-control>textarea:focus{outline:none}ec-form-control>input:focus~.ec-focus-ring,ec-form-control>select:focus~.ec-focus-ring,ec-form-control>textarea:focus~.ec-focus-ring{display:block}ec-form-control>input,ec-form-control>textarea,ec-form-control>select,ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{padding:calc((1.875rem - (var(--ec-font-size-body) * 1.25)) / 2) 0;line-height:1.25;font-size:inherit}ec-form-control>textarea{resize:none;padding:.3125rem 0}ec-form-control .ec-form-control-icon{margin-top:.4375rem;margin-right:.25rem;order:1}ec-form-control .ec-form-control-icon:not([class*=icon-]){display:none}ec-form-control .icon-required,ec-form-control .icon-invalid{color:var(--ec-form-control-border-color-invalid)}ec-form-control .ec-form-control-clear,ec-form-control .ec-form-control-action{cursor:pointer;flex:none;height:1.875rem;width:2rem;order:3}ec-form-control .ec-form-control-clear:last-of-type,ec-form-control .ec-form-control-action:last-of-type{margin-right:-.5rem}ec-form-control .ec-form-control-clear:hover,ec-form-control .ec-form-control-action:hover{background-color:var(--ec-background-color-hover)}ec-form-control .ec-form-control-clear{width:1.5rem}ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{color:var(--ec-color-secondary-dark);flex:none;cursor:default}ec-form-control .ec-form-control-prefix{margin-right:.125rem;order:2}ec-form-control .ec-form-control-suffix{margin-left:.125rem;order:3}ec-form-control .ec-focus-ring{position:absolute;inset:-1px;border:.125rem solid var(--ec-form-control-border-color-focus);pointer-events:none;display:none;border-radius:var(--ec-form-control-border-radius);z-index:1}ec-form-control.is-pending .icon-invalid,ec-form-control.is-pending .icon-required{display:none}ec-form-control.is-invalid{border-color:var(--ec-form-control-border-color-invalid);background-color:var(--ec-form-control-background-color-invalid)}ec-form-control.is-invalid .icon-required{display:none}ec-form-control.is-empty .ec-form-control-clear{display:none}ec-form-control.is-required.is-empty .ec-form-control-icon:first-of-type{display:none}ec-form-control:not(.is-pending) .icon-loading{display:none}ec-form-control:not(.is-required) .icon-required,ec-form-control:not(.is-empty) .icon-required{display:none}ec-form-control:not(.is-invalid) .icon-invalid{display:none}ec-form-control.is-readonly,ec-form-control.is-disabled{background-color:var(--ec-form-control-background-color-disabled)}ec-form-control.is-readonly .icon-loading,ec-form-control.is-readonly .icon-invalid,ec-form-control.is-readonly .icon-required,ec-form-control.is-readonly .ec-form-control-clear,ec-form-control.is-disabled .icon-loading,ec-form-control.is-disabled .icon-invalid,ec-form-control.is-disabled .icon-required,ec-form-control.is-disabled .ec-form-control-clear{display:none}ec-form-control.is-readonly{border-color:var(--ec-form-control-border-color-readonly);color:var(--ec-form-control-color-readonly)}ec-form-control.is-readonly .ec-form-control-action{display:none}ec-form-control.is-disabled:not(.is-readonly){color:var(--ec-form-control-color-disabled);opacity:.6}ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-prefix,ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-suffix{color:inherit}\n"] }]
|
44
|
+
args: [{ selector: 'ec-form-control', encapsulation: ViewEncapsulation.None, template: "<ng-content></ng-content>\r\n<i id=\"{{id + '_icon'}}\" class=\"ec-form-control-icon ec-icon {{icon}}\"></i>\r\n<i id=\"{{id + '_loading'}}\" class=\"ec-form-control-icon ec-icon icon-loading\"></i>\r\n<i id=\"{{id + '_required'}}\" class=\"ec-form-control-icon ec-icon icon-required\"></i>\r\n<i id=\"{{id + '_invalid'}}\" class=\"ec-form-control-icon ec-icon icon-invalid\"></i>\r\n<i id=\"{{id + '_clear'}}\" *ngIf=\"showClear\" class=\"ec-form-control-clear ec-icon icon-cancel\" (click)=\"clear()\"></i>\r\n<i id=\"{{id + '_action'}}\" *ngIf=\"actionIcon\" class=\"ec-form-control-action ec-icon {{actionIcon}}\" (click)=\"actionClicked.emit()\"></i>\r\n<div class=\"ec-focus-ring\"></div>", styles: ["ec-form-control{background-color:var(--ec-form-control-background-color);background-clip:padding-box;border:1px solid var(--ec-form-control-border-color);border-radius:var(--ec-border-radius);padding:0 .5rem;position:relative;color:var(--ec-form-control-color);display:flex;font-size:var(--ec-form-control-font-size);min-height:2rem;width:100%}ec-form-control>input,ec-form-control>select,ec-form-control>textarea,ec-form-control>div[contenteditable=true]{color:inherit;flex:1 1;min-width:0;border:0;background-color:transparent;order:2}ec-form-control>input::selection,ec-form-control>select::selection,ec-form-control>textarea::selection,ec-form-control>div[contenteditable=true]::selection{background-color:var(--ec-form-control-background-color-selection);color:var(--ec-form-control-color-selection)}ec-form-control>input::-webkit-input-placeholder,ec-form-control>select::-webkit-input-placeholder,ec-form-control>textarea::-webkit-input-placeholder,ec-form-control>div[contenteditable=true]::-webkit-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input::-moz-placeholder,ec-form-control>select::-moz-placeholder,ec-form-control>textarea::-moz-placeholder,ec-form-control>div[contenteditable=true]::-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:-ms-input-placeholder,ec-form-control>select:-ms-input-placeholder,ec-form-control>textarea:-ms-input-placeholder,ec-form-control>div[contenteditable=true]:-ms-input-placeholder{color:var(--ec-form-control-color-placeholder)}ec-form-control>input:-moz-placeholder,ec-form-control>select:-moz-placeholder,ec-form-control>textarea:-moz-placeholder,ec-form-control>div[contenteditable=true]:-moz-placeholder{color:var(--ec-form-control-color-placeholder);opacity:1}ec-form-control>input:focus,ec-form-control>select:focus,ec-form-control>textarea:focus,ec-form-control>div[contenteditable=true]:focus{outline:none}ec-form-control>input:focus~.ec-focus-ring,ec-form-control>select:focus~.ec-focus-ring,ec-form-control>textarea:focus~.ec-focus-ring,ec-form-control>div[contenteditable=true]:focus~.ec-focus-ring{display:block}ec-form-control>input,ec-form-control>textarea,ec-form-control>select,ec-form-control>div[contenteditable=true],ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{padding:calc((1.875rem - (var(--ec-font-size-body) * 1.25)) / 2) 0;line-height:1.25;font-size:inherit}ec-form-control>textarea{resize:none;padding:.3125rem 0}ec-form-control .ec-form-control-icon{margin-top:.4375rem;margin-right:.25rem;order:1}ec-form-control .ec-form-control-icon:not([class*=icon-]){display:none}ec-form-control .icon-required,ec-form-control .icon-invalid{color:var(--ec-form-control-border-color-invalid)}ec-form-control .ec-form-control-clear,ec-form-control .ec-form-control-action{cursor:pointer;flex:none;height:1.875rem;width:2rem;order:3}ec-form-control .ec-form-control-clear:last-of-type,ec-form-control .ec-form-control-action:last-of-type{margin-right:-.5rem}ec-form-control .ec-form-control-clear:hover,ec-form-control .ec-form-control-action:hover{background-color:var(--ec-background-color-hover)}ec-form-control .ec-form-control-clear{width:1.5rem}ec-form-control .ec-form-control-prefix,ec-form-control .ec-form-control-suffix{color:var(--ec-color-secondary-dark);flex:none;cursor:default}ec-form-control .ec-form-control-prefix{margin-right:.125rem;order:2}ec-form-control .ec-form-control-suffix{margin-left:.125rem;order:3}ec-form-control .ec-focus-ring{position:absolute;inset:-1px;border:.125rem solid var(--ec-form-control-border-color-focus);pointer-events:none;display:none;border-radius:var(--ec-form-control-border-radius);z-index:1}ec-form-control.is-pending .icon-invalid,ec-form-control.is-pending .icon-required{display:none}ec-form-control.is-invalid{border-color:var(--ec-form-control-border-color-invalid);background-color:var(--ec-form-control-background-color-invalid)}ec-form-control.is-invalid .icon-required{display:none}ec-form-control.is-empty .ec-form-control-clear{display:none}ec-form-control.is-required.is-empty .ec-form-control-icon:first-of-type{display:none}ec-form-control:not(.is-pending) .icon-loading{display:none}ec-form-control:not(.is-required) .icon-required,ec-form-control:not(.is-empty) .icon-required{display:none}ec-form-control:not(.is-invalid) .icon-invalid{display:none}ec-form-control.is-readonly,ec-form-control.is-disabled{background-color:var(--ec-form-control-background-color-disabled)}ec-form-control.is-readonly .icon-loading,ec-form-control.is-readonly .icon-invalid,ec-form-control.is-readonly .icon-required,ec-form-control.is-readonly .ec-form-control-clear,ec-form-control.is-disabled .icon-loading,ec-form-control.is-disabled .icon-invalid,ec-form-control.is-disabled .icon-required,ec-form-control.is-disabled .ec-form-control-clear{display:none}ec-form-control.is-readonly{border-color:var(--ec-form-control-border-color-readonly);color:var(--ec-form-control-color-readonly)}ec-form-control.is-readonly .ec-form-control-action{display:none}ec-form-control.is-disabled:not(.is-readonly){color:var(--ec-form-control-color-disabled);opacity:.6}ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-prefix,ec-form-control.is-disabled:not(.is-readonly) .ec-form-control-suffix{color:inherit}\n"] }]
|
45
45
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { formModel: [{
|
46
46
|
type: ContentChild,
|
47
47
|
args: [FormControlDirective]
|
@@ -14,53 +14,6 @@ export const menuAnimationSpeed = 350;
|
|
14
14
|
* @export
|
15
15
|
*/
|
16
16
|
export class MenuComponent {
|
17
|
-
/**
|
18
|
-
* Helper function to return a flat list of all selectable items in the provided menu items. Filters out headings and divided-sections.
|
19
|
-
* This makes it much easier to keep track of currently highlighted items for keyboard navigation.
|
20
|
-
*/
|
21
|
-
static getSelectableItems(items) {
|
22
|
-
return items.reduce((selectableItems, item) => {
|
23
|
-
if (item.display !== 'heading' && item.display !== 'divided-section') {
|
24
|
-
selectableItems.push(item);
|
25
|
-
}
|
26
|
-
else if (item.items) {
|
27
|
-
selectableItems.push(...item.items.filter(childItem => childItem.display !== 'heading' && childItem.display !== 'divided-section'));
|
28
|
-
}
|
29
|
-
return selectableItems;
|
30
|
-
}, []);
|
31
|
-
}
|
32
|
-
/**
|
33
|
-
* Returns an ID for the provided item based on its index in the provided items array. This mimics the behavior of the MenuComponent's
|
34
|
-
* generated IDs for items that don't have provided IDs. This is used in MenuComponent and ComboboxComponent to scroll to specific items.
|
35
|
-
* NOTE: If the items array does not match what is displayed in the menu, this function will not return the correct ID.
|
36
|
-
*
|
37
|
-
* Returns null if the not found
|
38
|
-
* @param items The MenuItems array to search through.
|
39
|
-
* @param item The item to generate the ID for.
|
40
|
-
* @param menuComponentId Used to prefix the generated ID. This should be the ID of the menu component the item is present in.
|
41
|
-
* @memberof MenuComponent
|
42
|
-
*/
|
43
|
-
static getIndexedItemId(items, item, menuComponentId) {
|
44
|
-
if (item) {
|
45
|
-
for (let i = 0; i < items.length; i++) {
|
46
|
-
const itemInList = items[i];
|
47
|
-
if (itemInList.label === item.label) {
|
48
|
-
return `${menuComponentId}_item${i}`;
|
49
|
-
}
|
50
|
-
// If the item is a heading or divided section, check its children
|
51
|
-
if (itemInList.items && (itemInList.display === 'heading' || itemInList.display === 'divided-section')) {
|
52
|
-
for (let j = 0; j < itemInList.items.length; j++) {
|
53
|
-
const childItem = itemInList.items[j];
|
54
|
-
// Fall back to checking only the label if the item doesn't have an id
|
55
|
-
if (childItem.label === item.label) {
|
56
|
-
return `${menuComponentId}_item${i}-${j}`;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
}
|
60
|
-
}
|
61
|
-
}
|
62
|
-
return null;
|
63
|
-
}
|
64
17
|
constructor(el, renderer, windowService, scrollService) {
|
65
18
|
this.el = el;
|
66
19
|
this.renderer = renderer;
|
@@ -138,15 +91,6 @@ export class MenuComponent {
|
|
138
91
|
* This allows us to prevent double-calls to selectItem() with the same input.
|
139
92
|
*/
|
140
93
|
this.lastSelected = null;
|
141
|
-
/**
|
142
|
-
* Flattened array of all selectable items in the menu. Makes it easier to keep track of the currently highlighted item for keyboard navigation.
|
143
|
-
*/
|
144
|
-
this.selectableItems = [];
|
145
|
-
}
|
146
|
-
ngOnChanges(changes) {
|
147
|
-
if (changes.items && this.items) {
|
148
|
-
this.selectableItems = MenuComponent.getSelectableItems(this.items);
|
149
|
-
}
|
150
94
|
}
|
151
95
|
/**
|
152
96
|
* Sets & displays the interalized template based on
|
@@ -180,8 +124,8 @@ export class MenuComponent {
|
|
180
124
|
this.attrId = this.id;
|
181
125
|
}
|
182
126
|
this.setItemIds();
|
183
|
-
if (this.highlightedItem && this.
|
184
|
-
this.highlightedItemIndex = this.
|
127
|
+
if (this.highlightedItem && this.items.length) {
|
128
|
+
this.highlightedItemIndex = this.items.findIndex(item => { return this.highlightedItem === item; });
|
185
129
|
}
|
186
130
|
this.addKeydownListener();
|
187
131
|
}
|
@@ -208,7 +152,7 @@ export class MenuComponent {
|
|
208
152
|
if (item.onClick) {
|
209
153
|
item.onClick(item, false);
|
210
154
|
}
|
211
|
-
if (item.items
|
155
|
+
if (item.items) {
|
212
156
|
this.toggleChildMenu(true);
|
213
157
|
}
|
214
158
|
else {
|
@@ -255,7 +199,7 @@ export class MenuComponent {
|
|
255
199
|
* @param item The selected item
|
256
200
|
*/
|
257
201
|
onSelection(item) {
|
258
|
-
if (item.display !== 'heading'
|
202
|
+
if (item.display !== 'heading') {
|
259
203
|
this.selectedChanged.emit(item);
|
260
204
|
}
|
261
205
|
}
|
@@ -365,12 +309,20 @@ export class MenuComponent {
|
|
365
309
|
case 'Up':
|
366
310
|
if (this.highlightedItemIndex > -1) {
|
367
311
|
this.highlightedItemIndex--;
|
312
|
+
// Skip any in-menu heading items
|
313
|
+
if (this.highlightedItemIndex > -1 && this.items[this.highlightedItemIndex].display === 'heading') {
|
314
|
+
this.highlightedItemIndex--;
|
315
|
+
}
|
368
316
|
}
|
369
317
|
break;
|
370
318
|
case 'ArrowDown':
|
371
319
|
case 'Down':
|
372
|
-
if (this.highlightedItemIndex < this.
|
320
|
+
if (this.highlightedItemIndex < this.items.length - 1) {
|
373
321
|
this.highlightedItemIndex++;
|
322
|
+
// Skip any in-menu heading items
|
323
|
+
if (this.highlightedItemIndex < this.items.length - 1 && this.items[this.highlightedItemIndex].display === 'heading') {
|
324
|
+
this.highlightedItemIndex++;
|
325
|
+
}
|
374
326
|
}
|
375
327
|
break;
|
376
328
|
default:
|
@@ -378,7 +330,7 @@ export class MenuComponent {
|
|
378
330
|
}
|
379
331
|
if (this.highlightedItemIndex > -1) {
|
380
332
|
// Store the item at the current highlight index
|
381
|
-
this.highlightedItem = this.
|
333
|
+
this.highlightedItem = this.items[this.highlightedItemIndex];
|
382
334
|
}
|
383
335
|
else {
|
384
336
|
this.highlightedItem = null;
|
@@ -393,15 +345,35 @@ export class MenuComponent {
|
|
393
345
|
* @memberof MenuComponent
|
394
346
|
*/
|
395
347
|
scrollMenu(item) {
|
396
|
-
if (this.items.length > 0
|
348
|
+
if (this.items.length > 0) {
|
397
349
|
item = item ? item : this.items[0];
|
398
|
-
let
|
399
|
-
|
350
|
+
let itemIndex = this.findItemIndex(item);
|
351
|
+
if (this.id) {
|
352
|
+
let itemSelector = item.id ? `#${item.id}` : `#${this.id}_item${itemIndex}`;
|
353
|
+
this.scrollService.scrollItemCentered(`#${this.id}_list`, itemSelector);
|
354
|
+
}
|
400
355
|
}
|
401
356
|
}
|
402
357
|
scrollToHighlightedItem() {
|
403
358
|
this.scrollMenu(this.highlightedItem);
|
404
359
|
}
|
360
|
+
/**
|
361
|
+
* Find a given item's index in the filtered items array.
|
362
|
+
*
|
363
|
+
* Returns -1 if not found
|
364
|
+
* @param itemToFind The matching item to find in the items array.
|
365
|
+
* @memberof MenuComponent
|
366
|
+
*/
|
367
|
+
findItemIndex(itemToFind) {
|
368
|
+
if (itemToFind) {
|
369
|
+
return this.items.findIndex(item => {
|
370
|
+
return item.label === itemToFind.label;
|
371
|
+
});
|
372
|
+
}
|
373
|
+
else {
|
374
|
+
return -1;
|
375
|
+
}
|
376
|
+
}
|
405
377
|
addKeydownListener() {
|
406
378
|
// Only attempt to add the listener if keyboard nav is enabled
|
407
379
|
if (this.enableKeyNav) {
|
@@ -422,10 +394,10 @@ export class MenuComponent {
|
|
422
394
|
}
|
423
395
|
}
|
424
396
|
MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.WindowService }, { token: i2.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
|
425
|
-
MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, selector: "ec-menu", inputs: { id: "id", items: "items", selected: "selected", parent: "parent", templateType: "templateType", customMenuTemplate: "customMenuTemplate", title: "title", showNoItems: "showNoItems", noDataText: "noDataText", enableKeyNav: "enableKeyNav", highlightedItem: "highlightedItem", maintainSelectedItem: "maintainSelectedItem", truncateItems: "truncateItems", preserveIconSpace: "preserveIconSpace", dropdownToggleButton: "dropdownToggleButton" }, outputs: { selectedChanged: "selectedChanged", menuClosed: "menuClosed" }, host: { properties: { "attr.id": "this.attrId" } }, viewQueries: [{ propertyName: "labelTemplate", first: true, predicate: ["label"], descendants: true, static: true }, { propertyName: "iconAndLabelTemplate", first: true, predicate: ["iconAndLabel"], descendants: true, static: true }, { propertyName: "checkAndLabelTemplate", first: true, predicate: ["checkAndLabel"], descendants: true, static: true }, { propertyName: "iconLabelCaptionTemplate", first: true, predicate: ["iconLabelCaption"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <ng-container *ngFor=\"let item of items; index as i\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\r\n\r\n <!-- Show child items under parent item if the item is a heading or divided-section -->\r\n <ng-container *ngIf=\"item.items?.length && (item.display === 'heading' || item.display === 'divided-section')\">\r\n <ng-container *ngFor=\"let childItem of item.items; index as j; first as isFirst; last as isLast\"\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: childItem, index: i + '-' + j, isDividedSectionChild: item.display === 'divided-section', isFirst: isFirst, isLast: isLast}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items && selected?.display !== 'heading' && selected?.display !== 'divided-section'\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<ng-template #itemTemplate\r\n let-item\r\n let-i=\"index\"\r\n let-isDividedSectionChild=\"isDividedSectionChild\"\r\n let-isFirst=\"isFirst\"\r\n let-isLast=\"isLast\">\r\n <li *ngIf=\"!(item.hideIfNoItems && !item.items?.length) && item.display !== 'divided-section'\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [class.divider-top]=\"item.display === 'divider-top' || (isDividedSectionChild && isFirst)\"\r\n [class.divider]=\"item.display === 'divider' || (isDividedSectionChild && isLast)\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n</ng-template>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider:not(:last-child){border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.divider-top:not(:first-child):not(.divider + .divider-top){border-top:1px solid var(--ec-border-color);padding-top:.25rem;margin-top:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.NavItemActiveDirective, selector: "[ecNavItemActive]", inputs: ["ecNavItemActive", "ecNavItemActiveExactMatch", "ecNavItemActiveQueryParams", "ecNavItemActiveUrl"], outputs: ["routerLinkActivated"] }, { kind: "component", type: MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
|
397
|
+
MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, selector: "ec-menu", inputs: { id: "id", items: "items", selected: "selected", parent: "parent", templateType: "templateType", customMenuTemplate: "customMenuTemplate", title: "title", showNoItems: "showNoItems", noDataText: "noDataText", enableKeyNav: "enableKeyNav", highlightedItem: "highlightedItem", maintainSelectedItem: "maintainSelectedItem", truncateItems: "truncateItems", preserveIconSpace: "preserveIconSpace", dropdownToggleButton: "dropdownToggleButton" }, outputs: { selectedChanged: "selectedChanged", menuClosed: "menuClosed" }, host: { properties: { "attr.id": "this.attrId" } }, viewQueries: [{ propertyName: "labelTemplate", first: true, predicate: ["label"], descendants: true, static: true }, { propertyName: "iconAndLabelTemplate", first: true, predicate: ["iconAndLabel"], descendants: true, static: true }, { propertyName: "checkAndLabelTemplate", first: true, predicate: ["checkAndLabel"], descendants: true, static: true }, { propertyName: "iconLabelCaptionTemplate", first: true, predicate: ["iconLabelCaption"], descendants: true, static: true }], ngImport: i0, template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <li *ngFor=\"let item of items; index as i\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider{border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.NavItemActiveDirective, selector: "[ecNavItemActive]", inputs: ["ecNavItemActive", "ecNavItemActiveExactMatch", "ecNavItemActiveQueryParams", "ecNavItemActiveUrl"], outputs: ["routerLinkActivated"] }, { kind: "component", type: MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
|
426
398
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, decorators: [{
|
427
399
|
type: Component,
|
428
|
-
args: [{ selector: 'ec-menu', template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <ng-container *ngFor=\"let item of items; index as i\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\r\n\r\n <!-- Show child items under parent item if the item is a heading or divided-section -->\r\n <ng-container *ngIf=\"item.items?.length && (item.display === 'heading' || item.display === 'divided-section')\">\r\n <ng-container *ngFor=\"let childItem of item.items; index as j; first as isFirst; last as isLast\"\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: childItem, index: i + '-' + j, isDividedSectionChild: item.display === 'divided-section', isFirst: isFirst, isLast: isLast}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items && selected?.display !== 'heading' && selected?.display !== 'divided-section'\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<ng-template #itemTemplate\r\n let-item\r\n let-i=\"index\"\r\n let-isDividedSectionChild=\"isDividedSectionChild\"\r\n let-isFirst=\"isFirst\"\r\n let-isLast=\"isLast\">\r\n <li *ngIf=\"!(item.hideIfNoItems && !item.items?.length) && item.display !== 'divided-section'\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [class.divider-top]=\"item.display === 'divider-top' || (isDividedSectionChild && isFirst)\"\r\n [class.divider]=\"item.display === 'divider' || (isDividedSectionChild && isLast)\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n</ng-template>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider:not(:last-child){border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.divider-top:not(:first-child):not(.divider + .divider-top){border-top:1px solid var(--ec-border-color);padding-top:.25rem;margin-top:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"] }]
|
400
|
+
args: [{ selector: 'ec-menu', template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <li *ngFor=\"let item of items; index as i\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider{border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"] }]
|
429
401
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.WindowService }, { type: i2.ScrollService }]; }, propDecorators: { id: [{
|
430
402
|
type: Input
|
431
403
|
}], attrId: [{
|
@@ -476,4 +448,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
476
448
|
type: ViewChild,
|
477
449
|
args: ['iconLabelCaption', { static: true }]
|
478
450
|
}] } });
|
479
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBeUMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQTZCekwsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUV0Qzs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLGFBQWE7SUFnTHRCOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFpQjtRQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGlCQUFpQixFQUFFO2dCQUNsRSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDbkIsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7YUFDdkk7WUFDRCxPQUFPLGVBQWUsQ0FBQztRQUMzQixDQUFDLEVBQWMsRUFB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QU1VLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFLVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBT1csZUFBZTtzQkFBL0IsTUFBTTtnQkFPVSxVQUFVO3NCQUExQixNQUFNO2dCQW1CdUMsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1pQixvQkFBb0I7c0JBQXhFLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNVyxxQkFBcUI7c0JBQTFFLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLYSx3QkFBd0I7c0JBQWhGLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51VGVtcGxhdGVUeXBlID0gXCJsYWJlbFwiIHwgXCJpY29uQW5kTGFiZWxcIiB8IFwiY2hlY2tBbmRMYWJlbFwiIHwgXCJpY29uTGFiZWxDYXB0aW9uXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51SG9zdEVsZW1lbnRDbGFzc2VzID0gJ2JnLXRyYW5zcGFyZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW08VFZhbHVlID0gYW55LCBTSXRlbXMgPSBhbnk+IGV4dGVuZHMgTmF2SXRlbSB7XHJcbiAgICAvLyBMYWJlbCBpcyBvcHRpb25hbCBpbiBOYXZJdGVtIGJ1dCB3YXMgbm90IGluIE1lbnVJdGVtLFxyXG4gICAgLy8gb3ZlcnJpZGluZyB0byBiZSByZXF1aXJlZFxyXG4gICAgbGFiZWw6IHN0cmluZyxcclxuICAgIGNhcHRpb24/OiBzdHJpbmcsXHJcbiAgICBpdGVtcz86IE1lbnVJdGVtPFNJdGVtcz5bXSxcclxuICAgIGNoZWNrZWQ/OiBib29sZWFuLFxyXG4gICAgZGlzcGxheT86ICdkZWZhdWx0JyB8ICdoZWFkaW5nJyB8ICdkaXZpZGVyJyB8ICdkaXZpZGVkLXNlY3Rpb24nLFxyXG4gICAgdmFsdWU/OiBUVmFsdWUsXHJcbiAgICBjbGFzc0xpc3Q/OiBzdHJpbmcsXHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW4sXHJcbiAgICBoaWRkZW4/OiBib29sZWFuLFxyXG4gICAgcmVhZG9ubHk/OiBib29sZWFuLFxyXG4gICAgdGFyZ2V0PzogTGlua1RhcmdldCxcclxuICAgIGV4dGVybmFsTGluaz86IGJvb2xlYW4sXHJcbiAgICAvKiogT3B0aW9uYWwgdGV4dCB0byBkaXNwbGF5IGluLXBsYWNlIG9mIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gdGhlIE1lbnVJdGVtIGlzIHNlbGVjdGVkLiAqL1xyXG4gICAgc2VsZWN0ZWRMYWJlbD86IHN0cmluZyxcclxuICAgIGhpZGVJZk5vSXRlbXM/OiBib29sZWFuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbWVudUFuaW1hdGlvblNwZWVkID0gMzUwO1xyXG5cclxuLyoqXHJcbiAqIFByaW1pdGl2ZSBNZW51IGNvbXBvbmVudCB0aGF0IGVuY2Fwc3VsYXRlcyBrbm93biB0ZW1wbGF0ZXNcclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW1lbnUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIElucHV0IGZvciB0aGUgbWVudSdzIHRlbXBsYXRlIGlkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZD86IHN0cmluZztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBib3VuZCB0byB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpIHB1YmxpYyBhdHRySWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXkgb2YgaXRlbXMgdG8gZGlzcGxheVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFNlbGVjdGVkIGl0ZW07IGFubm90YXRlcyB0aGUgaXRlbVxyXG4gICAgICogIHdoZW4gZGlzcGxheWVkIHdpdGggJ3NlbGVjdGVkJyBjbGFzc1xyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGFyZW50IG1lbnUgaXRlbS4gSWYgZGVmaW5lZCwgYSBoZWFkZXIgd2l0aCB0aGUgcGFyZW50J3MgbGFiZWwgYW5kIGFcclxuICAgICAqIGJhY2sgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFyZW50PzogTWVudUl0ZW07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheSB0ZW1wbGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0ZW1wbGF0ZVR5cGU6IE1lbnVUZW1wbGF0ZVR5cGUgPSAnbGFiZWwnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9uYWwgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgbWVudSBpdGVtcy4gTXVzdCBkZWNsYXJlIGEgdGVtcGxhdGVcclxuICAgICAqIGlucHV0IHZhcmlhYmxlIGNhbGxlZCBcIml0ZW1cIiBsaWtlIHNvOiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlTmFtZSBsZXQtaXRlbT4sXHJcbiAgICAgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lbnUncyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGl0bGU/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Tm9JdGVtcz86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgdG8gc2hvdyB3aGVuIG1lbnUgaXMgZW1wdHkgYW5kIHNob3dOb0l0ZW1zIGlzIHRydWVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG5vRGF0YVRleHQ6IHN0cmluZyA9ICdOb0l0ZW1zX1RDJztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgZW5hYmxlZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlS2V5TmF2PzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0ZW0gY3VycmVudGx5IGhpZ2hsaWdodGVkIGJ5IGtleWJvYXJkIG5hdmlnYXRpb25cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGhpZ2hsaWdodGVkSXRlbTogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbGxzIHRoZSBtZW51IHRvIG1haW50YWluIHRoZSBzZWxlY3RlZC9sYXN0U2VsZWN0ZWQgaXRlbS4gVHVybmluZyB0aGlzIG9mZiBpcyB1c2VmdWwgZm9yXHJcbiAgICAgKiBhY3Rpb24gdHlwZSBtZW51cyB0aGF0IGFyZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiBhdCBhbGwgdGltZXMgYW5kIHlvdSBkbyBub3RcclxuICAgICAqIHdhbnQgdGhlIGl0ZW0gdG8gYmUgc2VsZWN0ZWQgd2hlbiBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWFpbnRhaW5TZWxlY3RlZEl0ZW06IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2lsbCBwcmV2ZW50IHRleHQtd3JhcHBpbmcgb2YgbWVudSBpdGVtcyBhbmQgdHJ1bmNhdGUgaW5zdGVhZC4gQWxzbyB0dXJucyBvbiBhIHRvb2x0aXAgZm9yIHRoZSBtZW51IGl0ZW0uIERlZmF1bHQ6IGZhbHNlO1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdHJ1bmNhdGVJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiB0cnVlLCB0aGUgc3BhY2UgZm9yIHRoZSBpY29uIGlzIHByZXNlcnZlZCBmb3IgbWVudSBpdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGljb25zLlxyXG4gICAgICogT25seSBhcHBsaWNhYmxlIGZvciBpY29uQW5kTGFiZWwgbWVudXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmVzZXJ2ZUljb25TcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmZXJlbmNlIHRvIHRoZSB0b2dnbGUgYnV0dG9uLiAgU2V0IHdoZW4gbWVudSBpcyB1c2VkIGFzIHBhcnQgb2YgYSBEcm9wZG93bkNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGRyb3Bkb3duVG9nZ2xlQnV0dG9uPzogRWxlbWVudFJlZjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiBgc2VsZWN0ZWRgIGlzIGNoYW5nZWQuIEVtaXRzIHRoZSByZWZlcmVuY2VkIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHNlbGVjdGVkQ2hhbmdlZDogRXZlbnRFbWl0dGVyPE1lbnVJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudUl0ZW0+KCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBtZW51IGhhcyBhIHBhcmVudCBhbmQgYmFjayBpcyBjbGlja2VkXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG1lbnVDbG9zZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaXRlbSB0ZW1wbGF0ZSB0aGF0IGlzIGxvYWRlZCBpbnRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW50ZXJuYWxpemVkVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kZXggb2YgdGhlIGl0ZW0gY3VycmVudGx5IGhpZ2hsaWdodGVkIHVzaW5nIGtleWJvYXJkIG5hdlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGlnaGxpZ2h0ZWRJdGVtSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGxhYmVsIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2xhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBsYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBpY29uIGFuZCBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdpY29uQW5kTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25BbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBjaGVjayBhbmQgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tBbmRMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2hlY2tBbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGljb24sIGxhYmVsIGFuZCBjYXB0aW9uIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25MYWJlbENhcHRpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25MYWJlbENhcHRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyB0aGUgZnVuY3Rpb24gdXNlZCB0byByZW1vdmUgdGhlIGV2ZW4gbGlzdGVuZXIgZnJvbSB0aGUgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVLZXlkb3duTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGFzdCBpdGVtIHRoaXMuc2VsZWN0ZWQgd2FzIHNldCB0byB2aWEgc2VsZWN0SXRlbSgpLlxyXG4gICAgICogVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGlzLnNlbGVjdGVkLCBiZWNhdXNlIHRoaXMuc2VsZWN0ZWQgaXMgYW4gaW5wdXQgcHJvcGVydHlcclxuICAgICAqIGFuZCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBieSBhIGNvbnN1bWVyIHRocm91Z2ggc29tZSBtZWFucyBvdGhlciB0aGFuIHNlbGVjdEl0ZW0oKS5cclxuICAgICAqIFRoaXMgYWxsb3dzIHVzIHRvIHByZXZlbnQgZG91YmxlLWNhbGxzIHRvIHNlbGVjdEl0ZW0oKSB3aXRoIHRoZSBzYW1lIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxhc3RTZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZsYXR0ZW5lZCBhcnJheSBvZiBhbGwgc2VsZWN0YWJsZSBpdGVtcyBpbiB0aGUgbWVudS4gTWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNlbGVjdGFibGVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiBhIGZsYXQgbGlzdCBvZiBhbGwgc2VsZWN0YWJsZSBpdGVtcyBpbiB0aGUgcHJvdmlkZWQgbWVudSBpdGVtcy4gRmlsdGVycyBvdXQgaGVhZGluZ3MgYW5kIGRpdmlkZWQtc2VjdGlvbnMuXHJcbiAgICAgKiBUaGlzIG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW1zIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNlbGVjdGFibGVJdGVtcyhpdGVtczogTWVudUl0ZW1bXSk6IE1lbnVJdGVtW10ge1xyXG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKHNlbGVjdGFibGVJdGVtcywgaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgaXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZUl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZUl0ZW1zLnB1c2goLi4uaXRlbS5pdGVtcy5maWx0ZXIoY2hpbGRJdGVtID0+IGNoaWxkSXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgY2hpbGRJdGVtLmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGFibGVJdGVtcztcclxuICAgICAgICB9LCA8TWVudUl0ZW1bXT5bXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIElEIGZvciB0aGUgcHJvdmlkZWQgaXRlbSBiYXNlZCBvbiBpdHMgaW5kZXggaW4gdGhlIHByb3ZpZGVkIGl0ZW1zIGFycmF5LiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIE1lbnVDb21wb25lbnQnc1xyXG4gICAgICogZ2VuZXJhdGVkIElEcyBmb3IgaXRlbXMgdGhhdCBkb24ndCBoYXZlIHByb3ZpZGVkIElEcy4gVGhpcyBpcyB1c2VkIGluIE1lbnVDb21wb25lbnQgYW5kIENvbWJvYm94Q29tcG9uZW50IHRvIHNjcm9sbCB0byBzcGVjaWZpYyBpdGVtcy5cclxuICAgICAqIE5PVEU6IElmIHRoZSBpdGVtcyBhcnJheSBkb2VzIG5vdCBtYXRjaCB3aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgbWVudSwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgSUQuXHJcbiAgICAgKlxyXG4gICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBub3QgZm91bmRcclxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgTWVudUl0ZW1zIGFycmF5IHRvIHNlYXJjaCB0aHJvdWdoLlxyXG4gICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gZ2VuZXJhdGUgdGhlIElEIGZvci5cclxuICAgICAqIEBwYXJhbSBtZW51Q29tcG9uZW50SWQgVXNlZCB0byBwcmVmaXggdGhlIGdlbmVyYXRlZCBJRC4gVGhpcyBzaG91bGQgYmUgdGhlIElEIG9mIHRoZSBtZW51IGNvbXBvbmVudCB0aGUgaXRlbSBpcyBwcmVzZW50IGluLlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmRleGVkSXRlbUlkKGl0ZW1zOiBNZW51SXRlbVtdLCBpdGVtPzogTWVudUl0ZW0gfCBudWxsLCBtZW51Q29tcG9uZW50SWQ/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSW5MaXN0ID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbUluTGlzdC5sYWJlbCA9PT0gaXRlbS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHttZW51Q29tcG9uZW50SWR9X2l0ZW0ke2l9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBpcyBhIGhlYWRpbmcgb3IgZGl2aWRlZCBzZWN0aW9uLCBjaGVjayBpdHMgY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtSW5MaXN0Lml0ZW1zICYmIChpdGVtSW5MaXN0LmRpc3BsYXkgPT09ICdoZWFkaW5nJyB8fCBpdGVtSW5MaXN0LmRpc3BsYXkgPT09ICdkaXZpZGVkLXNlY3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaXRlbUluTGlzdC5pdGVtcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW0gPSBpdGVtSW5MaXN0Lml0ZW1zW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gY2hlY2tpbmcgb25seSB0aGUgbGFiZWwgaWYgdGhlIGl0ZW0gZG9lc24ndCBoYXZlIGFuIGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEl0ZW0ubGFiZWwgPT09IGl0ZW0ubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHttZW51Q29tcG9uZW50SWR9X2l0ZW0ke2l9LSR7an1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIHdpbmRvd1NlcnZpY2U6IFdpbmRvd1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBTY3JvbGxTZXJ2aWNlXHJcbiAgICApIHsgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuaXRlbXMgJiYgdGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVJdGVtcyA9IE1lbnVDb21wb25lbnQuZ2V0U2VsZWN0YWJsZUl0ZW1zKHRoaXMuaXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgJiBkaXNwbGF5cyB0aGUgaW50ZXJhbGl6ZWQgdGVtcGxhdGUgYmFzZWQgb25cclxuICAgICAqIHRoZSBzZXQgdGVtcGxhdGUuXHJcbiAgICAgKiBAc2VlIHsgQGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc3xBbmd1bGFyIExpZmVjeWNsZSBIb29rc31cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50ZW1wbGF0ZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAoXCJsYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25BbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkFuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkFuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJjaGVja0FuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuY2hlY2tBbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkxhYmVsQ2FwdGlvblwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25MYWJlbENhcHRpb25UZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlVHlwZSBmb3IgTWVudUNvbXBvbmVudC4gUGxlYXNlIHVzZSBlaXRoZXI6ICdsYWJlbCcsICdpY29uQW5kTGFiZWwnIG9yICdjaGVja0FuZExhYmVsJ2ApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIHRoZSBjb25zdW1lciBwcm92aWRlZCBhIG1lbnVJdGVtVGVtcGxhdGUsIG92ZXJyaWRlIHRoZSBpbnRlcm5hbGl6ZWRUZW1wbGF0ZSB3aXRoIHRoYXQuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tTWVudVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmN1c3RvbU1lbnVUZW1wbGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXR0cklkID0gdGhpcy5pZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0SXRlbUlkcygpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW0gJiYgdGhpcy5zZWxlY3RhYmxlSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPSB0aGlzLnNlbGVjdGFibGVJdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB7IHJldHVybiB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9PT0gaXRlbX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZGRLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXHJcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gYSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQsIG9wZW4gYSBjaGlsZCBtZW51IGlmIHRoZSBpdGVtIGhhcyBpdGVtcywgY2FsbFxyXG4gICAgICogdGhlIGl0ZW0ncyBjbGljayBtZXRob2QgaWYgZGVmaW5lZCwgb3IgZW1pdCB0aGUgc2VsZWN0ZWQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgc2VsZWN0ZWQgaXRlbVxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oZXZlbnQ6IEV2ZW50LCBpdGVtOiBNZW51SXRlbSwgaXNLZXlFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgLy9JbiB0aGUgY2FzZSB0aGF0IHRoZSB1c2VyIGNsaWNrcyBhbiBpdGVtLCBzZWxlY3RJdGVtKCkgd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgY2xpY2sgaGFuZGxlclxyXG4gICAgICAgIC8vYW5kIHRocm91Z2ggb25Sb3V0ZXJMaW5rQWN0aXZhdGVkLiBPbmx5IG9uZSBvZiB0aGVzZSB3aWxsIG1ha2UgaXQgdGhyb3VnaCB0aGlzIGlmIHN0YXRlbWVudFxyXG4gICAgICAgIC8vYmVjYXVzZSB0aGUgZmlyc3Qgb25lIHdpbGwgc2V0IHRoaXMubGFzdFNlbGVjdGVkID0gaXRlbS5cclxuICAgICAgICBpZiAoIWl0ZW0uZGlzYWJsZWQgJiYgIWl0ZW0ucmVhZG9ubHkgJiYgdGhpcy5sYXN0U2VsZWN0ZWQgIT09IGl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXRlbS51cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLm9uQ2xpY2soaXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNoaWxkTWVudSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbihpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFudWFsbHkgaGFuZGxlIHRoZSB1cmwgbmF2aWdhdGlvbiBpZiB0aGUga2V5Ym9hcmQgd2FzIHVzZWRcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0tleUV2ZW50IHx8ICg8RWxlbWVudD5ldmVudC50YXJnZXQpPy50YWdOYW1lID09PSAnTEknKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS50YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihpdGVtLnVybCwgaXRlbS50YXJnZXQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpbmRvd1NlcnZpY2UubmF2aWdhdGVUb1VybChpdGVtLnVybCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBFbWl0IHNvIHVwc3RyZWFtIGNvbXBvbmVudHMga25vdyBhbiBpdGVtIHdhcyBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbihpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW50YWluU2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gaXRlbTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2UgdGhlIGN1cnJlbnQgbWVudSBhbmQgb3BlbiB0aGUgcGFyZW50IG1lbnVcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBiYWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Lm9uQ2xpY2sobnVsbCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWVudUNsb3NlZC5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdCB0aGUgc2VsZWN0ZWQgaXRlbVxyXG4gICAgICogQHBhcmFtIGl0ZW0gVGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uU2VsZWN0aW9uKGl0ZW06IE1lbnVJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZWQuZW1pdChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBvciBjbG9zZSB0aGUgY2hpbGQgbWVudS4gV2hlbiB0aGUgY2hpbGQgbWVudSBjbG9zZXMsIHRoZSBzZWxlY3RlZFxyXG4gICAgICogaXRlbSBpcyByZXNldC5cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVDaGlsZE1lbnUob3BlbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGxldCBuYXZFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCduYXYnKTtcclxuXHJcbiAgICAgICAgaWYgKG9wZW4pIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciBvbiB0aGUgcGFyZW50IG1lbnUgd2hlbiBhIGNoaWxkIG1lbnUgaXMgb3BlbmVkXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgbWVudXNcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBuYXZFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gbmF2RWwub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhbmltYXRlIHRoZSBjaGlsZCBtZW51LCB3ZSBuZWVkIHRvIHNldCBoZWlnaHQgb24gdGhlIG5hdiBlbGVtZW50XHJcbiAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uIHRoZSB0d28gbWVudXMgYW5kIG1haW50YWluIHRoZSBjdXJyZW50IG1lbnUncyBoZWlnaHRcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXZFbCwgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnd2lkdGgnLCBgJHt3aWR0aH1weGApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuJyk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFJlLWFkZCB0aGUgbGlzdGVuZXIgb25jZSB0aGUgY2hpbGQgbWVudSBjbG9zZXNcclxuICAgICAgICAgICAgdGhpcy5hZGRLZXlkb3duTGlzdGVuZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3Blbi1hY3RpdmUnKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgbmF2IGVsZW1lbnQncyBoZWlnaHQgdG8gYXV0b1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXZFbCwgJ2hlaWdodCcsICcxMDAlJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgfSwgbWVudUFuaW1hdGlvblNwZWVkKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBrZXkgcHJlc3NlcyB0byBuYXZpZ2F0ZSB0aGUgbWVudVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMga2V5TmF2aWdhdGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5lbmFibGVLZXlOYXYgJiYgZXZlbnQudGFyZ2V0ID09PSB0aGlzLmRyb3Bkb3duVG9nZ2xlQnV0dG9uPy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1VwJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdEb3duJzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZUhpZ2hsaWdodGVkVXBPckRvd24oZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnUmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBpdGVtIGlmIGl0IGhhcyBjaGlsZCBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbSAmJiB0aGlzLmhpZ2hsaWdodGVkSXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1lbnUgaWYgaXQgaXMgYSBjaGlsZCBtZW51XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnU3BhY2ViYXInOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgJ2VudGVyJyBmcm9tIGRvaW5nIHdoYXRldmVyIGl0IGRvZXMgb24gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xICYmIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5oaWdobGlnaHRlZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIGlzIGhpZ2hsaWdodGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID09PSAtMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1lbnUgaWYgaXQncyBhIGNoaWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjcm9sbCB0byB0aGUgaXRlbSBjdXJyZW50bHkgbWFya2VkIGFzICdpcy1zZWxlY3RlZCcuIFdhaXQgYSB0aWNrIGZvciB0aGVcclxuICAgICAqIE5nQ2xhc3NEaXJlY2l0dmUgb3IgTmF2SXRlbUFjdGl2ZURpcmVjdGl2ZSB0byByZXNwb25kIHRvIHRoZSBtb2RlbCBjaGFuZ2VzXHJcbiAgICAgKiBhbmQgdXBkYXRlIHRoZSB2aWV3LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rU2VsZWN0b3IgPSBgbGkuaXMtc2VsZWN0ZWRgO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9JdGVtKGAjJHt0aGlzLmlkfV9saXN0YCwgbGlua1NlbGVjdG9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vdmVIaWdobGlnaHRlZFVwT3JEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1VwJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4LS07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPCB0aGlzLnNlbGVjdGFibGVJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgaXRlbSBhdCB0aGUgY3VycmVudCBoaWdobGlnaHQgaW5kZXhcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSB0aGlzLnNlbGVjdGFibGVJdGVtc1t0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9IaWdobGlnaHRlZEl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS5cclxuICAgKiBJZiBubyBpdGVtIGlzIHByb3ZpZGVkLCBpdCB3aWxsIHNjcm9sbCB0byB0aGUgZmlyc3QgaXRlbS5cclxuICAgICAqXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIG1lbnUgaXRlbSB0byBzY3JvbGwgdG8uXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNjcm9sbE1lbnUoaXRlbT86IE1lbnVJdGVtIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5pZCkge1xyXG4gICAgICAgICAgICBpdGVtID0gaXRlbSA/IGl0ZW0gOiB0aGlzLml0ZW1zWzBdO1xyXG4gICAgICAgICAgICBsZXQgaXRlbUlkID0gaXRlbS5pZCA/IGl0ZW0uaWQgOiBNZW51Q29tcG9uZW50LmdldEluZGV4ZWRJdGVtSWQodGhpcy5pdGVtcywgaXRlbSwgdGhpcy5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X2xpc3RgLCBgIyR7aXRlbUlkfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcm9sbFRvSGlnaGxpZ2h0ZWRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsTWVudSh0aGlzLmhpZ2hsaWdodGVkSXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRLZXlkb3duTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gT25seSBhdHRlbXB0IHRvIGFkZCB0aGUgbGlzdGVuZXIgaWYga2V5Ym9hcmQgbmF2IGlzIGVuYWJsZWRcclxuICAgICAgICBpZiAodGhpcy5lbmFibGVLZXlOYXYpIHtcclxuICAgICAgICAgICAgLy8gcmVuZGVyZXIubGlzdGVuIGFkZHMgdGhlIGxpc3RlbmVyIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAgICAvLyBUaGUgbGlzdGVuZXIgcmVtYWlucyBhY3RpdmUgdW50aWwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuXHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMua2V5TmF2aWdhdGUoZXZlbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtZW51IGl0ZW0gaWRzIHVzaW5nIGl0cyBpbmRleCBpZiBpdGVtIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEl0ZW1JZHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pZCA9IGl0ZW0uaWQgPyBpdGVtLmlkIDogdGhpcy5pZCArICdfaXRlbScgKyBpbmRleDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxuYXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFyZW50XCJcclxuICAgICAgICAgW2NsYXNzLm5vLWRhdGFdPVwic2hvd05vSXRlbXMgJiYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApXCI+XHJcbiAgICAgICAgPGhlYWRlciBpZD1cInt7aWR9fV9oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMyBwLTFcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImhpZ2hsaWdodGVkSXRlbUluZGV4ID09PSAtMVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInBhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFjaygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTkwIGZsZXgtc2hyaW5rXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCB0ZXh0LXRydW5jYXRlIGZsZXgtZ3Jvd1wiPnt7cGFyZW50Py5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuXHJcbiAgICAgICAgPHVsIGlkPVwie3tpZH19X2xpc3RcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInB5LTFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgaW5kZXggYXMgaVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbSwgaW5kZXg6IGl9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBTaG93IGNoaWxkIGl0ZW1zIHVuZGVyIHBhcmVudCBpdGVtIGlmIHRoZSBpdGVtIGlzIGEgaGVhZGluZyBvciBkaXZpZGVkLXNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pdGVtcz8ubGVuZ3RoICYmIChpdGVtLmRpc3BsYXkgPT09ICdoZWFkaW5nJyB8fCBpdGVtLmRpc3BsYXkgPT09ICdkaXZpZGVkLXNlY3Rpb24nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaWxkSXRlbSBvZiBpdGVtLml0ZW1zOyBpbmRleCBhcyBqOyBmaXJzdCBhcyBpc0ZpcnN0OyBsYXN0IGFzIGlzTGFzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkSXRlbSwgaW5kZXg6IGkgKyAnLScgKyBqLCBpc0RpdmlkZWRTZWN0aW9uQ2hpbGQ6IGl0ZW0uZGlzcGxheSA9PT0gJ2RpdmlkZWQtc2VjdGlvbicsIGlzRmlyc3Q6IGlzRmlyc3QsIGlzTGFzdDogaXNMYXN0fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDxwIGNsYXNzPVwibm8tZGF0YS1tZXNzYWdlXCI+e3tub0RhdGFUZXh0IHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENoaWxkIG1lbnUgKFJlbmRlcmVkIHRvIHRoZSByaWdodCkgLS0+XHJcbiAgICA8ZWMtbWVudSAqbmdJZj1cInNlbGVjdGVkPy5pdGVtcyAmJiBzZWxlY3RlZD8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIHNlbGVjdGVkPy5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJ1wiXHJcbiAgICAgICAgICAgICBpZD1cInt7aWR9fV9jaGlsZFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImNoaWxkXCJcclxuICAgICAgICAgICAgIFtwYXJlbnRdPVwic2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgW2l0ZW1zXT1cInNlbGVjdGVkPy5pdGVtc1wiXHJcbiAgICAgICAgICAgICBbc2hvd05vSXRlbXNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbdGVtcGxhdGVUeXBlXT1cInRlbXBsYXRlVHlwZVwiXHJcbiAgICAgICAgICAgICBbZW5hYmxlS2V5TmF2XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgW3RydW5jYXRlSXRlbXNdPVwidHJ1bmNhdGVJdGVtc1wiXHJcbiAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cIm9uU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKG1lbnVDbG9zZWQpPVwidG9nZ2xlQ2hpbGRNZW51KGZhbHNlKVwiPlxyXG4gICAgPC9lYy1tZW51PlxyXG48L25hdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaXRlbVRlbXBsYXRlXHJcbiAgICAgICAgICAgICBsZXQtaXRlbVxyXG4gICAgICAgICAgICAgbGV0LWk9XCJpbmRleFwiXHJcbiAgICAgICAgICAgICBsZXQtaXNEaXZpZGVkU2VjdGlvbkNoaWxkPVwiaXNEaXZpZGVkU2VjdGlvbkNoaWxkXCJcclxuICAgICAgICAgICAgIGxldC1pc0ZpcnN0PVwiaXNGaXJzdFwiXHJcbiAgICAgICAgICAgICBsZXQtaXNMYXN0PVwiaXNMYXN0XCI+XHJcbiAgICA8bGkgKm5nSWY9XCIhKGl0ZW0uaGlkZUlmTm9JdGVtcyAmJiAhaXRlbS5pdGVtcz8ubGVuZ3RoKSAmJiBpdGVtLmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nXCJcclxuICAgICAgICBpZD1cInt7aXRlbS5pZCB8fCBpZCArICdfaXRlbScgKyBpfX1cIlxyXG4gICAgICAgIGNsYXNzPVwie3tpdGVtLmRpc3BsYXkgfHwgJ2l0ZW0nfX0ge3tpdGVtLmNsYXNzTGlzdH19XCJcclxuICAgICAgICBbY2xhc3MuZGl2aWRlci10b3BdPVwiaXRlbS5kaXNwbGF5ID09PSAnZGl2aWRlci10b3AnIHx8IChpc0RpdmlkZWRTZWN0aW9uQ2hpbGQgJiYgaXNGaXJzdClcIlxyXG4gICAgICAgIFtjbGFzcy5kaXZpZGVyXT1cIml0ZW0uZGlzcGxheSA9PT0gJ2RpdmlkZXInIHx8IChpc0RpdmlkZWRTZWN0aW9uQ2hpbGQgJiYgaXNMYXN0KVwiXHJcbiAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXHJcbiAgICAgICAgW2hpZGRlbl09XCJpdGVtLmhpZGRlblwiXHJcbiAgICAgICAgZWNOYXZJdGVtQWN0aXZlPVwiaXMtc2VsZWN0ZWRcIlxyXG4gICAgICAgIFtlY05hdkl0ZW1BY3RpdmVRdWVyeVBhcmFtc109XCJpdGVtLnF1ZXJ5UGFyYW1zXCJcclxuICAgICAgICBbZWNOYXZJdGVtQWN0aXZlVXJsXT1cIml0ZW0udXJsXCJcclxuICAgICAgICBbZWNOYXZJdGVtQWN0aXZlRXhhY3RNYXRjaF09J2l0ZW0uaXNBY3RpdmVFeGFjdE1hdGNoJ1xyXG4gICAgICAgIChyb3V0ZXJMaW5rQWN0aXZhdGVkKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydpcy1oaWdobGlnaHRlZCc6KHNlbGVjdGVkID09PSBpdGVtICYmIGl0ZW0/LmRpc3BsYXkgIT09ICdoZWFkaW5nJykgfHwgaGlnaGxpZ2h0ZWRJdGVtID09PSBpdGVtLCAnaXMtbGluayc6IGl0ZW0udXJsLCAnaXMtZGlzYWJsZWQnOiBpdGVtLmRpc2FibGVkLCAnaXMtcmVhZG9ubHknOiBpdGVtLnJlYWRvbmx5LCAnaXMtY2hlY2tlZCc6IGl0ZW0uY2hlY2tlZCwgJ3RleHQtaGVhZGluZy0zJzogaXRlbT8uZGlzcGxheSA9PT0gJ2hlYWRpbmcnfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiPlxyXG5cclxuICAgICAgICA8YSAqbmdJZj1cIml0ZW0udXJsICYmICFpdGVtLmV4dGVybmFsTGlua1wiXHJcbiAgICAgICAgICAgaWQ9XCJ7e2l0ZW0uaWR9fV9saW5rXCJcclxuICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiXHJcbiAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXRlbS51cmxcIlxyXG4gICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJpdGVtLnF1ZXJ5UGFyYW1zIHx8IG51bGxcIlxyXG4gICAgICAgICAgIHRhcmdldD1cInt7aXRlbS50YXJnZXQgfHwgJ19zZWxmJ319XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgaXRlbS5leHRlcm5hbExpbmtcIlxyXG4gICAgICAgICAgIGlkPVwie3tpdGVtLmlkfX1fbGlua1wiXHJcbiAgICAgICAgICAgdGl0bGU9XCJ7e3RydW5jYXRlSXRlbXMgPyBpdGVtLmxhYmVsIDogJyd9fVwiXHJcbiAgICAgICAgICAgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIlxyXG4gICAgICAgICAgIGhyZWY9XCJ7e2l0ZW0udXJsfX1cIlxyXG4gICAgICAgICAgIHRhcmdldD1cInt7aXRlbS50YXJnZXQgfHwgJ19zZWxmJ319XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbS51cmxcIlxyXG4gICAgICAgICAgICAgdGl0bGU9XCJ7e3RydW5jYXRlSXRlbXMgPyBpdGVtLmxhYmVsIDogJyd9fVwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2xpPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSAnbGFiZWwnIEl0ZW0gVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjbGFiZWxcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG4gICAgPHNwYW4gaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS0yNzBcIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtPy5pdGVtcyAmJiBpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJyAmJiBpdGVtLmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSAnY2hlY2tBbmRMYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNjaGVja0FuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1jaGVjayBlYy1pY29uLXNtXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZydcIj48L2k+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7aXRlbS5pY29ufX0gbWwtMlwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdpY29uQW5kTGFiZWwnIEl0ZW0gVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkFuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDwhLS0gSWYgbWVudUl0ZW0uaWNvbiBleGlzdHMgYW5kIGlzIG5vdCBibGFuaywgc2hvdyB0aGUgaWNvbiBpbiB0aGUgbWVudSAtLT5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19XCJcclxuICAgICAgICpuZ0lmPVwiKGl0ZW0uaWNvbiAmJiBpdGVtLmljb24gIT09ICcnKSB8fCBwcmVzZXJ2ZUljb25TcGFjZVwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2ljb25MYWJlbENhcHRpb25cclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7aXRlbS5pY29ufX1cIlxyXG4gICAgICAgKm5nSWY9XCIoaXRlbS5pY29uICYmIGl0ZW0uaWNvbiAhPT0gJycpIHx8IHByZXNlcnZlSWNvblNwYWNlXCI+PC9pPlxyXG4gICAgPGRpdiAqbmdJZj1cIml0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnXCJcclxuICAgICAgICAgY2xhc3M9XCJsYWJlbCBmbGV4LWdyb3dcIj5cclxuICAgICAgICA8ZGl2IGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktMVwiXHJcbiAgICAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGlkPVwie3tpdGVtLmlkfX1fY2FwdGlvblwiXHJcbiAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uY2FwdGlvblwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2FwdGlvbi0xXCJcclxuICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0uY2FwdGlvbn19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMyAqbmdJZj1cIml0ZW0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnXCJcclxuICAgICAgICBjbGFzcz1cImZsZXgtZ3JvdyB0ZXh0LWhlYWRpbmctMyBhbGlnbi1zZWxmLWNlbnRlclwiXHJcbiAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9oMz5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MCBhbGlnbi1zZWxmLWNlbnRlclwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUEwQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBNEIvSixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBRXRDOzs7O0dBSUc7QUFNSCxNQUFNLE9BQU8sYUFBYTtJQTRLdEIsWUFDWSxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsYUFBNEI7UUFINUIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqS3hDOzs7O1dBSUc7UUFDYSxVQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUc1Qzs7Ozs7V0FLRztRQUNhLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBVWpEOzs7O1dBSUc7UUFDYSxpQkFBWSxHQUFxQixPQUFPLENBQUM7UUFtQnpEOztXQUVHO1FBQ2EsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0M7O1dBRUc7UUFDYSxlQUFVLEdBQVcsWUFBWSxDQUFDO1FBR2xEOztXQUVHO1FBQ2EsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFHL0M7O1dBRUc7UUFDYSxvQkFBZSxHQUFvQixJQUFJLENBQUM7UUFFeEQ7Ozs7V0FJRztRQUNhLHlCQUFvQixH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QWlCO3NCQUFoQyxLQUFLO2dCQUtVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFPVyxlQUFlO3NCQUEvQixNQUFNO2dCQU9VLFVBQVU7c0JBQTFCLE1BQU07Z0JBbUJ3QyxhQUFhO3NCQUExRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTWdCLG9CQUFvQjtzQkFBeEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1XLHFCQUFxQjtzQkFBMUUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUthLHdCQUF3QjtzQkFBaEYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51VGVtcGxhdGVUeXBlID0gXCJsYWJlbFwiIHwgXCJpY29uQW5kTGFiZWxcIiB8IFwiY2hlY2tBbmRMYWJlbFwiIHwgXCJpY29uTGFiZWxDYXB0aW9uXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51SG9zdEVsZW1lbnRDbGFzc2VzID0gJ2JnLXRyYW5zcGFyZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW08VFZhbHVlPWFueSwgU0l0ZW1zPWFueT4gZXh0ZW5kcyBOYXZJdGVtIHtcclxuICAvLyBMYWJlbCBpcyBvcHRpb25hbCBpbiBOYXZJdGVtIGJ1dCB3YXMgbm90IGluIE1lbnVJdGVtLFxyXG4gIC8vIG92ZXJyaWRpbmcgdG8gYmUgcmVxdWlyZWRcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGNhcHRpb24/OiBzdHJpbmcsXHJcbiAgaXRlbXM/OiBNZW51SXRlbTxTSXRlbXM+W10sXHJcbiAgY2hlY2tlZD86IGJvb2xlYW4sXHJcbiAgZGlzcGxheT86ICdkZWZhdWx0J3wnaGVhZGluZyd8J2RpdmlkZXInLFxyXG4gIHZhbHVlPzpUVmFsdWUsXHJcbiAgY2xhc3NMaXN0PzpzdHJpbmcsXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gIGhpZGRlbj86IGJvb2xlYW4sXHJcbiAgcmVhZG9ubHk/OiBib29sZWFuLFxyXG4gIHRhcmdldD86IExpbmtUYXJnZXQsXHJcbiAgZXh0ZXJuYWxMaW5rPzogYm9vbGVhbixcclxuICAvKiogT3B0aW9uYWwgdGV4dCB0byBkaXNwbGF5IGluLXBsYWNlIG9mIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gdGhlIE1lbnVJdGVtIGlzIHNlbGVjdGVkLiAqL1xyXG4gIHNlbGVjdGVkTGFiZWw/OiBzdHJpbmdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW51QW5pbWF0aW9uU3BlZWQgPSAzNTA7XHJcblxyXG4vKipcclxuICogUHJpbWl0aXZlIE1lbnUgY29tcG9uZW50IHRoYXQgZW5jYXBzdWxhdGVzIGtub3duIHRlbXBsYXRlc1xyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZWMtbWVudScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIElucHV0IGZvciB0aGUgbWVudSdzIHRlbXBsYXRlIGlkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZD86IHN0cmluZztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBib3VuZCB0byB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpIHB1YmxpYyBhdHRySWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXkgb2YgaXRlbXMgdG8gZGlzcGxheVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFNlbGVjdGVkIGl0ZW07IGFubm90YXRlcyB0aGUgaXRlbVxyXG4gICAgICogIHdoZW4gZGlzcGxheWVkIHdpdGggJ3NlbGVjdGVkJyBjbGFzc1xyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGFyZW50IG1lbnUgaXRlbS4gSWYgZGVmaW5lZCwgYSBoZWFkZXIgd2l0aCB0aGUgcGFyZW50J3MgbGFiZWwgYW5kIGFcclxuICAgICAqIGJhY2sgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFyZW50PzogTWVudUl0ZW07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheSB0ZW1wbGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0ZW1wbGF0ZVR5cGU6IE1lbnVUZW1wbGF0ZVR5cGUgPSAnbGFiZWwnO1xyXG5cclxuXHQvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcblx0ICogaW5wdXQgdmFyaWFibGUgY2FsbGVkIFwiaXRlbVwiIGxpa2Ugc286IDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOYW1lIGxldC1pdGVtPixcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lbnUncyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGl0bGU/OnN0cmluZztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IG1lc3NhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gaXRlbXNcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dOb0l0ZW1zPzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IHRvIHNob3cgd2hlbiBtZW51IGlzIGVtcHR5IGFuZCBzaG93Tm9JdGVtcyBpcyB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBub0RhdGFUZXh0OiBzdHJpbmcgPSAnTm9JdGVtc19UQyc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbHMgd2hldGhlciBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGVuYWJsZUtleU5hdj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCBieSBrZXlib2FyZCBuYXZpZ2F0aW9uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB0aGUgbWVudSB0byBtYWludGFpbiB0aGUgc2VsZWN0ZWQvbGFzdFNlbGVjdGVkIGl0ZW0uIFR1cm5pbmcgdGhpcyBvZmYgaXMgdXNlZnVsIGZvclxyXG4gICAgICogYWN0aW9uIHR5cGUgbWVudXMgdGhhdCBhcmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYXQgYWxsIHRpbWVzIGFuZCB5b3UgZG8gbm90XHJcbiAgICAgKiB3YW50IHRoZSBpdGVtIHRvIGJlIHNlbGVjdGVkIHdoZW4gY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG1haW50YWluU2VsZWN0ZWRJdGVtOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgcHJldmVudCB0ZXh0LXdyYXBwaW5nIG9mIG1lbnUgaXRlbXMgYW5kIHRydW5jYXRlIGluc3RlYWQuIEFsc28gdHVybnMgb24gYSB0b29sdGlwIGZvciB0aGUgbWVudSBpdGVtLiBEZWZhdWx0OiBmYWxzZTtcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRydW5jYXRlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdHJ1ZSwgdGhlIHNwYWNlIGZvciB0aGUgaWNvbiBpcyBwcmVzZXJ2ZWQgZm9yIG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSBpY29ucy5cclxuICAgICAqIE9ubHkgYXBwbGljYWJsZSBmb3IgaWNvbkFuZExhYmVsIG1lbnVzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgdG9nZ2xlIGJ1dHRvbi4gIFNldCB3aGVuIG1lbnUgaXMgdXNlZCBhcyBwYXJ0IG9mIGEgRHJvcGRvd25Db21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93blRvZ2dsZUJ1dHRvbj86IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gYHNlbGVjdGVkYCBpcyBjaGFuZ2VkLiBFbWl0cyB0aGUgcmVmZXJlbmNlZCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgbWVudSBoYXMgYSBwYXJlbnQgYW5kIGJhY2sgaXMgY2xpY2tlZFxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBtZW51Q2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGl0ZW0gdGVtcGxhdGUgdGhhdCBpcyBsb2FkZWQgaW50byB0aGUgY29tcG9uZW50IHRlbXBsYXRlXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsaXplZFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGV4IG9mIHRoZSBpdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCB1c2luZyBrZXlib2FyZCBuYXZcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhpZ2hsaWdodGVkSXRlbUluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICAgQFZpZXdDaGlsZCgnbGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGxhYmVsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGljb24gYW5kIGxhYmVsIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25BbmRMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgaWNvbkFuZExhYmVsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGNoZWNrIGFuZCBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdjaGVja0FuZExhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjaGVja0FuZExhYmVsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgaWNvbiwgbGFiZWwgYW5kIGNhcHRpb24gdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaWNvbkxhYmVsQ2FwdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgaWNvbkxhYmVsQ2FwdGlvblRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRhaW5zIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHJlbW92ZSB0aGUgZXZlbiBsaXN0ZW5lciBmcm9tIHRoZSByZW5kZXJlclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlbW92ZUtleWRvd25MaXN0ZW5lcj86ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYXN0IGl0ZW0gdGhpcy5zZWxlY3RlZCB3YXMgc2V0IHRvIHZpYSBzZWxlY3RJdGVtKCkuXHJcbiAgICAgKiBUaGlzIGlzbid0IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoaXMuc2VsZWN0ZWQsIGJlY2F1c2UgdGhpcy5zZWxlY3RlZCBpcyBhbiBpbnB1dCBwcm9wZXJ0eVxyXG4gICAgICogYW5kIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IGEgY29uc3VtZXIgdGhyb3VnaCBzb21lIG1lYW5zIG90aGVyIHRoYW4gc2VsZWN0SXRlbSgpLlxyXG4gICAgICogVGhpcyBhbGxvd3MgdXMgdG8gcHJldmVudCBkb3VibGUtY2FsbHMgdG8gc2VsZWN0SXRlbSgpIHdpdGggdGhlIHNhbWUgaW5wdXQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIHdpbmRvd1NlcnZpY2U6IFdpbmRvd1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBTY3JvbGxTZXJ2aWNlXHJcbiAgICApe1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyAmIGRpc3BsYXlzIHRoZSBpbnRlcmFsaXplZCB0ZW1wbGF0ZSBiYXNlZCBvblxyXG4gICAgICogdGhlIHNldCB0ZW1wbGF0ZS5cclxuICAgICAqIEBzZWUgeyBAbGluayBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzfEFuZ3VsYXIgTGlmZWN5Y2xlIEhvb2tzfVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnRlbXBsYXRlVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIChcImxhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkFuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJpY29uQW5kTGFiZWxcIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5pY29uQW5kTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChcImNoZWNrQW5kTGFiZWxcIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jaGVja0FuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJpY29uTGFiZWxDYXB0aW9uXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkxhYmVsQ2FwdGlvblRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGVUeXBlIGZvciBNZW51Q29tcG9uZW50LiBQbGVhc2UgdXNlIGVpdGhlcjogJ2xhYmVsJywgJ2ljb25BbmRMYWJlbCcgb3IgJ2NoZWNrQW5kTGFiZWwnYClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIGEgbWVudUl0ZW1UZW1wbGF0ZSwgb3ZlcnJpZGUgdGhlIGludGVybmFsaXplZFRlbXBsYXRlIHdpdGggdGhhdC5cclxuICAgICAgICBpZih0aGlzLmN1c3RvbU1lbnVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jdXN0b21NZW51VGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF0dHJJZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEl0ZW1JZHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHsgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID09PSBpdGVtfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZEtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3RlbmVyIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgICAgICBpZiAodGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBhIG1lbnUgaXRlbSBpcyBzZWxlY3RlZCwgb3BlbiBhIGNoaWxkIG1lbnUgaWYgdGhlIGl0ZW0gaGFzIGl0ZW1zLCBjYWxsXHJcbiAgICAgKiB0aGUgaXRlbSdzIGNsaWNrIG1ldGhvZCBpZiBkZWZpbmVkLCBvciBlbWl0IHRoZSBzZWxlY3RlZCBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VsZWN0SXRlbShldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtLCBpc0tleUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvL0luIHRoZSBjYXNlIHRoYXQgdGhlIHVzZXIgY2xpY2tzIGFuIGl0ZW0sIHNlbGVjdEl0ZW0oKSB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGljayBoYW5kbGVyXHJcbiAgICAgICAgLy9hbmQgdGhyb3VnaCBvblJvdXRlckxpbmtBY3RpdmF0ZWQuIE9ubHkgb25lIG9mIHRoZXNlIHdpbGwgbWFrZSBpdCB0aHJvdWdoIHRoaXMgaWYgc3RhdGVtZW50XHJcbiAgICAgICAgLy9iZWNhdXNlIHRoZSBmaXJzdCBvbmUgd2lsbCBzZXQgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtLlxyXG4gICAgICAgIGlmKCFpdGVtLmRpc2FibGVkICYmICFpdGVtLnJlYWRvbmx5ICYmIHRoaXMubGFzdFNlbGVjdGVkICE9PSBpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5vbkNsaWNrKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpbGRNZW51KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSB0aGUgdXJsIG5hdmlnYXRpb24gaWYgdGhlIGtleWJvYXJkIHdhcyB1c2VkXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNLZXlFdmVudCB8fCAoPEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KT8udGFnTmFtZSA9PT0gJ0xJJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS51cmwsIGl0ZW0udGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3dTZXJ2aWNlLm5hdmlnYXRlVG9VcmwoaXRlbS51cmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gRW1pdCBzbyB1cHN0cmVhbSBjb21wb25lbnRzIGtub3cgYW4gaXRlbSB3YXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpblNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IG1lbnUgYW5kIG9wZW4gdGhlIHBhcmVudCBtZW51XHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYmFjayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vbkNsaWNrKG51bGwsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lbnVDbG9zZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgdGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNlbGVjdGlvbihpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlZC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIG9yIGNsb3NlIHRoZSBjaGlsZCBtZW51LiBXaGVuIHRoZSBjaGlsZCBtZW51IGNsb3NlcywgdGhlIHNlbGVjdGVkXHJcbiAgICAgKiBpdGVtIGlzIHJlc2V0LlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZUNoaWxkTWVudShvcGVuOmJvb2xlYW4pOnZvaWQge1xyXG4gICAgICAgIGxldCBuYXZFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCduYXYnKTtcclxuXHJcbiAgICAgICAgaWYgKG9wZW4pIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciBvbiB0aGUgcGFyZW50IG1lbnUgd2hlbiBhIGNoaWxkIG1lbnUgaXMgb3BlbmVkXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgbWVudXNcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0Om51bWJlciA9IG5hdkVsLm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgbGV0IHdpZHRoOm51bWJlciA9IG5hdkVsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYW5pbWF0ZSB0aGUgY2hpbGQgbWVudSwgd2UgbmVlZCB0byBzZXQgaGVpZ2h0IG9uIHRoZSBuYXYgZWxlbWVudFxyXG4gICAgICAgICAgICAvLyBzbyB3ZSBjYW4gYWJzb2x1dGVseSBwb3NpdGlvbiB0aGUgdHdvIG1lbnVzIGFuZCBtYWludGFpbiB0aGUgY3VycmVudCBtZW51J3MgaGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXZFbCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3Blbi1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBSZS1hZGQgdGhlIGxpc3RlbmVyIG9uY2UgdGhlIGNoaWxkIG1lbnUgY2xvc2VzXHJcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIG5hdiBlbGVtZW50J3MgaGVpZ2h0IHRvIGF1dG9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCAnMTAwJScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sIG1lbnVBbmltYXRpb25TcGVlZClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUga2V5IHByZXNzZXMgdG8gbmF2aWdhdGUgdGhlIG1lbnVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2ICYmIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5kcm9wZG93blRvZ2dsZUJ1dHRvbj8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdVcCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVIaWdobGlnaHRlZFVwT3JEb3duKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgaXRlbSBpZiBpdCBoYXMgY2hpbGQgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW0gJiYgdGhpcy5oaWdobGlnaHRlZEl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLmhpZ2hsaWdodGVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdMZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZW51IGlmIGl0IGlzIGEgY2hpbGQgbWVudVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1NwYWNlYmFyJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50ICdlbnRlcicgZnJvbSBkb2luZyB3aGF0ZXZlciBpdCBkb2VzIG9uIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLmhpZ2hsaWdodGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIGlzIGhpZ2hsaWdodGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID09PSAtMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1lbnUgaWYgaXQncyBhIGNoaWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjcm9sbCB0byB0aGUgaXRlbSBjdXJyZW50bHkgbWFya2VkIGFzICdpcy1zZWxlY3RlZCcuIFdhaXQgYSB0aWNrIGZvciB0aGVcclxuICAgICAqIE5nQ2xhc3NEaXJlY2l0dmUgb3IgTmF2SXRlbUFjdGl2ZURpcmVjdGl2ZSB0byByZXNwb25kIHRvIHRoZSBtb2RlbCBjaGFuZ2VzXHJcbiAgICAgKiBhbmQgdXBkYXRlIHRoZSB2aWV3LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rU2VsZWN0b3IgPSBgbGkuaXMtc2VsZWN0ZWRgO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9JdGVtKGAjJHt0aGlzLmlkfV9saXN0YCwgbGlua1NlbGVjdG9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vdmVIaWdobGlnaHRlZFVwT3JEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1VwJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4LS07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgaW4tbWVudSBoZWFkaW5nIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLml0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4LS07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICBjYXNlICdEb3duJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4IDwgdGhpcy5pdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4IDwgdGhpcy5pdGVtcy5sZW5ndGggLSAxICYmIHRoaXMuaXRlbXNbdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBpdGVtIGF0IHRoZSBjdXJyZW50IGhpZ2hsaWdodCBpbmRleFxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IHRoaXMuaXRlbXNbdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjcm9sbFRvSGlnaGxpZ2h0ZWRJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogU2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgbWVudSBpdGVtLlxyXG4gICAqIElmIG5vIGl0ZW0gaXMgcHJvdmlkZWQsIGl0IHdpbGwgc2Nyb2xsIHRvIHRoZSBmaXJzdCBpdGVtLlxyXG5cdCAqXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIG1lbnUgaXRlbSB0byBzY3JvbGwgdG8uXHJcblx0ICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbE1lbnUoaXRlbT86IE1lbnVJdGVtIHwgbnVsbCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpdGVtID0gaXRlbSA/IGl0ZW0gOiB0aGlzLml0ZW1zWzBdO1xyXG4gICAgICAgICAgICBsZXQgaXRlbUluZGV4ID0gdGhpcy5maW5kSXRlbUluZGV4KGl0ZW0pO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtU2VsZWN0b3IgPSBpdGVtLmlkID8gYCMke2l0ZW0uaWR9YCA6IGAjJHt0aGlzLmlkfV9pdGVtJHtpdGVtSW5kZXh9YDtcclxuXHRcdFx0XHR0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsSXRlbUNlbnRlcmVkKGAjJHt0aGlzLmlkfV9saXN0YCwgaXRlbVNlbGVjdG9yKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9IaWdobGlnaHRlZEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxNZW51KHRoaXMuaGlnaGxpZ2h0ZWRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBGaW5kIGEgZ2l2ZW4gaXRlbSdzIGluZGV4IGluIHRoZSBmaWx0ZXJlZCBpdGVtcyBhcnJheS5cclxuXHQgKlxyXG5cdCAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kXHJcblx0ICogQHBhcmFtIGl0ZW1Ub0ZpbmQgVGhlIG1hdGNoaW5nIGl0ZW0gdG8gZmluZCBpbiB0aGUgaXRlbXMgYXJyYXkuXHJcblx0ICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRJdGVtSW5kZXgoaXRlbVRvRmluZD86IE1lbnVJdGVtIHwgbnVsbCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKGl0ZW1Ub0ZpbmQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWwgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkubGFiZWw7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRLZXlkb3duTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gT25seSBhdHRlbXB0IHRvIGFkZCB0aGUgbGlzdGVuZXIgaWYga2V5Ym9hcmQgbmF2IGlzIGVuYWJsZWRcclxuICAgICAgICBpZiAodGhpcy5lbmFibGVLZXlOYXYpIHtcclxuICAgICAgICAgICAgLy8gcmVuZGVyZXIubGlzdGVuIGFkZHMgdGhlIGxpc3RlbmVyIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAgICAvLyBUaGUgbGlzdGVuZXIgcmVtYWlucyBhY3RpdmUgdW50aWwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuXHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMua2V5TmF2aWdhdGUoZXZlbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtZW51IGl0ZW0gaWRzIHVzaW5nIGl0cyBpbmRleCBpZiBpdGVtIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEl0ZW1JZHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pZCA9IGl0ZW0uaWQgPyBpdGVtLmlkIDogdGhpcy5pZCArICdfaXRlbScgKyBpbmRleDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxuYXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFyZW50XCJcclxuICAgICAgICAgW2NsYXNzLm5vLWRhdGFdPVwic2hvd05vSXRlbXMgJiYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApXCI+XHJcbiAgICAgICAgPGhlYWRlciBpZD1cInt7aWR9fV9oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMyBwLTFcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImhpZ2hsaWdodGVkSXRlbUluZGV4ID09PSAtMVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInBhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFjaygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTkwIGZsZXgtc2hyaW5rXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCB0ZXh0LXRydW5jYXRlIGZsZXgtZ3Jvd1wiPnt7cGFyZW50Py5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuXHJcbiAgICAgICAgPHVsIGlkPVwie3tpZH19X2xpc3RcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInB5LTFcIj5cclxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCJcclxuICAgICAgICAgICAgICAgIGlkPVwie3tpdGVtLmlkIHx8IGlkICsgJ19pdGVtJyArIGl9fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInt7aXRlbS5kaXNwbGF5IHx8ICdpdGVtJ319IHt7aXRlbS5jbGFzc0xpc3R9fVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiaXRlbS5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgZWNOYXZJdGVtQWN0aXZlPVwiaXMtc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZVF1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXNcIlxyXG4gICAgICAgICAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZVVybF09XCJpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICAgICBbZWNOYXZJdGVtQWN0aXZlRXhhY3RNYXRjaF09J2l0ZW0uaXNBY3RpdmVFeGFjdE1hdGNoJ1xyXG4gICAgICAgICAgICAgICAgKHJvdXRlckxpbmtBY3RpdmF0ZWQpPVwic2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaGlnaGxpZ2h0ZWQnOihzZWxlY3RlZCA9PT0gaXRlbSAmJiBpdGVtPy5kaXNwbGF5ICE9PSAnaGVhZGluZycpIHx8IGhpZ2hsaWdodGVkSXRlbSA9PT0gaXRlbSwgJ2lzLWxpbmsnOiBpdGVtLnVybCwgJ2lzLWRpc2FibGVkJzogaXRlbS5kaXNhYmxlZCwgJ2lzLXJlYWRvbmx5JzogaXRlbS5yZWFkb25seSwgJ2lzLWNoZWNrZWQnOiBpdGVtLmNoZWNrZWQsICd0ZXh0LWhlYWRpbmctMyc6IGl0ZW0/LmRpc3BsYXkgPT09ICdoZWFkaW5nJ31cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgIWl0ZW0uZXh0ZXJuYWxMaW5rXCJcclxuICAgICAgICAgICAgICAgICAgIGlkPVwie3tpdGVtLmlkfX1fbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCJcclxuICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0udXJsXCJcclxuICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJpdGVtLnF1ZXJ5UGFyYW1zIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgaXRlbS5leHRlcm5hbExpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2l0ZW0uaWR9fV9saW5rXCJcclxuICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3t0cnVuY2F0ZUl0ZW1zID8gaXRlbS5sYWJlbCA6ICcnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgaHJlZj1cInt7aXRlbS51cmx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJ7e2l0ZW0udGFyZ2V0IHx8ICdfc2VsZid9fVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3t0cnVuY2F0ZUl0ZW1zID8gaXRlbS5sYWJlbCA6ICcnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDxwIGNsYXNzPVwibm8tZGF0YS1tZXNzYWdlXCI+e3tub0RhdGFUZXh0IHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENoaWxkIG1lbnUgKFJlbmRlcmVkIHRvIHRoZSByaWdodCkgLS0+XHJcbiAgICA8ZWMtbWVudSAqbmdJZj1cInNlbGVjdGVkPy5pdGVtc1wiXHJcbiAgICAgICAgICAgICBpZD1cInt7aWR9fV9jaGlsZFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImNoaWxkXCJcclxuICAgICAgICAgICAgIFtwYXJlbnRdPVwic2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgW2l0ZW1zXT1cInNlbGVjdGVkPy5pdGVtc1wiXHJcbiAgICAgICAgICAgICBbc2hvd05vSXRlbXNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbdGVtcGxhdGVUeXBlXT1cInRlbXBsYXRlVHlwZVwiXHJcbiAgICAgICAgICAgICBbZW5hYmxlS2V5TmF2XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgW3RydW5jYXRlSXRlbXNdPVwidHJ1bmNhdGVJdGVtc1wiXHJcbiAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cIm9uU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKG1lbnVDbG9zZWQpPVwidG9nZ2xlQ2hpbGRNZW51KGZhbHNlKVwiPlxyXG4gICAgPC9lYy1tZW51PlxyXG48L25hdj5cclxuXHJcbjwhLS0gJ2xhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2xhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDxzcGFuIGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXNcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdjaGVja0FuZExhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2NoZWNrQW5kTGFiZWxcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWNoZWNrIGVjLWljb24tc21cIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJ1wiPjwvaT5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fSBtbC0yXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCI+PC9pPlxyXG5cclxuICAgIDxzcGFuIGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXNcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdpY29uQW5kTGFiZWwnIEl0ZW0gVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkFuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDwhLS0gSWYgbWVudUl0ZW0uaWNvbiBleGlzdHMgYW5kIGlzIG5vdCBibGFuaywgc2hvdyB0aGUgaWNvbiBpbiB0aGUgbWVudSAtLT5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19XCJcclxuICAgICAgICpuZ0lmPVwiKGl0ZW0uaWNvbiAmJiBpdGVtLmljb24gIT09ICcnKSB8fCBwcmVzZXJ2ZUljb25TcGFjZVwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNpY29uTGFiZWxDYXB0aW9uXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19XCJcclxuICAgICAgICpuZ0lmPVwiKGl0ZW0uaWNvbiAmJiBpdGVtLmljb24gIT09ICcnKSB8fCBwcmVzZXJ2ZUljb25TcGFjZVwiPjwvaT5cclxuICAgIDxkaXYgKm5nSWY9XCJpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJ1wiXHJcbiAgICAgICAgIGNsYXNzPVwibGFiZWwgZmxleC1ncm93XCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktMVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgaWQ9XCJ7e2l0ZW0uaWR9fV9jYXB0aW9uXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jYXB0aW9uXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jYXB0aW9uLTFcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5jYXB0aW9ufX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGgzICpuZ0lmPVwiaXRlbS5kaXNwbGF5ID09PSAnaGVhZGluZydcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleC1ncm93IHRleHQtaGVhZGluZy0zIGFsaWduLXNlbGYtY2VudGVyXCJcclxuICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L2gzPlxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwIGFsaWduLXNlbGYtY2VudGVyXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXNcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+Il19
|