contextMenu.component.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Inject, Input, Optional, Output, QueryList, ViewChild, ViewEncapsulation, } from '@angular/core';
  6. import { Subscription } from 'rxjs';
  7. import { first } from 'rxjs/operators';
  8. import { ContextMenuItemDirective } from './contextMenu.item.directive';
  9. import { ContextMenuService } from './contextMenu.service';
  10. import { CONTEXT_MENU_OPTIONS } from './contextMenu.tokens';
  11. /**
  12. * @record
  13. */
  14. export function ILinkConfig() { }
  15. if (false) {
  16. /** @type {?} */
  17. ILinkConfig.prototype.click;
  18. /** @type {?|undefined} */
  19. ILinkConfig.prototype.enabled;
  20. /** @type {?} */
  21. ILinkConfig.prototype.html;
  22. }
  23. /**
  24. * @record
  25. */
  26. export function MouseLocation() { }
  27. if (false) {
  28. /** @type {?|undefined} */
  29. MouseLocation.prototype.left;
  30. /** @type {?|undefined} */
  31. MouseLocation.prototype.marginLeft;
  32. /** @type {?|undefined} */
  33. MouseLocation.prototype.marginTop;
  34. /** @type {?|undefined} */
  35. MouseLocation.prototype.top;
  36. }
  37. export class ContextMenuComponent {
  38. /**
  39. * @param {?} _contextMenuService
  40. * @param {?} changeDetector
  41. * @param {?} elementRef
  42. * @param {?} options
  43. */
  44. constructor(_contextMenuService, changeDetector, elementRef, options) {
  45. this._contextMenuService = _contextMenuService;
  46. this.changeDetector = changeDetector;
  47. this.elementRef = elementRef;
  48. this.options = options;
  49. this.menuClass = "";
  50. this.autoFocus = false;
  51. this.useBootstrap4 = false;
  52. this.disabled = false;
  53. this.close = new EventEmitter();
  54. this.open = new EventEmitter();
  55. this.visibleMenuItems = [];
  56. this.links = [];
  57. this.subscription = new Subscription();
  58. if (options) {
  59. this.autoFocus = options.autoFocus;
  60. this.useBootstrap4 = options.useBootstrap4;
  61. }
  62. this.subscription.add(_contextMenuService.show.subscribe((/**
  63. * @param {?} menuEvent
  64. * @return {?}
  65. */
  66. menuEvent => {
  67. this.onMenuEvent(menuEvent);
  68. })));
  69. }
  70. /**
  71. * @return {?}
  72. */
  73. ngOnDestroy() {
  74. this.subscription.unsubscribe();
  75. }
  76. /**
  77. * @param {?} menuEvent
  78. * @return {?}
  79. */
  80. onMenuEvent(menuEvent) {
  81. if (this.disabled) {
  82. return;
  83. }
  84. const { contextMenu, event, item } = menuEvent;
  85. if (contextMenu && contextMenu !== this) {
  86. return;
  87. }
  88. this.event = event;
  89. this.item = item;
  90. this.setVisibleMenuItems();
  91. this._contextMenuService.openContextMenu(Object.assign({}, menuEvent, { menuItems: this.visibleMenuItems, menuClass: this.menuClass }));
  92. this._contextMenuService.close.asObservable().pipe(first()).subscribe((/**
  93. * @param {?} closeEvent
  94. * @return {?}
  95. */
  96. closeEvent => this.close.emit(closeEvent)));
  97. this.open.next(menuEvent);
  98. }
  99. /**
  100. * @param {?} menuItem
  101. * @return {?}
  102. */
  103. isMenuItemVisible(menuItem) {
  104. return this.evaluateIfFunction(menuItem.visible);
  105. }
  106. /**
  107. * @return {?}
  108. */
  109. setVisibleMenuItems() {
  110. this.visibleMenuItems = this.menuItems.filter((/**
  111. * @param {?} menuItem
  112. * @return {?}
  113. */
  114. menuItem => this.isMenuItemVisible(menuItem)));
  115. }
  116. /**
  117. * @param {?} value
  118. * @return {?}
  119. */
  120. evaluateIfFunction(value) {
  121. if (value instanceof Function) {
  122. return value(this.item);
  123. }
  124. return value;
  125. }
  126. }
  127. ContextMenuComponent.decorators = [
  128. { type: Component, args: [{
  129. encapsulation: ViewEncapsulation.None,
  130. selector: 'context-menu',
  131. template: ` `,
  132. styles: [`
  133. .cdk-overlay-container {
  134. position: fixed;
  135. z-index: 1000;
  136. pointer-events: none;
  137. top: 0;
  138. left: 0;
  139. width: 100%;
  140. height: 100%;
  141. }
  142. .ngx-contextmenu.cdk-overlay-pane {
  143. position: absolute;
  144. pointer-events: auto;
  145. box-sizing: border-box;
  146. }
  147. `]
  148. }] }
  149. ];
  150. /** @nocollapse */
  151. ContextMenuComponent.ctorParameters = () => [
  152. { type: ContextMenuService },
  153. { type: ChangeDetectorRef },
  154. { type: ElementRef },
  155. { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CONTEXT_MENU_OPTIONS,] }] }
  156. ];
  157. ContextMenuComponent.propDecorators = {
  158. menuClass: [{ type: Input }],
  159. autoFocus: [{ type: Input }],
  160. useBootstrap4: [{ type: Input }],
  161. disabled: [{ type: Input }],
  162. close: [{ type: Output }],
  163. open: [{ type: Output }],
  164. menuItems: [{ type: ContentChildren, args: [ContextMenuItemDirective,] }],
  165. menuElement: [{ type: ViewChild, args: ['menu', { static: false },] }]
  166. };
  167. if (false) {
  168. /** @type {?} */
  169. ContextMenuComponent.prototype.menuClass;
  170. /** @type {?} */
  171. ContextMenuComponent.prototype.autoFocus;
  172. /** @type {?} */
  173. ContextMenuComponent.prototype.useBootstrap4;
  174. /** @type {?} */
  175. ContextMenuComponent.prototype.disabled;
  176. /** @type {?} */
  177. ContextMenuComponent.prototype.close;
  178. /** @type {?} */
  179. ContextMenuComponent.prototype.open;
  180. /** @type {?} */
  181. ContextMenuComponent.prototype.menuItems;
  182. /** @type {?} */
  183. ContextMenuComponent.prototype.menuElement;
  184. /** @type {?} */
  185. ContextMenuComponent.prototype.visibleMenuItems;
  186. /** @type {?} */
  187. ContextMenuComponent.prototype.links;
  188. /** @type {?} */
  189. ContextMenuComponent.prototype.item;
  190. /** @type {?} */
  191. ContextMenuComponent.prototype.event;
  192. /**
  193. * @type {?}
  194. * @private
  195. */
  196. ContextMenuComponent.prototype.subscription;
  197. /**
  198. * @type {?}
  199. * @private
  200. */
  201. ContextMenuComponent.prototype._contextMenuService;
  202. /**
  203. * @type {?}
  204. * @private
  205. */
  206. ContextMenuComponent.prototype.changeDetector;
  207. /**
  208. * @type {?}
  209. * @private
  210. */
  211. ContextMenuComponent.prototype.elementRef;
  212. /**
  213. * @type {?}
  214. * @private
  215. */
  216. ContextMenuComponent.prototype.options;
  217. }
  218. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dE1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWNvbnRleHRtZW51LyIsInNvdXJjZXMiOlsibGliL2NvbnRleHRNZW51LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBRVosTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBaUQsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUU1RCxpQ0FJQzs7O0lBSEMsNEJBQWdEOztJQUNoRCw4QkFBaUM7O0lBQ2pDLDJCQUE0Qjs7Ozs7QUFFOUIsbUNBS0M7OztJQUpDLDZCQUFjOztJQUNkLG1DQUFvQjs7SUFDcEIsa0NBQW1COztJQUNuQiw0QkFBYTs7QUF3QmYsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7OztJQWdCL0IsWUFDVSxtQkFBdUMsRUFDdkMsY0FBaUMsRUFDakMsVUFBc0IsRUFFUSxPQUE0QjtRQUoxRCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRVEsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFwQnBELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDaEIsVUFBSyxHQUF3QyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hFLFNBQUksR0FBeUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxRSxxQkFBZ0IsR0FBK0IsRUFBRSxDQUFDO1FBRWxELFVBQUssR0FBa0IsRUFBRSxDQUFDO1FBR3pCLGlCQUFZLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFTdEQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVM7Ozs7UUFBQyxTQUFTLENBQUMsRUFBRTtZQUNuRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDTixDQUFDOzs7O0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7Ozs7O0lBRU0sV0FBVyxDQUFDLFNBQWlDO1FBQ2xELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1I7Y0FDSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUztRQUM5QyxJQUFJLFdBQVcsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLG1CQUFNLFNBQVMsSUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFHLENBQUM7UUFDeEgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTOzs7O1FBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Ozs7O0lBRU0saUJBQWlCLENBQUMsUUFBa0M7UUFDekQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7Ozs7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUM7SUFDOUYsQ0FBQzs7Ozs7SUFFTSxrQkFBa0IsQ0FBQyxLQUFVO1FBQ2xDLElBQUksS0FBSyxZQUFZLFFBQVEsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OztZQXRGRixTQUFTLFNBQUM7Z0JBQ1QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLFFBQVEsRUFBRSxjQUFjO2dCQWlCeEIsUUFBUSxFQUFFLEdBQUc7eUJBaEJKOzs7Ozs7Ozs7Ozs7Ozs7R0FlUjthQUVGOzs7O1lBbkNRLGtCQUFrQjtZQXBCdkIsaUJBQWlCO1lBR2pCLFVBQVU7NENBeUVULFFBQVEsWUFDUixNQUFNLFNBQUMsb0JBQW9COzs7d0JBcEI3QixLQUFLO3dCQUNMLEtBQUs7NEJBQ0wsS0FBSzt1QkFDTCxLQUFLO29CQUNMLE1BQU07bUJBQ04sTUFBTTt3QkFDTixlQUFlLFNBQUMsd0JBQXdCOzBCQUN4QyxTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7OztJQVBwQyx5Q0FBK0I7O0lBQy9CLHlDQUFrQzs7SUFDbEMsNkNBQXNDOztJQUN0Qyx3Q0FBaUM7O0lBQ2pDLHFDQUFpRjs7SUFDakYsb0NBQWlGOztJQUNqRix5Q0FBaUc7O0lBQ2pHLDJDQUFxRTs7SUFDckUsZ0RBQXlEOztJQUV6RCxxQ0FBaUM7O0lBQ2pDLG9DQUFpQjs7SUFDakIscUNBQXlDOzs7OztJQUN6Qyw0Q0FBd0Q7Ozs7O0lBR3RELG1EQUErQzs7Ozs7SUFDL0MsOENBQXlDOzs7OztJQUN6QywwQ0FBOEI7Ozs7O0lBQzlCLHVDQUNrRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2NvbnRleHRNZW51Lml0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IElDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHRNZW51Lm9wdGlvbnMnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVTZXJ2aWNlLCBJQ29udGV4dE1lbnVDbGlja0V2ZW50LCBDbG9zZUNvbnRleHRNZW51RXZlbnQgfSBmcm9tICcuL2NvbnRleHRNZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ09OVEVYVF9NRU5VX09QVElPTlMgfSBmcm9tICcuL2NvbnRleHRNZW51LnRva2Vucyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmtDb25maWcge1xuICBjbGljazogKGl0ZW06IGFueSwgJGV2ZW50PzogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgZW5hYmxlZD86IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gIGh0bWw6IChpdGVtOiBhbnkpID0+IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTW91c2VMb2NhdGlvbiB7XG4gIGxlZnQ/OiBzdHJpbmc7XG4gIG1hcmdpbkxlZnQ/OiBzdHJpbmc7XG4gIG1hcmdpblRvcD86IHN0cmluZztcbiAgdG9wPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc2VsZWN0b3I6ICdjb250ZXh0LW1lbnUnLFxuICBzdHlsZXM6IFtgXG4gICAgLmNkay1vdmVybGF5LWNvbnRhaW5lciB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB0b3A6IDA7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICAgIC5uZ3gtY29udGV4dG1lbnUuY2RrLW92ZXJsYXktcGFuZSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICBgXSxcbiAgdGVtcGxhdGU6IGAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwdWJsaWMgbWVudUNsYXNzID0gXCJcIjtcbiAgQElucHV0KCkgcHVibGljIGF1dG9Gb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgdXNlQm9vdHN0cmFwNCA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjbG9zZTogRXZlbnRFbWl0dGVyPENsb3NlQ29udGV4dE1lbnVFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb3BlbjogRXZlbnRFbWl0dGVyPElDb250ZXh0TWVudUNsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAQ29udGVudENoaWxkcmVuKENvbnRleHRNZW51SXRlbURpcmVjdGl2ZSkgcHVibGljIG1lbnVJdGVtczogUXVlcnlMaXN0PENvbnRleHRNZW51SXRlbURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGQoJ21lbnUnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIG1lbnVFbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgdmlzaWJsZU1lbnVJdGVtczogQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlW10gPSBbXTtcblxuICBwdWJsaWMgbGlua3M6IElMaW5rQ29uZmlnW10gPSBbXTtcbiAgcHVibGljIGl0ZW06IGFueTtcbiAgcHVibGljIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jb250ZXh0TWVudVNlcnZpY2U6IENvbnRleHRNZW51U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KENPTlRFWFRfTUVOVV9PUFRJT05TKSBwcml2YXRlIG9wdGlvbnM6IElDb250ZXh0TWVudU9wdGlvbnMsXG4gICkge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICB0aGlzLmF1dG9Gb2N1cyA9IG9wdGlvbnMuYXV0b0ZvY3VzO1xuICAgICAgdGhpcy51c2VCb290c3RyYXA0ID0gb3B0aW9ucy51c2VCb290c3RyYXA0O1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoX2NvbnRleHRNZW51U2VydmljZS5zaG93LnN1YnNjcmliZShtZW51RXZlbnQgPT4ge1xuICAgICAgdGhpcy5vbk1lbnVFdmVudChtZW51RXZlbnQpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uTWVudUV2ZW50KG1lbnVFdmVudDogSUNvbnRleHRNZW51Q2xpY2tFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgY29udGV4dE1lbnUsIGV2ZW50LCBpdGVtIH0gPSBtZW51RXZlbnQ7XG4gICAgaWYgKGNvbnRleHRNZW51ICYmIGNvbnRleHRNZW51ICE9PSB0aGlzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuc2V0VmlzaWJsZU1lbnVJdGVtcygpO1xuICAgIHRoaXMuX2NvbnRleHRNZW51U2VydmljZS5vcGVuQ29udGV4dE1lbnUoeyAuLi5tZW51RXZlbnQsIG1lbnVJdGVtczogdGhpcy52aXNpYmxlTWVudUl0ZW1zLCBtZW51Q2xhc3M6IHRoaXMubWVudUNsYXNzIH0pO1xuICAgIHRoaXMuX2NvbnRleHRNZW51U2VydmljZS5jbG9zZS5hc09ic2VydmFibGUoKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShjbG9zZUV2ZW50ID0+IHRoaXMuY2xvc2UuZW1pdChjbG9zZUV2ZW50KSk7XG4gICAgdGhpcy5vcGVuLm5leHQobWVudUV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBpc01lbnVJdGVtVmlzaWJsZShtZW51SXRlbTogQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVJZkZ1bmN0aW9uKG1lbnVJdGVtLnZpc2libGUpO1xuICB9XG5cbiAgcHVibGljIHNldFZpc2libGVNZW51SXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlTWVudUl0ZW1zID0gdGhpcy5tZW51SXRlbXMuZmlsdGVyKG1lbnVJdGVtID0+IHRoaXMuaXNNZW51SXRlbVZpc2libGUobWVudUl0ZW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZUlmRnVuY3Rpb24odmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiB2YWx1ZSh0aGlzLml0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdfQ==