button-radio.directive.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { ChangeDetectorRef, Directive, ElementRef, forwardRef, HostBinding, HostListener, Input, Optional, Renderer2 } from '@angular/core';
  6. import { NG_VALUE_ACCESSOR } from '@angular/forms';
  7. import { ButtonRadioGroupDirective } from './button-radio-group.directive';
  8. /** @type {?} */
  9. export var RADIO_CONTROL_VALUE_ACCESSOR = {
  10. provide: NG_VALUE_ACCESSOR,
  11. /* tslint:disable-next-line: no-use-before-declare */
  12. useExisting: forwardRef((/**
  13. * @return {?}
  14. */
  15. function () { return ButtonRadioDirective; })),
  16. multi: true
  17. };
  18. /**
  19. * Create radio buttons or groups of buttons.
  20. * A value of a selected button is bound to a variable specified via ngModel.
  21. */
  22. var ButtonRadioDirective = /** @class */ (function () {
  23. function ButtonRadioDirective(el, cdr, group, renderer) {
  24. this.el = el;
  25. this.cdr = cdr;
  26. this.group = group;
  27. this.renderer = renderer;
  28. this.onChange = Function.prototype;
  29. this.onTouched = Function.prototype;
  30. }
  31. Object.defineProperty(ButtonRadioDirective.prototype, "value", {
  32. /** Current value of radio component or group */
  33. get: /**
  34. * Current value of radio component or group
  35. * @return {?}
  36. */
  37. function () {
  38. return this.group ? this.group.value : this._value;
  39. },
  40. set: /**
  41. * @param {?} value
  42. * @return {?}
  43. */
  44. function (value) {
  45. if (this.group) {
  46. this.group.value = value;
  47. return;
  48. }
  49. this._value = value;
  50. },
  51. enumerable: true,
  52. configurable: true
  53. });
  54. Object.defineProperty(ButtonRadioDirective.prototype, "disabled", {
  55. /** If `true` — radio button is disabled */
  56. get: /**
  57. * If `true` — radio button is disabled
  58. * @return {?}
  59. */
  60. function () {
  61. return this._disabled;
  62. },
  63. set: /**
  64. * @param {?} disabled
  65. * @return {?}
  66. */
  67. function (disabled) {
  68. this._disabled = disabled;
  69. this.setDisabledState(disabled);
  70. },
  71. enumerable: true,
  72. configurable: true
  73. });
  74. Object.defineProperty(ButtonRadioDirective.prototype, "isActive", {
  75. get: /**
  76. * @return {?}
  77. */
  78. function () {
  79. return this.btnRadio === this.value;
  80. },
  81. enumerable: true,
  82. configurable: true
  83. });
  84. /**
  85. * @return {?}
  86. */
  87. ButtonRadioDirective.prototype.onClick = /**
  88. * @return {?}
  89. */
  90. function () {
  91. if (this.el.nativeElement.attributes.disabled || !this.uncheckable && this.btnRadio === this.value) {
  92. return;
  93. }
  94. this.value = this.uncheckable && this.btnRadio === this.value ? undefined : this.btnRadio;
  95. this._onChange(this.value);
  96. };
  97. /**
  98. * @return {?}
  99. */
  100. ButtonRadioDirective.prototype.ngOnInit = /**
  101. * @return {?}
  102. */
  103. function () {
  104. this.uncheckable = typeof this.uncheckable !== 'undefined';
  105. };
  106. /**
  107. * @return {?}
  108. */
  109. ButtonRadioDirective.prototype.onBlur = /**
  110. * @return {?}
  111. */
  112. function () {
  113. this.onTouched();
  114. };
  115. /**
  116. * @param {?} value
  117. * @return {?}
  118. */
  119. ButtonRadioDirective.prototype._onChange = /**
  120. * @param {?} value
  121. * @return {?}
  122. */
  123. function (value) {
  124. if (this.group) {
  125. this.group.onTouched();
  126. this.group.onChange(value);
  127. return;
  128. }
  129. this.onTouched();
  130. this.onChange(value);
  131. };
  132. // ControlValueAccessor
  133. // model -> view
  134. // ControlValueAccessor
  135. // model -> view
  136. /**
  137. * @param {?} value
  138. * @return {?}
  139. */
  140. ButtonRadioDirective.prototype.writeValue =
  141. // ControlValueAccessor
  142. // model -> view
  143. /**
  144. * @param {?} value
  145. * @return {?}
  146. */
  147. function (value) {
  148. this.value = value;
  149. this.cdr.markForCheck();
  150. };
  151. /**
  152. * @param {?} fn
  153. * @return {?}
  154. */
  155. ButtonRadioDirective.prototype.registerOnChange = /**
  156. * @param {?} fn
  157. * @return {?}
  158. */
  159. function (fn) {
  160. this.onChange = fn;
  161. };
  162. /**
  163. * @param {?} fn
  164. * @return {?}
  165. */
  166. ButtonRadioDirective.prototype.registerOnTouched = /**
  167. * @param {?} fn
  168. * @return {?}
  169. */
  170. function (fn) {
  171. this.onTouched = fn;
  172. };
  173. /**
  174. * @param {?} disabled
  175. * @return {?}
  176. */
  177. ButtonRadioDirective.prototype.setDisabledState = /**
  178. * @param {?} disabled
  179. * @return {?}
  180. */
  181. function (disabled) {
  182. if (disabled) {
  183. this.renderer.setAttribute(this.el.nativeElement, 'disabled', 'disabled');
  184. return;
  185. }
  186. this.renderer.removeAttribute(this.el.nativeElement, 'disabled');
  187. };
  188. ButtonRadioDirective.decorators = [
  189. { type: Directive, args: [{
  190. selector: '[btnRadio]',
  191. providers: [RADIO_CONTROL_VALUE_ACCESSOR]
  192. },] }
  193. ];
  194. /** @nocollapse */
  195. ButtonRadioDirective.ctorParameters = function () { return [
  196. { type: ElementRef },
  197. { type: ChangeDetectorRef },
  198. { type: ButtonRadioGroupDirective, decorators: [{ type: Optional }] },
  199. { type: Renderer2 }
  200. ]; };
  201. ButtonRadioDirective.propDecorators = {
  202. btnRadio: [{ type: Input }],
  203. uncheckable: [{ type: Input }],
  204. value: [{ type: Input }],
  205. disabled: [{ type: Input }],
  206. isActive: [{ type: HostBinding, args: ['class.active',] }, { type: HostBinding, args: ['attr.aria-pressed',] }],
  207. onClick: [{ type: HostListener, args: ['click',] }]
  208. };
  209. return ButtonRadioDirective;
  210. }());
  211. export { ButtonRadioDirective };
  212. if (false) {
  213. /** @type {?} */
  214. ButtonRadioDirective.prototype.onChange;
  215. /** @type {?} */
  216. ButtonRadioDirective.prototype.onTouched;
  217. /**
  218. * Radio button value, will be set to `ngModel`
  219. * @type {?}
  220. */
  221. ButtonRadioDirective.prototype.btnRadio;
  222. /**
  223. * If `true` — radio button can be unchecked
  224. * @type {?}
  225. */
  226. ButtonRadioDirective.prototype.uncheckable;
  227. /**
  228. * @type {?}
  229. * @private
  230. */
  231. ButtonRadioDirective.prototype._value;
  232. /**
  233. * @type {?}
  234. * @private
  235. */
  236. ButtonRadioDirective.prototype._disabled;
  237. /**
  238. * @type {?}
  239. * @private
  240. */
  241. ButtonRadioDirective.prototype.el;
  242. /**
  243. * @type {?}
  244. * @private
  245. */
  246. ButtonRadioDirective.prototype.cdr;
  247. /**
  248. * @type {?}
  249. * @private
  250. */
  251. ButtonRadioDirective.prototype.group;
  252. /**
  253. * @type {?}
  254. * @private
  255. */
  256. ButtonRadioDirective.prototype.renderer;
  257. }
  258. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLXJhZGlvLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1ib290c3RyYXAvYnV0dG9ucy8iLCJzb3VyY2VzIjpbImJ1dHRvbi1yYWRpby5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUVSLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBRTNFLE1BQU0sS0FBTyw0QkFBNEIsR0FBYTtJQUNwRCxPQUFPLEVBQUUsaUJBQWlCOztJQUUxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsY0FBTSxPQUFBLG9CQUFvQixFQUFwQixDQUFvQixFQUFDO0lBQ25ELEtBQUssRUFBRSxJQUFJO0NBQ1o7Ozs7O0FBTUQ7SUE0Q0UsOEJBQ1UsRUFBYyxFQUNkLEdBQXNCLEVBQ1YsS0FBZ0MsRUFDNUMsUUFBbUI7UUFIbkIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ1YsVUFBSyxHQUFMLEtBQUssQ0FBMkI7UUFDNUMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTNDN0IsYUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDOUIsY0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUEyQzVCLENBQUM7SUFwQ0osc0JBQWEsdUNBQUs7UUFEbEIsZ0RBQWdEOzs7OztRQUNoRDtZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckQsQ0FBQzs7Ozs7UUFFRCxVQUFVLEtBQW9CO1lBQzVCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBRXpCLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7OztPQVRBO0lBV0Qsc0JBQWEsMENBQVE7UUFEckIsMkNBQTJDOzs7OztRQUMzQztZQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDOzs7OztRQUVELFVBQWEsUUFBaUI7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7OztPQUxBO0lBT0Qsc0JBRUksMENBQVE7Ozs7UUFGWjtZQUdFLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RDLENBQUM7OztPQUFBOzs7O0lBYUQsc0NBQU87OztJQURQO1FBRUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbEcsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7Ozs7SUFFRCx1Q0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUM7SUFDN0QsQ0FBQzs7OztJQUVELHFDQUFNOzs7SUFBTjtRQUNFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDOzs7OztJQUVELHdDQUFTOzs7O0lBQVQsVUFBVSxLQUFhO1FBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixnQkFBZ0I7Ozs7Ozs7SUFDaEIseUNBQVU7Ozs7Ozs7SUFBVixVQUFXLEtBQWE7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVELCtDQUFnQjs7OztJQUFoQixVQUFpQixFQUFZO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRUQsZ0RBQWlCOzs7O0lBQWpCLFVBQWtCLEVBQVk7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQzs7Ozs7SUFFRCwrQ0FBZ0I7Ozs7SUFBaEIsVUFBaUIsUUFBaUI7UUFDaEMsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFMUUsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkUsQ0FBQzs7Z0JBdEdGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsU0FBUyxFQUFFLENBQUMsNEJBQTRCLENBQUM7aUJBQzFDOzs7O2dCQTNCQyxVQUFVO2dCQUZWLGlCQUFpQjtnQkFhVix5QkFBeUIsdUJBNEQ3QixRQUFRO2dCQS9EWCxTQUFTOzs7MkJBeUJSLEtBQUs7OEJBRUwsS0FBSzt3QkFFTCxLQUFLOzJCQWFMLEtBQUs7MkJBU0wsV0FBVyxTQUFDLGNBQWMsY0FDMUIsV0FBVyxTQUFDLG1CQUFtQjswQkFlL0IsWUFBWSxTQUFDLE9BQU87O0lBb0R2QiwyQkFBQztDQUFBLEFBdkdELElBdUdDO1NBbkdZLG9CQUFvQjs7O0lBQy9CLHdDQUE4Qjs7SUFDOUIseUNBQStCOzs7OztJQUcvQix3Q0FBMEI7Ozs7O0lBRTFCLDJDQUE4Qjs7Ozs7SUE4QjlCLHNDQUErQjs7Ozs7SUFDL0IseUNBQTJCOzs7OztJQUd6QixrQ0FBc0I7Ozs7O0lBQ3RCLG1DQUE4Qjs7Ozs7SUFDOUIscUNBQW9EOzs7OztJQUNwRCx3Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvblJhZGlvR3JvdXBEaXJlY3RpdmUgfSBmcm9tICcuL2J1dHRvbi1yYWRpby1ncm91cC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgUkFESU9fQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZSAqL1xuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBCdXR0b25SYWRpb0RpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlXG59O1xuXG4vKipcbiAqIENyZWF0ZSByYWRpbyBidXR0b25zIG9yIGdyb3VwcyBvZiBidXR0b25zLlxuICogQSB2YWx1ZSBvZiBhIHNlbGVjdGVkIGJ1dHRvbiBpcyBib3VuZCB0byBhIHZhcmlhYmxlIHNwZWNpZmllZCB2aWEgbmdNb2RlbC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2J0blJhZGlvXScsXG4gIHByb3ZpZGVyczogW1JBRElPX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIEJ1dHRvblJhZGlvRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIG9uQ2hhbmdlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICBvblRvdWNoZWQgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbiAgLyoqIFJhZGlvIGJ1dHRvbiB2YWx1ZSwgd2lsbCBiZSBzZXQgdG8gYG5nTW9kZWxgICovXG4gIEBJbnB1dCgpIGJ0blJhZGlvOiBzdHJpbmc7XG4gIC8qKiBJZiBgdHJ1ZWAg4oCUIHJhZGlvIGJ1dHRvbiBjYW4gYmUgdW5jaGVja2VkICovXG4gIEBJbnB1dCgpIHVuY2hlY2thYmxlOiBib29sZWFuO1xuICAvKiogQ3VycmVudCB2YWx1ZSBvZiByYWRpbyBjb21wb25lbnQgb3IgZ3JvdXAgKi9cbiAgQElucHV0KCkgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwID8gdGhpcy5ncm91cC52YWx1ZSA6IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbHVlOiBudWxsIHwgc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgIHRoaXMuZ3JvdXAudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8qKiBJZiBgdHJ1ZWAg4oCUIHJhZGlvIGJ1dHRvbiBpcyBkaXNhYmxlZCAqL1xuICBASW5wdXQoKSBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB0aGlzLnNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQpO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hY3RpdmUnKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1wcmVzc2VkJylcbiAgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ0blJhZGlvID09PSB0aGlzLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsdWU6ICBudWxsIHwgc3RyaW5nO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGdyb3VwOiBCdXR0b25SYWRpb0dyb3VwRGlyZWN0aXZlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBvbkNsaWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlcy5kaXNhYmxlZCB8fCAhdGhpcy51bmNoZWNrYWJsZSAmJiB0aGlzLmJ0blJhZGlvID09PSB0aGlzLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudW5jaGVja2FibGUgJiYgdGhpcy5idG5SYWRpbyA9PT0gdGhpcy52YWx1ZSA/IHVuZGVmaW5lZCA6IHRoaXMuYnRuUmFkaW87XG4gICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVuY2hlY2thYmxlID0gdHlwZW9mIHRoaXMudW5jaGVja2FibGUgIT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBfb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyb3VwKSB7XG4gICAgICB0aGlzLmdyb3VwLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5ncm91cC5vbkNoYW5nZSh2YWx1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIC8vIG1vZGVsIC0+IHZpZXdcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcpO1xuICB9XG59XG4iXX0=