ng-tailwind 4.5.47 → 4.5.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +24 -24
  2. package/animations/ngt-angular-animations.d.ts +5 -5
  3. package/base/ngt-base-ng-model.d.ts +32 -32
  4. package/components/ngt-action/ngt-action.component.d.ts +30 -30
  5. package/components/ngt-action/ngt-action.module.d.ts +10 -10
  6. package/components/ngt-button/ngt-button.component.d.ts +35 -35
  7. package/components/ngt-button/ngt-button.module.d.ts +10 -10
  8. package/components/ngt-checkbox/ngt-checkbox.component.d.ts +53 -53
  9. package/components/ngt-checkbox/ngt-checkbox.module.d.ts +10 -10
  10. package/components/ngt-content/ngt-content.component.d.ts +12 -12
  11. package/components/ngt-content/ngt-content.module.d.ts +8 -8
  12. package/components/ngt-context-menu/ngt-context-menu.component.d.ts +19 -19
  13. package/components/ngt-context-menu/ngt-context-menu.directive.d.ts +25 -25
  14. package/components/ngt-context-menu/ngt-context-menu.module.d.ts +10 -10
  15. package/components/ngt-datatable/ngt-datatable.component.d.ts +117 -117
  16. package/components/ngt-datatable/ngt-datatable.module.d.ts +24 -24
  17. package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +14 -14
  18. package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +14 -14
  19. package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +29 -29
  20. package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +51 -51
  21. package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +22 -22
  22. package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +13 -13
  23. package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +20 -20
  24. package/components/ngt-date/ngt-date.component.d.ts +85 -85
  25. package/components/ngt-date/ngt-date.module.d.ts +13 -13
  26. package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +8 -8
  27. package/components/ngt-dropdown/ngt-dropdown.component.d.ts +53 -53
  28. package/components/ngt-dropdown/ngt-dropdown.module.d.ts +9 -9
  29. package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +14 -14
  30. package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +25 -25
  31. package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +35 -35
  32. package/components/ngt-dropzone/ngt-dropzone.component.d.ts +95 -95
  33. package/components/ngt-dropzone/ngt-dropzone.meta.d.ts +27 -27
  34. package/components/ngt-dropzone/ngt-dropzone.module.d.ts +17 -17
  35. package/components/ngt-floating-button/ngt-floating-button.component.d.ts +35 -35
  36. package/components/ngt-floating-button/ngt-floating-button.module.d.ts +10 -10
  37. package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +10 -10
  38. package/components/ngt-form/ngt-form.component.d.ts +60 -60
  39. package/components/ngt-form/ngt-form.module.d.ts +9 -9
  40. package/components/ngt-header-nav/ngt-header-nav.component.d.ts +14 -14
  41. package/components/ngt-header-nav/ngt-header-nav.module.d.ts +8 -8
  42. package/components/ngt-helper/ngt-helper.component.d.ts +25 -25
  43. package/components/ngt-helper/ngt-helper.module.d.ts +10 -10
  44. package/components/ngt-input/ngt-input.component.d.ts +127 -127
  45. package/components/ngt-input/ngt-input.module.d.ts +14 -14
  46. package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +12 -12
  47. package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +5 -5
  48. package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +15 -15
  49. package/components/ngt-modal/ngt-modal.component.d.ts +31 -31
  50. package/components/ngt-modal/ngt-modal.module.d.ts +11 -11
  51. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +114 -114
  52. package/components/ngt-multi-select/ngt-multi-select.module.d.ts +15 -15
  53. package/components/ngt-pagination/ngt-pagination.component.d.ts +43 -43
  54. package/components/ngt-pagination/ngt-pagination.module.d.ts +12 -12
  55. package/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.d.ts +21 -21
  56. package/components/ngt-popover/ngt-popover.component.d.ts +31 -31
  57. package/components/ngt-popover/ngt-popover.directive.d.ts +31 -31
  58. package/components/ngt-popover/ngt-popover.module.d.ts +11 -11
  59. package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +12 -12
  60. package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +12 -12
  61. package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +18 -18
  62. package/components/ngt-portlet/ngt-portlet.component.d.ts +20 -20
  63. package/components/ngt-portlet/ngt-portlet.module.d.ts +13 -13
  64. package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +9 -9
  65. package/components/ngt-radio-button/ngt-radio-button.component.d.ts +41 -41
  66. package/components/ngt-radio-button/ngt-radio-button.module.d.ts +11 -11
  67. package/components/ngt-section/ngt-section.component.d.ts +38 -36
  68. package/components/ngt-section/ngt-section.module.d.ts +11 -11
  69. package/components/ngt-select/ngt-select.component.d.ts +149 -149
  70. package/components/ngt-select/ngt-select.directive.d.ts +20 -20
  71. package/components/ngt-select/ngt-select.module.d.ts +16 -16
  72. package/components/ngt-shining/ngt-shining.component.d.ts +19 -19
  73. package/components/ngt-shining/ngt-shining.module.d.ts +8 -8
  74. package/components/ngt-sidenav/ngt-sidenav.component.d.ts +32 -32
  75. package/components/ngt-sidenav/ngt-sidenav.module.d.ts +8 -8
  76. package/components/ngt-slider/ngt-slider.component.d.ts +36 -36
  77. package/components/ngt-slider/ngt-slider.module.d.ts +9 -9
  78. package/components/ngt-svg/ngt-svg.component.d.ts +13 -13
  79. package/components/ngt-svg/ngt-svg.module.d.ts +10 -10
  80. package/components/ngt-tag/ngt-tag.component.d.ts +13 -13
  81. package/components/ngt-tag/ngt-tag.module.d.ts +9 -9
  82. package/components/ngt-textarea/ngt-textarea.component.d.ts +49 -49
  83. package/components/ngt-textarea/ngt-textarea.module.d.ts +13 -13
  84. package/components/ngt-validation/ngt-validation.component.d.ts +13 -13
  85. package/components/ngt-validation/ngt-validation.module.d.ts +8 -8
  86. package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +68 -68
  87. package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +8 -8
  88. package/enums/size.enum.d.ts +8 -8
  89. package/esm2020/animations/ngt-angular-animations.mjs +34 -34
  90. package/esm2020/base/ngt-base-ng-model.mjs +90 -90
  91. package/esm2020/components/ngt-action/ngt-action.component.mjs +96 -96
  92. package/esm2020/components/ngt-action/ngt-action.module.mjs +28 -28
  93. package/esm2020/components/ngt-button/ngt-button.component.mjs +141 -141
  94. package/esm2020/components/ngt-button/ngt-button.module.mjs +28 -28
  95. package/esm2020/components/ngt-checkbox/ngt-checkbox.component.mjs +192 -192
  96. package/esm2020/components/ngt-checkbox/ngt-checkbox.module.mjs +28 -28
  97. package/esm2020/components/ngt-content/ngt-content.component.mjs +32 -32
  98. package/esm2020/components/ngt-content/ngt-content.module.mjs +20 -20
  99. package/esm2020/components/ngt-context-menu/ngt-context-menu.component.mjs +25 -25
  100. package/esm2020/components/ngt-context-menu/ngt-context-menu.directive.mjs +89 -89
  101. package/esm2020/components/ngt-context-menu/ngt-context-menu.module.mjs +33 -33
  102. package/esm2020/components/ngt-datatable/ngt-datatable.component.mjs +432 -432
  103. package/esm2020/components/ngt-datatable/ngt-datatable.module.mjs +95 -95
  104. package/esm2020/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +57 -57
  105. package/esm2020/components/ngt-datatable/ngt-td/ngt-td.component.mjs +62 -62
  106. package/esm2020/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +113 -113
  107. package/esm2020/components/ngt-datatable/ngt-th/ngt-th.component.mjs +211 -211
  108. package/esm2020/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +91 -91
  109. package/esm2020/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +55 -55
  110. package/esm2020/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +86 -86
  111. package/esm2020/components/ngt-date/ngt-date.component.mjs +438 -438
  112. package/esm2020/components/ngt-date/ngt-date.module.mjs +40 -40
  113. package/esm2020/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +19 -19
  114. package/esm2020/components/ngt-dropdown/ngt-dropdown.component.mjs +204 -204
  115. package/esm2020/components/ngt-dropdown/ngt-dropdown.module.mjs +21 -21
  116. package/esm2020/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +54 -54
  117. package/esm2020/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +66 -66
  118. package/esm2020/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +94 -94
  119. package/esm2020/components/ngt-dropzone/ngt-dropzone.component.mjs +496 -496
  120. package/esm2020/components/ngt-dropzone/ngt-dropzone.meta.mjs +24 -24
  121. package/esm2020/components/ngt-dropzone/ngt-dropzone.module.mjs +55 -55
  122. package/esm2020/components/ngt-floating-button/ngt-floating-button.component.mjs +119 -119
  123. package/esm2020/components/ngt-floating-button/ngt-floating-button.module.mjs +28 -28
  124. package/esm2020/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +22 -22
  125. package/esm2020/components/ngt-form/ngt-form.component.mjs +207 -207
  126. package/esm2020/components/ngt-form/ngt-form.module.mjs +29 -29
  127. package/esm2020/components/ngt-header-nav/ngt-header-nav.component.mjs +39 -39
  128. package/esm2020/components/ngt-header-nav/ngt-header-nav.module.mjs +20 -20
  129. package/esm2020/components/ngt-helper/ngt-helper.component.mjs +68 -68
  130. package/esm2020/components/ngt-helper/ngt-helper.module.mjs +28 -28
  131. package/esm2020/components/ngt-input/ngt-input.component.mjs +837 -837
  132. package/esm2020/components/ngt-input/ngt-input.module.mjs +47 -47
  133. package/esm2020/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +26 -26
  134. package/esm2020/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +11 -11
  135. package/esm2020/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +38 -38
  136. package/esm2020/components/ngt-modal/ngt-modal.component.mjs +121 -121
  137. package/esm2020/components/ngt-modal/ngt-modal.module.mjs +39 -39
  138. package/esm2020/components/ngt-multi-select/ngt-multi-select.component.mjs +482 -482
  139. package/esm2020/components/ngt-multi-select/ngt-multi-select.module.mjs +52 -52
  140. package/esm2020/components/ngt-pagination/ngt-pagination.component.mjs +162 -162
  141. package/esm2020/components/ngt-pagination/ngt-pagination.module.mjs +36 -36
  142. package/esm2020/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +58 -58
  143. package/esm2020/components/ngt-popover/ngt-popover.component.mjs +85 -85
  144. package/esm2020/components/ngt-popover/ngt-popover.directive.mjs +126 -126
  145. package/esm2020/components/ngt-popover/ngt-popover.module.mjs +36 -36
  146. package/esm2020/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +34 -34
  147. package/esm2020/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +35 -35
  148. package/esm2020/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +56 -56
  149. package/esm2020/components/ngt-portlet/ngt-portlet.component.mjs +74 -74
  150. package/esm2020/components/ngt-portlet/ngt-portlet.module.mjs +47 -47
  151. package/esm2020/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +19 -19
  152. package/esm2020/components/ngt-radio-button/ngt-radio-button.component.mjs +139 -139
  153. package/esm2020/components/ngt-radio-button/ngt-radio-button.module.mjs +29 -29
  154. package/esm2020/components/ngt-section/ngt-section.component.mjs +148 -142
  155. package/esm2020/components/ngt-section/ngt-section.module.mjs +32 -32
  156. package/esm2020/components/ngt-select/ngt-select.component.mjs +609 -609
  157. package/esm2020/components/ngt-select/ngt-select.directive.mjs +36 -36
  158. package/esm2020/components/ngt-select/ngt-select.module.mjs +65 -65
  159. package/esm2020/components/ngt-shining/ngt-shining.component.mjs +40 -40
  160. package/esm2020/components/ngt-shining/ngt-shining.module.mjs +20 -20
  161. package/esm2020/components/ngt-sidenav/ngt-sidenav.component.mjs +132 -132
  162. package/esm2020/components/ngt-sidenav/ngt-sidenav.module.mjs +20 -20
  163. package/esm2020/components/ngt-slider/ngt-slider.component.mjs +103 -103
  164. package/esm2020/components/ngt-slider/ngt-slider.module.mjs +24 -24
  165. package/esm2020/components/ngt-svg/ngt-svg.component.mjs +53 -53
  166. package/esm2020/components/ngt-svg/ngt-svg.module.mjs +28 -28
  167. package/esm2020/components/ngt-tag/ngt-tag.component.mjs +37 -37
  168. package/esm2020/components/ngt-tag/ngt-tag.module.mjs +24 -24
  169. package/esm2020/components/ngt-textarea/ngt-textarea.component.mjs +238 -238
  170. package/esm2020/components/ngt-textarea/ngt-textarea.module.mjs +43 -43
  171. package/esm2020/components/ngt-validation/ngt-validation.component.mjs +26 -26
  172. package/esm2020/components/ngt-validation/ngt-validation.module.mjs +20 -20
  173. package/esm2020/directives/ngt-stylizable/ngt-stylizable.directive.mjs +290 -290
  174. package/esm2020/directives/ngt-stylizable/ngt-stylizable.module.mjs +20 -20
  175. package/esm2020/enums/size.enum.mjs +11 -11
  176. package/esm2020/helpers/enum/enum.mjs +7 -7
  177. package/esm2020/helpers/form/form.mjs +14 -14
  178. package/esm2020/helpers/input-mask/input-mask.helper.mjs +26 -26
  179. package/esm2020/helpers/routing/route.mjs +11 -11
  180. package/esm2020/helpers/uuid.mjs +10 -10
  181. package/esm2020/ng-tailwind.mjs +4 -4
  182. package/esm2020/public-api.mjs +127 -127
  183. package/esm2020/services/http/ngt-attachment-http.service.mjs +3 -3
  184. package/esm2020/services/http/ngt-http-form.service.mjs +3 -3
  185. package/esm2020/services/http/ngt-http-resource.service.mjs +3 -3
  186. package/esm2020/services/http/ngt-http-validation.service.mjs +3 -3
  187. package/esm2020/services/http/ngt-http.service.mjs +3 -3
  188. package/esm2020/services/http/ngt-translate.service.mjs +3 -3
  189. package/esm2020/services/ngt-stylizable/ngt-stylizable.service.mjs +273 -273
  190. package/esm2020/services/validation/ngt-ability-validation.service.mjs +3 -3
  191. package/fesm2015/ng-tailwind.mjs +8408 -8402
  192. package/fesm2015/ng-tailwind.mjs.map +1 -1
  193. package/fesm2020/ng-tailwind.mjs +8245 -8239
  194. package/fesm2020/ng-tailwind.mjs.map +1 -1
  195. package/helpers/enum/enum.d.ts +1 -1
  196. package/helpers/form/form.d.ts +4 -4
  197. package/helpers/input-mask/input-mask.helper.d.ts +20 -20
  198. package/helpers/routing/route.d.ts +2 -2
  199. package/helpers/uuid.d.ts +1 -1
  200. package/index.d.ts +5 -5
  201. package/package.json +1 -1
  202. package/public-api.d.ts +87 -87
  203. package/services/http/ngt-attachment-http.service.d.ts +9 -9
  204. package/services/http/ngt-http-form.service.d.ts +5 -5
  205. package/services/http/ngt-http-resource.service.d.ts +12 -12
  206. package/services/http/ngt-http-validation.service.d.ts +12 -12
  207. package/services/http/ngt-http.service.d.ts +27 -27
  208. package/services/http/ngt-translate.service.d.ts +31 -31
  209. package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -96
  210. package/services/validation/ngt-ability-validation.service.d.ts +5 -5
@@ -1,837 +1,837 @@
1
- import { Component, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, ViewChild, } from '@angular/core';
2
- import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
- import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
4
- import { applyInputMask, InputMaskEnum, removeInputMask } from '../../helpers/input-mask/input-mask.helper';
5
- import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
8
- import * as i2 from "@angular/forms";
9
- import * as i3 from "../ngt-form/ngt-form.component";
10
- import * as i4 from "../../services/http/ngt-http-validation.service";
11
- import * as i5 from "../../services/http/ngt-http-resource.service";
12
- import * as i6 from "../ngt-section/ngt-section.component";
13
- import * as i7 from "../ngt-modal/ngt-modal.component";
14
- import * as i8 from "../../services/http/ngt-translate.service";
15
- import * as i9 from "@angular/common";
16
- import * as i10 from "../ngt-validation/ngt-validation.component";
17
- import * as i11 from "../ngt-shining/ngt-shining.component";
18
- import * as i12 from "../ngt-svg/ngt-svg.component";
19
- import * as i13 from "../ngt-helper/ngt-helper.component";
20
- export class NgtInputComponent extends NgtBaseNgModel {
21
- constructor(injector, renderer, changeDetector, ngtStylizableDirective, formContainer, ngtFormComponent, ngtValidationService, ngtResourceService, ngtForm, ngtSection, ngtModal, ngtTranslateService) {
22
- super();
23
- this.injector = injector;
24
- this.renderer = renderer;
25
- this.changeDetector = changeDetector;
26
- this.ngtStylizableDirective = ngtStylizableDirective;
27
- this.formContainer = formContainer;
28
- this.ngtFormComponent = ngtFormComponent;
29
- this.ngtValidationService = ngtValidationService;
30
- this.ngtResourceService = ngtResourceService;
31
- this.ngtForm = ngtForm;
32
- this.ngtSection = ngtSection;
33
- this.ngtModal = ngtModal;
34
- this.ngtTranslateService = ngtTranslateService;
35
- this.placeholder = '';
36
- this.helpTextColor = 'text-green-500';
37
- this.decimalMaskPrecision = 2;
38
- this.showCharactersLength = false;
39
- this.uppercase = false;
40
- this.type = 'text';
41
- this.helperAutoXReverse = true;
42
- this.onClickLeftIcon = new EventEmitter();
43
- this.onClickRightIcon = new EventEmitter();
44
- this.validatePhoneResult = new EventEmitter();
45
- this.inputProperties = {};
46
- this.subscriptions = [];
47
- if (this.ngtFormComponent) {
48
- this.shining = this.ngtFormComponent.isShining();
49
- this.subscriptions.push(this.ngtFormComponent.onShiningChange.subscribe((shining) => {
50
- this.shining = shining;
51
- }));
52
- }
53
- if (this.ngtStylizableDirective) {
54
- this.ngtStyle = this.ngtStylizableDirective.getNgtStylizableService();
55
- }
56
- else {
57
- this.ngtStyle = new NgtStylizableService();
58
- }
59
- this.ngtStyle.load(this.injector, 'NgtInput', {
60
- h: 'h-12',
61
- rounded: 'rounded',
62
- text: 'text-sm',
63
- font: 'font-normal',
64
- color: {
65
- border: 'border-gray-400 focus:border-gray-700',
66
- bg: 'bg-bg-white focus:bg-white',
67
- text: 'text-gray-800'
68
- }
69
- });
70
- }
71
- ngOnInit() {
72
- if (!this.formContainer) {
73
- console.error("The element must be inside a <form #form='ngForm'> tag!", this.element.nativeElement);
74
- }
75
- if (!this.name) {
76
- console.error("The element must contain a name attribute!", this.element.nativeElement);
77
- }
78
- else {
79
- setTimeout(() => {
80
- this.componentReady = true;
81
- this.changeDetector.detectChanges();
82
- setTimeout(() => {
83
- this.initComponent();
84
- this.changeDetector.detectChanges();
85
- if (!this.getElementTitle() || this.getElementTitle() === 'null') {
86
- this.element.nativeElement.parentElement.parentElement.title = '';
87
- }
88
- this.changeDetector.detectChanges();
89
- });
90
- }, 500);
91
- }
92
- }
93
- ngOnChanges(changes) {
94
- this.setupMasks(changes.mask ? changes.mask.previousValue : null);
95
- if (changes.match || changes.isRequired || changes.type || changes.mask || changes.minValue) {
96
- this.updateValidations();
97
- }
98
- }
99
- ngOnDestroy() {
100
- this.destroySubscriptions();
101
- }
102
- onNativeChange() {
103
- if (this.hasChangesBetweenModels()) {
104
- this.value = this.removeMasks(this.getNativeValue());
105
- }
106
- }
107
- change(value) {
108
- if (value && typeof value === 'string' && this.mask == 'decimal') {
109
- value = parseFloat(value);
110
- }
111
- if (!this.getNativeValue() || (this.validateMinValueOnMask)) {
112
- this.element.nativeElement.value = value ?? '';
113
- }
114
- if (!value && value !== 0) {
115
- this.clearInput();
116
- }
117
- let nativeValue = this.getNativeValue();
118
- if (this.mask) {
119
- let ngModelValue = this.removeMasks(nativeValue);
120
- if (nativeValue && ngModelValue != this.value) {
121
- this.value = ngModelValue;
122
- }
123
- if ((this.mask == InputMaskEnum.CELLPHONE || this.mask == InputMaskEnum.INTERNATIONAL_PHONE)
124
- && this.allowPhoneValidation && this.value) {
125
- this.validatePhone();
126
- }
127
- }
128
- else {
129
- let ngModelValue = this.removeMasks(value);
130
- if (value && ngModelValue != value) {
131
- this.value = ngModelValue;
132
- }
133
- if (this.value != nativeValue) {
134
- this.element.nativeElement.value = ngModelValue;
135
- }
136
- }
137
- if (this.componentReady) {
138
- this.onValueChangeEvent.emit(this.value);
139
- }
140
- if (this.ngtResourceService && this.findExistingResource && this.value) {
141
- this.searchExistingResource();
142
- }
143
- }
144
- setFocus() {
145
- setTimeout(() => {
146
- this.element.nativeElement.focus();
147
- }, 200);
148
- }
149
- clearInput(event) {
150
- if (event) {
151
- event.stopPropagation();
152
- }
153
- this.element.nativeElement.value = '';
154
- this.value = '';
155
- this.markAsPristine();
156
- }
157
- restorePlaceholder() {
158
- setTimeout(() => this.element.nativeElement.placeholder = this.placeholder);
159
- }
160
- showPassword() {
161
- this.element.nativeElement.type = 'text';
162
- this.changeDetector.detectChanges();
163
- }
164
- hidePassword() {
165
- this.element.nativeElement.type = 'password';
166
- this.changeDetector.detectChanges();
167
- }
168
- getInputPaddings() {
169
- let paddingClass = '';
170
- if (this.innerLeftIcon || this.customInnerContentTemplate) {
171
- paddingClass += 'pl-10 pr-4 ';
172
- }
173
- else {
174
- paddingClass += 'px-4 ';
175
- }
176
- if (this.innerRightIcon || this.allowClear || this.type == 'password') {
177
- if (this.allowClear && this.value && (this.innerRightIcon || this.type == 'password')) {
178
- paddingClass += 'pr-16 ';
179
- }
180
- else {
181
- paddingClass += 'pr-8 ';
182
- }
183
- }
184
- return paddingClass;
185
- }
186
- getRemainingCharacters() {
187
- if (this.element?.nativeElement?.value?.length) {
188
- if ((this.maxTotalCharsCount - this.element.nativeElement.value.length) > 0) {
189
- return this.maxTotalCharsCount - this.element.nativeElement.value.length;
190
- }
191
- else {
192
- return 0;
193
- }
194
- }
195
- return this.maxTotalCharsCount;
196
- }
197
- hasFocus() {
198
- return document.activeElement === this.element.nativeElement;
199
- }
200
- disabled() {
201
- return this.isDisabled || this.isDisabledByParent();
202
- }
203
- initComponent() {
204
- if (this.formContainer && this.formContainer.control && (this.formControl = this.formContainer.control.get(this.name))) {
205
- if (this.focus) {
206
- this.setFocus();
207
- }
208
- let watch = "change";
209
- if (this.jit) {
210
- watch += " keyup keydown keypress";
211
- }
212
- watch.split(' ').forEach((evt) => {
213
- this.renderer.listen(this.element.nativeElement, evt, () => {
214
- let nativeValue = this.removeMasks(this.getNativeValue());
215
- if (this.value != nativeValue) {
216
- this.value = nativeValue;
217
- }
218
- });
219
- });
220
- this.renderer.listen(this.element.nativeElement, "keydown", (event) => {
221
- if (this.element.nativeElement && this.element.nativeElement.value && this.element.nativeElement.value.length >= this.maxLength) {
222
- // Backspace and delete
223
- if (event.keyCode != 8 && event.keyCode != 46) {
224
- event.preventDefault();
225
- return false;
226
- }
227
- }
228
- });
229
- this.maxTotalCharsCount = this.maxLength;
230
- this.updateValidations();
231
- if (this.match) {
232
- this.renderer.listen(this.element.nativeElement, "keypress", () => {
233
- this.matchValidator();
234
- });
235
- }
236
- if (this.value) {
237
- this.formControl.markAsDirty();
238
- }
239
- else {
240
- this.formControl.markAsPristine();
241
- }
242
- }
243
- this.setupProperties();
244
- }
245
- updateValidations() {
246
- if (!this.formControl) {
247
- return;
248
- }
249
- const syncValidators = [];
250
- if (this.type == 'email') {
251
- syncValidators.push(Validators.email);
252
- }
253
- if (this.isRequired) {
254
- syncValidators.push(Validators.required);
255
- }
256
- if (this.maxLength) {
257
- syncValidators.push(Validators.maxLength(this.maxLength));
258
- }
259
- if (this.minLength) {
260
- syncValidators.push(Validators.minLength(this.minLength));
261
- }
262
- if (this.mask == 'cnpj-cpf' || this.mask == 'cnpj-cpf-rut' || this.mask == 'cpf') {
263
- syncValidators.push(this.cnpjCpfValidator());
264
- }
265
- if (this.mask == 'time') {
266
- syncValidators.push(this.timeValidator());
267
- }
268
- if (this.match) {
269
- syncValidators.push(this.matchValidator());
270
- }
271
- if (this.minValue !== undefined) {
272
- syncValidators.push(this.minValueValidator());
273
- }
274
- if (this.multipleOf) {
275
- syncValidators.push(this.multipleOfValidator());
276
- }
277
- if (this.externalServerDependency) {
278
- syncValidators.push(this.externalServerDependencyValidator());
279
- }
280
- setTimeout(() => {
281
- this.formControl.setValidators(syncValidators);
282
- const asyncValidators = [];
283
- if (this.uniqueResource) {
284
- asyncValidators.push(this.uniqueValidator());
285
- }
286
- if (this.type == 'email' && this.hasEmailServiceValidation()) {
287
- asyncValidators.push(this.emailValidator());
288
- }
289
- if (this.type == 'login' && this.hasEmailServiceValidation()) {
290
- asyncValidators.push(this.emailValidator(true));
291
- }
292
- if (this.type == 'password' && this.validatePassword && this.hasPasswordValidation()) {
293
- asyncValidators.push(this.passwordValidator());
294
- }
295
- this.formControl.setAsyncValidators(asyncValidators);
296
- this.formControl.updateValueAndValidity();
297
- });
298
- }
299
- setupMasks(previousMask) {
300
- if (this.mask != previousMask && !this.mask) {
301
- removeInputMask(this.element.nativeElement);
302
- return this.clearInput();
303
- }
304
- let masks = {
305
- [InputMaskEnum.CPF]: {
306
- mask: ['999.999.999-99'],
307
- showMaskOnHover: false
308
- },
309
- [InputMaskEnum.CNPJ]: {
310
- mask: ['99.999.999/9999-99'],
311
- showMaskOnHover: false
312
- },
313
- [InputMaskEnum.CUIT]: {
314
- mask: ['99-99999999-9'],
315
- clearMaskOnLostFocus: false
316
- },
317
- [InputMaskEnum.RUT]: {
318
- mask: ['999999999999'],
319
- clearMaskOnLostFocus: false
320
- },
321
- [InputMaskEnum.CPF_CNPJ_RUT]: {
322
- mask: ['999.999.999-99', '999999999999', '99.999.999/9999-99'],
323
- keepStatic: true,
324
- showMaskOnHover: false
325
- },
326
- [InputMaskEnum.CPF_CNPJ]: {
327
- mask: ['999.999.999-99', '99.999.999/9999-99'],
328
- keepStatic: true,
329
- showMaskOnHover: false
330
- },
331
- [InputMaskEnum.DECIMAL]: {
332
- digits: this.decimalMaskPrecision,
333
- groupSeparator: '.',
334
- radixPoint: ',',
335
- autoGroup: true,
336
- repeat: 16,
337
- rightAlign: false,
338
- max: this.maxValue,
339
- showMaskOnHover: false
340
- },
341
- [InputMaskEnum.CELLPHONE]: {
342
- mask: ['(99) 999-999', '(99) 9999-9999', '(99) 99999-9999'],
343
- keepStatic: true,
344
- showMaskOnHover: false
345
- },
346
- [InputMaskEnum.INTERNATIONAL_PHONE]: {
347
- mask: ['+999 99 999-999', '+99 (99) 9999-9999', '+99 (99) 99999-9999', '+999 (99) 9999-9999', '+999 (99) 99999-9999'],
348
- keepStatic: true,
349
- showMaskOnHover: false
350
- },
351
- [InputMaskEnum.PLATE]: {
352
- mask: ['AAA-9&99'],
353
- keepStatic: true,
354
- showMaskOnHover: false
355
- },
356
- [InputMaskEnum.CEP]: {
357
- mask: ['99999-999'],
358
- showMaskOnHover: false
359
- },
360
- [InputMaskEnum.INTEGER]: {
361
- max: this.maxValue,
362
- min: this.validateMinValueOnMask ? this.minValue : undefined,
363
- rightAlign: false,
364
- showMaskOnHover: false
365
- },
366
- [InputMaskEnum.NUMERIC_STRING]: {
367
- regex: "[0-9]*",
368
- showMaskOnHover: false
369
- },
370
- [InputMaskEnum.TIME]: '99:99',
371
- };
372
- if (this.mask == InputMaskEnum.DECIMAL) {
373
- applyInputMask(this.element.nativeElement, InputMaskEnum.DECIMAL, masks[this.mask]);
374
- }
375
- else if (this.mask == InputMaskEnum.INTEGER) {
376
- applyInputMask(this.element.nativeElement, InputMaskEnum.INTEGER, masks[this.mask]);
377
- }
378
- else {
379
- applyInputMask(this.element.nativeElement, masks[this.mask]);
380
- }
381
- }
382
- setupProperties() {
383
- let props = {
384
- shortText: {
385
- htmlType: "text",
386
- length: 30
387
- },
388
- text: {
389
- htmlType: "text",
390
- length: 100
391
- },
392
- longText: {
393
- htmlType: "text",
394
- length: 150
395
- },
396
- extraLongText: {
397
- htmlType: "text",
398
- length: 300
399
- },
400
- customText: {
401
- htmlType: "text",
402
- length: this.maxLength
403
- },
404
- password: {
405
- htmlType: "password",
406
- length: 150
407
- },
408
- email: {
409
- htmlType: "text",
410
- length: 100,
411
- },
412
- decimal: {
413
- htmlType: "text",
414
- length: 9,
415
- }
416
- };
417
- if (this.type in props) {
418
- this.inputProperties = props[this.type];
419
- this.maxLength = this.inputProperties.length;
420
- }
421
- else {
422
- console.warn("Type [" + this.type + "] is not a valid tail-form-input type!", this.element.nativeElement);
423
- }
424
- }
425
- minValueValidator() {
426
- return (control) => parseFloat(control.value) < this.minValue ? { 'minValue': true } : null;
427
- }
428
- multipleOfValidator() {
429
- return (control) => {
430
- if (control.value) {
431
- return (control.value % this.multipleOf !== 0) ? { 'multipleOf': true } : null;
432
- }
433
- };
434
- }
435
- externalServerDependencyValidator() {
436
- // TODO: Validar tempo de requisição
437
- return (control) => !control.value ? { 'externalServerDependency': true } : null;
438
- }
439
- timeValidator() {
440
- const regexExp = new RegExp('^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
441
- return (control) => {
442
- if (control.value) {
443
- if (regexExp.test(control.value)) {
444
- return null;
445
- }
446
- else {
447
- return { 'time': true };
448
- }
449
- }
450
- };
451
- }
452
- cnpjCpfValidator() {
453
- return (control) => {
454
- if (!control.value) {
455
- return null;
456
- }
457
- if (control.value && control.value.length <= 11) {
458
- if (this.validatorCPF(control.value)) {
459
- return null;
460
- }
461
- else {
462
- return { 'cpf': true };
463
- }
464
- }
465
- else if (control.value && control.value.length == 12) {
466
- return null;
467
- }
468
- else {
469
- if (control.value && this.validatorCNPJ(control.value)) {
470
- return null;
471
- }
472
- else {
473
- return { 'cnpj': true };
474
- }
475
- }
476
- };
477
- }
478
- matchValidator() {
479
- return (control) => {
480
- if (this.value != this.match) {
481
- return { 'match': true };
482
- }
483
- else {
484
- return null;
485
- }
486
- };
487
- }
488
- emailValidator(isLoginValidation = false) {
489
- return (control) => {
490
- if (this.emailValidatorTimeout) {
491
- clearTimeout(this.emailValidatorTimeout);
492
- }
493
- if (this.value) {
494
- return new Promise((resolve) => {
495
- this.emailValidatorTimeout = setTimeout(() => {
496
- this.loading = true;
497
- this.ngtValidationService.emailValidation(this.value)
498
- .then((response) => {
499
- this.loading = false;
500
- if (isLoginValidation) {
501
- resolve(response.valid ? { 'login': true } : null);
502
- }
503
- resolve(response.valid ? null : { 'email': true });
504
- })
505
- .catch(() => {
506
- this.loading = false;
507
- resolve(null);
508
- });
509
- }, 500);
510
- });
511
- }
512
- return Promise.resolve(null);
513
- };
514
- }
515
- passwordValidator() {
516
- return (control) => {
517
- if (this.passwordValidatorTimeout) {
518
- clearTimeout(this.passwordValidatorTimeout);
519
- }
520
- if (this.value) {
521
- return new Promise((resolve) => {
522
- this.passwordValidatorTimeout = setTimeout(() => {
523
- this.loading = true;
524
- this.ngtValidationService.passwordValidation(this.value, this.passwordableId, this.passwordPolicyId)
525
- .then((response) => {
526
- this.loading = false;
527
- resolve(response.valid ? null : { 'invalid_password': true });
528
- })
529
- .catch(() => {
530
- this.loading = false;
531
- resolve(null);
532
- });
533
- }, 500);
534
- });
535
- }
536
- return Promise.resolve(null);
537
- };
538
- }
539
- async searchExistingResource() {
540
- if (this.searchExistingResourceTimeout) {
541
- clearTimeout(this.searchExistingResourceTimeout);
542
- }
543
- this.searchExistingResourceTimeout = setTimeout(() => {
544
- this.loading = true;
545
- this.findExistingResource.value = this.value;
546
- this.ngtResourceService.findExisting(this.findExistingResource)
547
- .then((response) => this.existingResourceId = response.id)
548
- .catch(() => this.existingResourceId = null)
549
- .finally(() => this.loading = false);
550
- }, 500);
551
- }
552
- async validatePhone() {
553
- if (this.phoneValidatorTimeout) {
554
- clearTimeout(this.phoneValidatorTimeout);
555
- }
556
- this.phoneValidatorTimeout = setTimeout(() => {
557
- this.loading = true;
558
- this.ngtValidationService.phoneValidation(this.value)
559
- .then((response) => this.validatePhoneResult.emit(response))
560
- .finally(() => this.loading = false);
561
- });
562
- }
563
- uniqueValidator() {
564
- if (!this.ngtValidationService) {
565
- throw new Error("In order to use unique validation you must provide a implementation for NgtHttpValidationService class!");
566
- }
567
- return (control) => {
568
- if (this.uniqueValidatorTimeout) {
569
- clearTimeout(this.uniqueValidatorTimeout);
570
- }
571
- if (this.value && this.uniqueResource) {
572
- return new Promise((resolve) => {
573
- this.uniqueValidatorTimeout = setTimeout(() => {
574
- this.loading = true;
575
- this.ngtValidationService.unique(this.uniqueResource, this.value).then((response) => {
576
- this.loading = false;
577
- resolve(response.valid ? null : { 'unique': true });
578
- }).catch(() => {
579
- this.loading = false;
580
- resolve(null);
581
- });
582
- }, 500);
583
- });
584
- }
585
- return Promise.resolve(null);
586
- };
587
- }
588
- validatorCNPJ(value) {
589
- let b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
590
- if ((value = value.replace(/[^\d]/g, "")).length != 14) {
591
- return false;
592
- }
593
- if (/0{14}/.test(value)) {
594
- return false;
595
- }
596
- let n = 0;
597
- for (let i = 0; i < 12; n += value[i] * b[++i]) {
598
- ;
599
- }
600
- if (value[12] != (((n %= 11) < 2) ? 0 : 11 - n)) {
601
- return false;
602
- }
603
- n = 0;
604
- for (let i = 0; i <= 12; n += value[i] * b[i++]) {
605
- ;
606
- }
607
- if (value[13] != (((n %= 11) < 2) ? 0 : 11 - n)) {
608
- return false;
609
- }
610
- return true;
611
- }
612
- ;
613
- validatorCPF(value) {
614
- let numeros, digitos, soma, i, resultado, digitos_iguais;
615
- digitos_iguais = 1;
616
- if (value.length < 11) {
617
- return false;
618
- }
619
- for (i = 0; i < value.length - 1; i++) {
620
- if (value.charAt(i) != value.charAt(i + 1)) {
621
- digitos_iguais = 0;
622
- break;
623
- }
624
- }
625
- if (!digitos_iguais) {
626
- numeros = value.substring(0, 9);
627
- digitos = value.substring(9);
628
- soma = 0;
629
- for (i = 10; i > 1; i--) {
630
- soma += numeros.charAt(10 - i) * i;
631
- }
632
- resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
633
- if (resultado != digitos.charAt(0)) {
634
- return false;
635
- }
636
- numeros = value.substring(0, 10);
637
- soma = 0;
638
- for (i = 11; i > 1; i--) {
639
- soma += numeros.charAt(11 - i) * i;
640
- }
641
- resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
642
- if (resultado != digitos.charAt(1)) {
643
- return false;
644
- }
645
- return true;
646
- }
647
- else {
648
- return false;
649
- }
650
- }
651
- getNativeValue() {
652
- return this.element.nativeElement.value;
653
- }
654
- getElementTitle() {
655
- return this.element.nativeElement.parentElement.parentElement.title;
656
- }
657
- removeMasks(value) {
658
- if (this.mask == "decimal") {
659
- value = (value + "")
660
- .replace(/\./g, '')
661
- .replace(',', '.');
662
- }
663
- else if (this.mask == "cnpj-cpf" || this.mask == "cpf" || this.mask == "cnpj" || this.mask == "cnpj-cpf-rut" || this.mask == "cuit") {
664
- value = (value + "")
665
- .replace(/[^\d]/g, '');
666
- }
667
- else if (this.mask == InputMaskEnum.CELLPHONE
668
- || this.mask == InputMaskEnum.INTERNATIONAL_PHONE) {
669
- value = (value + "")
670
- .replace('(', '')
671
- .replace(')', '')
672
- .replace(' ', '')
673
- .replace(' ', '')
674
- .replace('-', '')
675
- .replace('+', '');
676
- }
677
- return value;
678
- }
679
- hasEmailServiceValidation() {
680
- return typeof this.ngtValidationService?.emailValidation === 'function';
681
- }
682
- hasPasswordValidation() {
683
- return typeof this.ngtValidationService?.passwordValidation === 'function';
684
- }
685
- isDisabledByParent() {
686
- return this.ngtForm?.isDisabled
687
- || this.ngtSection?.isDisabled
688
- || this.ngtModal?.isDisabled;
689
- }
690
- hasChangesBetweenModels() {
691
- return this.removeMasks(this.getNativeValue()) !== this.value;
692
- }
693
- destroySubscriptions() {
694
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
695
- this.subscriptions = [];
696
- }
697
- }
698
- NgtInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.NgtStylizableDirective, optional: true, self: true }, { token: i2.ControlContainer, host: true, optional: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtHttpValidationService, optional: true, skipSelf: true }, { token: i5.NgtHttpResourceService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i6.NgtSectionComponent, optional: true, skipSelf: true }, { token: i7.NgtModalComponent, optional: true, skipSelf: true }, { token: i8.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
699
- NgtInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtInputComponent, selector: "ngt-input", inputs: { label: "label", placeholder: "placeholder", shining: "shining", loading: "loading", helpTitle: "helpTitle", helpTextColor: "helpTextColor", helpText: "helpText", innerLeftIcon: "innerLeftIcon", innerLeftIconColor: "innerLeftIconColor", innerRightIcon: "innerRightIcon", innerRightIconColor: "innerRightIconColor", decimalMaskPrecision: "decimalMaskPrecision", showCharactersLength: "showCharactersLength", uppercase: "uppercase", customInnerContentTemplate: "customInnerContentTemplate", isDisabled: "isDisabled", isReadonly: "isReadonly", showRoundedIcon: "showRoundedIcon", type: "type", name: "name", mask: "mask", focus: "focus", allowClear: "allowClear", jit: "jit", findExistingResource: "findExistingResource", allowPhoneValidation: "allowPhoneValidation", validatePassword: "validatePassword", passwordableId: "passwordableId", passwordPolicyId: "passwordPolicyId", isRequired: "isRequired", uniqueResource: "uniqueResource", minValue: "minValue", maxValue: "maxValue", maxLength: "maxLength", minLength: "minLength", match: "match", multipleOf: "multipleOf", validateMinValueOnMask: "validateMinValueOnMask", externalServerDependency: "externalServerDependency", helperReverseYPosition: "helperReverseYPosition", helperAutoXReverse: "helperAutoXReverse" }, outputs: { onClickLeftIcon: "onClickLeftIcon", onClickRightIcon: "onClickRightIcon", validatePhoneResult: "validatePhoneResult" }, providers: [
700
- NgtMakeProvider(NgtInputComponent),
701
- ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\n <span [innerHtml]=\"helpText\"></span>\n </ngt-helper>\n</label>\n\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\n <input autocomplete=\"new-password\"\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\n (change)=\"onNativeChange()\" #element>\n <span *ngIf=\"innerLeftIcon\"\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickLeftIcon.emit()\">\n\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"fill-current\" [src]='innerLeftIcon'></ngt-svg>\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-6\" [src]='innerLeftIcon'>\n </span>\n\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\n </div>\n\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\n </svg>\n </span>\n\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\n <div class=\"div-loader\"></div>\n </span>\n\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\n <path\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\n </svg>\n\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\n <path\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\n </svg>\n </span>\n\n <span *ngIf=\"innerRightIcon && type != 'password'\"\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickRightIcon.emit()\">\n <ngt-svg class=\"fill-current\" [src]='innerRightIcon'></ngt-svg>\n </span>\n </div>\n</div>\n\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\n <p class=\"text-xs mt-1\">\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\n </p>\n</ng-container>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\n </div>\n</ng-container>\n\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n\n<ng-content></ng-content>\n\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\n</ngt-validation>", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i11.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i12.NgtSvgComponent, selector: "ngt-svg", inputs: ["src", "class"] }, { kind: "component", type: i13.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }], viewProviders: [
702
- { provide: ControlContainer, useExisting: NgForm }
703
- ] });
704
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, decorators: [{
705
- type: Component,
706
- args: [{ selector: 'ngt-input', providers: [
707
- NgtMakeProvider(NgtInputComponent),
708
- ], viewProviders: [
709
- { provide: ControlContainer, useExisting: NgForm }
710
- ], template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\n <span [innerHtml]=\"helpText\"></span>\n </ngt-helper>\n</label>\n\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\n <input autocomplete=\"new-password\"\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\n (change)=\"onNativeChange()\" #element>\n <span *ngIf=\"innerLeftIcon\"\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickLeftIcon.emit()\">\n\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"fill-current\" [src]='innerLeftIcon'></ngt-svg>\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-6\" [src]='innerLeftIcon'>\n </span>\n\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\n </div>\n\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\n </svg>\n </span>\n\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\n <div class=\"div-loader\"></div>\n </span>\n\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\n <path\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\n </svg>\n\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\n <path\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\n </svg>\n </span>\n\n <span *ngIf=\"innerRightIcon && type != 'password'\"\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickRightIcon.emit()\">\n <ngt-svg class=\"fill-current\" [src]='innerRightIcon'></ngt-svg>\n </span>\n </div>\n</div>\n\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\n <p class=\"text-xs mt-1\">\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\n </p>\n</ng-container>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\n </div>\n</ng-container>\n\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n\n<ng-content></ng-content>\n\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\n</ngt-validation>", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
711
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.NgtStylizableDirective, decorators: [{
712
- type: Self
713
- }, {
714
- type: Optional
715
- }] }, { type: i2.ControlContainer, decorators: [{
716
- type: Optional
717
- }, {
718
- type: Host
719
- }] }, { type: i3.NgtFormComponent, decorators: [{
720
- type: Optional
721
- }, {
722
- type: SkipSelf
723
- }] }, { type: i4.NgtHttpValidationService, decorators: [{
724
- type: Optional
725
- }, {
726
- type: SkipSelf
727
- }] }, { type: i5.NgtHttpResourceService, decorators: [{
728
- type: Optional
729
- }, {
730
- type: SkipSelf
731
- }] }, { type: i3.NgtFormComponent, decorators: [{
732
- type: Optional
733
- }, {
734
- type: SkipSelf
735
- }] }, { type: i6.NgtSectionComponent, decorators: [{
736
- type: Optional
737
- }, {
738
- type: SkipSelf
739
- }] }, { type: i7.NgtModalComponent, decorators: [{
740
- type: Optional
741
- }, {
742
- type: SkipSelf
743
- }] }, { type: i8.NgtTranslateService, decorators: [{
744
- type: Optional
745
- }] }]; }, propDecorators: { element: [{
746
- type: ViewChild,
747
- args: ["element", { static: true }]
748
- }], label: [{
749
- type: Input
750
- }], placeholder: [{
751
- type: Input
752
- }], shining: [{
753
- type: Input
754
- }], loading: [{
755
- type: Input
756
- }], helpTitle: [{
757
- type: Input
758
- }], helpTextColor: [{
759
- type: Input
760
- }], helpText: [{
761
- type: Input
762
- }], innerLeftIcon: [{
763
- type: Input
764
- }], innerLeftIconColor: [{
765
- type: Input
766
- }], innerRightIcon: [{
767
- type: Input
768
- }], innerRightIconColor: [{
769
- type: Input
770
- }], decimalMaskPrecision: [{
771
- type: Input
772
- }], showCharactersLength: [{
773
- type: Input
774
- }], uppercase: [{
775
- type: Input
776
- }], customInnerContentTemplate: [{
777
- type: Input
778
- }], isDisabled: [{
779
- type: Input
780
- }], isReadonly: [{
781
- type: Input
782
- }], showRoundedIcon: [{
783
- type: Input
784
- }], type: [{
785
- type: Input
786
- }], name: [{
787
- type: Input
788
- }], mask: [{
789
- type: Input
790
- }], focus: [{
791
- type: Input
792
- }], allowClear: [{
793
- type: Input
794
- }], jit: [{
795
- type: Input
796
- }], findExistingResource: [{
797
- type: Input
798
- }], allowPhoneValidation: [{
799
- type: Input
800
- }], validatePassword: [{
801
- type: Input
802
- }], passwordableId: [{
803
- type: Input
804
- }], passwordPolicyId: [{
805
- type: Input
806
- }], isRequired: [{
807
- type: Input
808
- }], uniqueResource: [{
809
- type: Input
810
- }], minValue: [{
811
- type: Input
812
- }], maxValue: [{
813
- type: Input
814
- }], maxLength: [{
815
- type: Input
816
- }], minLength: [{
817
- type: Input
818
- }], match: [{
819
- type: Input
820
- }], multipleOf: [{
821
- type: Input
822
- }], validateMinValueOnMask: [{
823
- type: Input
824
- }], externalServerDependency: [{
825
- type: Input
826
- }], helperReverseYPosition: [{
827
- type: Input
828
- }], helperAutoXReverse: [{
829
- type: Input
830
- }], onClickLeftIcon: [{
831
- type: Output
832
- }], onClickRightIcon: [{
833
- type: Output
834
- }], validatePhoneResult: [{
835
- type: Output
836
- }] } });
837
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFFBQVEsRUFFUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVE1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I1RixNQUFNLE9BQU8saUJBQWtCLFNBQVEsY0FBYztJQXVFakQsWUFDWSxRQUFrQixFQUNsQixRQUFtQixFQUNuQixjQUFpQyxFQUdqQyxzQkFBOEMsRUFHL0MsYUFBK0IsRUFHOUIsZ0JBQWtDLEVBR2xDLG9CQUE4QyxFQUc5QyxrQkFBMEMsRUFHMUMsT0FBeUIsRUFHekIsVUFBK0IsRUFHL0IsUUFBMkIsRUFHNUIsbUJBQXdDO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBL0JBLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixt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QUFuQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLEdBQUc7c0JBQWxCLEtBQUs7Z0JBR1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUNVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLHNCQUFzQjtzQkFBckMsS0FBSztnQkFDVSx3QkFBd0I7c0JBQXZDLEtBQUs7Z0JBQ1Usc0JBQXNCO3NCQUFyQyxLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFFVyxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLGdCQUFnQjtzQkFBaEMsTUFBTTtnQkFDVSxtQkFBbUI7c0JBQW5DLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBhcHBseUlucHV0TWFzaywgSW5wdXRNYXNrRW51bSwgcmVtb3ZlSW5wdXRNYXNrIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnB1dC1tYXNrL2lucHV0LW1hc2suaGVscGVyJztcbmltcG9ydCB7XG4gICAgTmd0SHR0cEZpbmRFeGlzdGluZ1Jlc291cmNlSW50ZXJmYWNlLFxuICAgIE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZVJlc3BvbnNlLFxuICAgIE5ndEh0dHBSZXNvdXJjZVNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LWh0dHAtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RIdHRwVmFsaWRhdGlvblJlc3BvbnNlLCBOZ3RIdHRwVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLXZhbGlkYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0U3R5bGl6YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZ3Qtc3R5bGl6YWJsZS9uZ3Qtc3R5bGl6YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9uZ3QtZm9ybS9uZ3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0U2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1zZWN0aW9uL25ndC1zZWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1tb2RhbC9uZ3QtbW9kYWwuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3QtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25ndC1pbnB1dC5jb21wb25lbnQuY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE5ndE1ha2VQcm92aWRlcihOZ3RJbnB1dENvbXBvbmVudCksXG4gICAgXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3RJbnB1dENvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoXCJlbGVtZW50XCIsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgLy8gVmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hpbmluZzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRpdGxlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGlubmVyTGVmdEljb246IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJMZWZ0SWNvbkNvbG9yOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGlubmVyUmlnaHRJY29uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGlubmVyUmlnaHRJY29uQ29sb3I6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVjaW1hbE1hc2tQcmVjaXNpb246IG51bWJlciA9IDI7XG4gICAgQElucHV0KCkgcHVibGljIHNob3dDaGFyYWN0ZXJzTGVuZ3RoOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHVwcGVyY2FzZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8vQmVoYXZpb3JcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZWFkb25seTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1JvdW5kZWRJY29uOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0eXBlOiBzdHJpbmcgPSAndGV4dCc7XG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgbWFzazogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmb2N1czogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYWxsb3dDbGVhcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaml0OiBib29sZWFuO1xuXG4gICAgLy9WYWxpZGF0aW9uc1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaW5kRXhpc3RpbmdSZXNvdXJjZTogTmd0SHR0cEZpbmRFeGlzdGluZ1Jlc291cmNlSW50ZXJmYWNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd1Bob25lVmFsaWRhdGlvbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGVQYXNzd29yZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFzc3dvcmRhYmxlSWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFzc3dvcmRQb2xpY3lJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1JlcXVpcmVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1bmlxdWVSZXNvdXJjZTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5WYWx1ZTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluTGVuZ3RoOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIG1hdGNoOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpcGxlT2Y6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGVNaW5WYWx1ZU9uTWFzazogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZXh0ZXJuYWxTZXJ2ZXJEZXBlbmRlbmN5OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwZXJSZXZlcnNlWVBvc2l0aW9uOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwZXJBdXRvWFJldmVyc2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsaWNrTGVmdEljb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsaWNrUmlnaHRJY29uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgdmFsaWRhdGVQaG9uZVJlc3VsdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIHB1YmxpYyBtYXhUb3RhbENoYXJzQ291bnQ6IG51bWJlcjtcbiAgICBwdWJsaWMgZXhpc3RpbmdSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5OiBib29sZWFuO1xuICAgIHB1YmxpYyBpbnB1dFByb3BlcnRpZXM6IHtcbiAgICAgICAgaHRtbFR5cGU/OiBzdHJpbmc7XG4gICAgICAgIGxlbmd0aD86IG51bWJlcjtcbiAgICB9ID0ge307XG5cbiAgICBwdWJsaWMgbmd0U3R5bGU6IE5ndFN0eWxpemFibGVTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBlbWFpbFZhbGlkYXRvclRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHBhc3N3b3JkVmFsaWRhdG9yVGltZW91dDogYW55O1xuICAgIHByaXZhdGUgcGhvbmVWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSB1bmlxdWVWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBzZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dDogYW55O1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcblxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpXG4gICAgICAgIHByaXZhdGUgbmd0U3R5bGl6YWJsZURpcmVjdGl2ZTogTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSxcblxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXG4gICAgICAgIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0Rm9ybUNvbXBvbmVudDogTmd0Rm9ybUNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndFZhbGlkYXRpb25TZXJ2aWNlOiBOZ3RIdHRwVmFsaWRhdGlvblNlcnZpY2UsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RSZXNvdXJjZVNlcnZpY2U6IE5ndEh0dHBSZXNvdXJjZVNlcnZpY2UsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RGb3JtOiBOZ3RGb3JtQ29tcG9uZW50LFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0U2VjdGlvbjogTmd0U2VjdGlvbkNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndE1vZGFsOiBOZ3RNb2RhbENvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBwdWJsaWMgbmd0VHJhbnNsYXRlU2VydmljZTogTmd0VHJhbnNsYXRlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLm5ndEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHRoaXMubmd0Rm9ybUNvbXBvbmVudC5pc1NoaW5pbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtQ29tcG9uZW50Lm9uU2hpbmluZ0NoYW5nZS5zdWJzY3JpYmUoKHNoaW5pbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gc2hpbmluZztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSB0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUuZ2V0Tmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmd0U3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0SW5wdXQnLCB7XG4gICAgICAgICAgICBoOiAnaC0xMicsXG4gICAgICAgICAgICByb3VuZGVkOiAncm91bmRlZCcsXG4gICAgICAgICAgICB0ZXh0OiAndGV4dC1zbScsXG4gICAgICAgICAgICBmb250OiAnZm9udC1ub3JtYWwnLFxuICAgICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdib3JkZXItZ3JheS00MDAgZm9jdXM6Ym9yZGVyLWdyYXktNzAwJyxcbiAgICAgICAgICAgICAgICBiZzogJ2JnLWJnLXdoaXRlIGZvY3VzOmJnLXdoaXRlJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAndGV4dC1ncmF5LTgwMCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgYmUgaW5zaWRlIGEgPGZvcm0gI2Zvcm09J25nRm9ybSc+IHRhZyFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSBuYW1lIGF0dHJpYnV0ZSFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRFbGVtZW50VGl0bGUoKSB8fCB0aGlzLmdldEVsZW1lbnRUaXRsZSgpID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50aXRsZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zZXR1cE1hc2tzKGNoYW5nZXMubWFzayA/IGNoYW5nZXMubWFzay5wcmV2aW91c1ZhbHVlIDogbnVsbCk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMubWF0Y2ggfHwgY2hhbmdlcy5pc1JlcXVpcmVkIHx8IGNoYW5nZXMudHlwZSB8fCBjaGFuZ2VzLm1hc2sgfHwgY2hhbmdlcy5taW5WYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VzQmV0d2Vlbk1vZGVscygpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW1vdmVNYXNrcyh0aGlzLmdldE5hdGl2ZVZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMubWFzayA9PSAnZGVjaW1hbCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZ2V0TmF0aXZlVmFsdWUoKSB8fCAodGhpcy52YWxpZGF0ZU1pblZhbHVlT25NYXNrKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZSA/PyAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5hdGl2ZVZhbHVlID0gdGhpcy5nZXROYXRpdmVWYWx1ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc2spIHtcbiAgICAgICAgICAgIGxldCBuZ01vZGVsVmFsdWUgPSB0aGlzLnJlbW92ZU1hc2tzKG5hdGl2ZVZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKG5hdGl2ZVZhbHVlICYmIG5nTW9kZWxWYWx1ZSAhPSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICh0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5DRUxMUEhPTkUgfHwgdGhpcy5tYXNrID09IElucHV0TWFza0VudW0uSU5URVJOQVRJT05BTF9QSE9ORSlcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmFsbG93UGhvbmVWYWxpZGF0aW9uICYmIHRoaXMudmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQaG9uZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG5nTW9kZWxWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgbmdNb2RlbFZhbHVlICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbmF0aXZlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmd0UmVzb3VyY2VTZXJ2aWNlICYmIHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UgJiYgdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9jdXMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG5cbiAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXN0b3JlUGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd1Bhc3N3b3JkKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50eXBlID0gJ3RleHQnO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZVBhc3N3b3JkKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50eXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElucHV0UGFkZGluZ3MoKSB7XG4gICAgICAgIGxldCBwYWRkaW5nQ2xhc3M6IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIGlmICh0aGlzLmlubmVyTGVmdEljb24gfHwgdGhpcy5jdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwbC0xMCBwci00ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3B4LTQgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMuYWxsb3dDbGVhciB8fCB0aGlzLnR5cGUgPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dDbGVhciAmJiB0aGlzLnZhbHVlICYmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMudHlwZSA9PSAncGFzc3dvcmQnKSkge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdDbGFzcyArPSAncHItMTYgJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwci04ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFkZGluZ0NsYXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50Py5uYXRpdmVFbGVtZW50Py52YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMubWF4VG90YWxDaGFyc0NvdW50IC0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhUb3RhbENoYXJzQ291bnQgLSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWF4VG90YWxDaGFyc0NvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNGb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZCB8fCB0aGlzLmlzRGlzYWJsZWRCeVBhcmVudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENvbXBvbmVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRhaW5lciAmJiB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbCAmJiAodGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3YXRjaCA9IFwiY2hhbmdlXCI7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmppdCkge1xuICAgICAgICAgICAgICAgIHdhdGNoICs9IFwiIGtleXVwIGtleWRvd24ga2V5cHJlc3NcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2F0Y2guc3BsaXQoJyAnKS5mb3JFYWNoKChldnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgZXZ0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYXRpdmVWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModGhpcy5nZXROYXRpdmVWYWx1ZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBuYXRpdmVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5hdGl2ZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgJiYgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoID49IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjZSBhbmQgZGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9IDggJiYgZXZlbnQua2V5Q29kZSAhPSA0Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWF4VG90YWxDaGFyc0NvdW50ID0gdGhpcy5tYXhMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIFwia2V5cHJlc3NcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoVmFsaWRhdG9yKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwUHJvcGVydGllcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3luY1ZhbGlkYXRvcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09ICdlbWFpbCcpIHtcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4TGVuZ3RoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5MZW5ndGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gJ2NucGotY3BmJyB8fCB0aGlzLm1hc2sgPT0gJ2NucGotY3BmLXJ1dCcgfHwgdGhpcy5tYXNrID09ICdjcGYnKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuY25wakNwZlZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMudGltZVZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubWF0Y2hWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubWluVmFsdWVWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZU9mKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubXVsdGlwbGVPZlZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4dGVybmFsU2VydmVyRGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmV4dGVybmFsU2VydmVyRGVwZW5kZW5jeVZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcblxuICAgICAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXF1ZVJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy51bmlxdWVWYWxpZGF0b3IoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2VtYWlsJyAmJiB0aGlzLmhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuZW1haWxWYWxpZGF0b3IoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2xvZ2luJyAmJiB0aGlzLmhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuZW1haWxWYWxpZGF0b3IodHJ1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09ICdwYXNzd29yZCcgJiYgdGhpcy52YWxpZGF0ZVBhc3N3b3JkICYmIHRoaXMuaGFzUGFzc3dvcmRWYWxpZGF0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLnBhc3N3b3JkVmFsaWRhdG9yKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBNYXNrcyhwcmV2aW91c01hc2s/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubWFzayAhPSBwcmV2aW91c01hc2sgJiYgIXRoaXMubWFzaykge1xuICAgICAgICAgICAgcmVtb3ZlSW5wdXRNYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1hc2tzID0ge1xuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ1BGXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTk5Ljk5OS45OTktOTknXSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ05QSl06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5Ljk5OS45OTkvOTk5OS05OSddLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DVUlUXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTktOTk5OTk5OTktOSddLFxuICAgICAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLlJVVF06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OTk5OTk5OTk5OSddLFxuICAgICAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNQRl9DTlBKX1JVVF06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OS45OTkuOTk5LTk5JywgJzk5OTk5OTk5OTk5OScsICc5OS45OTkuOTk5Lzk5OTktOTknXSxcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DUEZfQ05QSl06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OS45OTkuOTk5LTk5JywgJzk5Ljk5OS45OTkvOTk5OS05OSddLFxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkRFQ0lNQUxdOiB7XG4gICAgICAgICAgICAgICAgZGlnaXRzOiB0aGlzLmRlY2ltYWxNYXNrUHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgIGdyb3VwU2VwYXJhdG9yOiAnLicsXG4gICAgICAgICAgICAgICAgcmFkaXhQb2ludDogJywnLFxuICAgICAgICAgICAgICAgIGF1dG9Hcm91cDogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXBlYXQ6IDE2LFxuICAgICAgICAgICAgICAgIHJpZ2h0QWxpZ246IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhWYWx1ZSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ0VMTFBIT05FXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnKDk5KSA5OTktOTk5JywgJyg5OSkgOTk5OS05OTk5JywgJyg5OSkgOTk5OTktOTk5OSddLFxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLklOVEVSTkFUSU9OQUxfUEhPTkVdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWycrOTk5IDk5IDk5OS05OTknLCAnKzk5ICg5OSkgOTk5OS05OTk5JywgJys5OSAoOTkpIDk5OTk5LTk5OTknLCAnKzk5OSAoOTkpIDk5OTktOTk5OScsICcrOTk5ICg5OSkgOTk5OTktOTk5OSddLFxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLlBMQVRFXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnQUFBLTkmOTknXSxcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DRVBdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTk5OS05OTknXSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uSU5URUdFUl06IHtcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgbWluOiB0aGlzLnZhbGlkYXRlTWluVmFsdWVPbk1hc2sgPyB0aGlzLm1pblZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJpZ2h0QWxpZ246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5OVU1FUklDX1NUUklOR106IHtcbiAgICAgICAgICAgICAgICByZWdleDogXCJbMC05XSpcIixcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uVElNRV06ICc5OTo5OScsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLkRFQ0lNQUwpIHtcbiAgICAgICAgICAgIGFwcGx5SW5wdXRNYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBJbnB1dE1hc2tFbnVtLkRFQ0lNQUwsIG1hc2tzW3RoaXMubWFza10pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLklOVEVHRVIpIHtcbiAgICAgICAgICAgIGFwcGx5SW5wdXRNYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBJbnB1dE1hc2tFbnVtLklOVEVHRVIsIG1hc2tzW3RoaXMubWFza10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBwbHlJbnB1dE1hc2sodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIG1hc2tzW3RoaXMubWFza10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGxldCBwcm9wcyA9IHtcbiAgICAgICAgICAgIHNob3J0VGV4dDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDMwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEwMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvbmdUZXh0OiB7XG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTUwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXh0cmFMb25nVGV4dDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDMwMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1c3RvbVRleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLm1heExlbmd0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiB7XG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE1MFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlY2ltYWw6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA5LFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRQcm9wZXJ0aWVzID0gcHJvcHNbdGhpcy50eXBlXTtcbiAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gdGhpcy5pbnB1dFByb3BlcnRpZXMubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVHlwZSBbXCIgKyB0aGlzLnR5cGUgKyBcIl0gaXMgbm90IGEgdmFsaWQgdGFpbC1mb3JtLWlucHV0IHR5cGUhXCIsIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWluVmFsdWVWYWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBwYXJzZUZsb2F0KGNvbnRyb2wudmFsdWUpIDwgdGhpcy5taW5WYWx1ZSA/IHsgJ21pblZhbHVlJzogdHJ1ZSB9IDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG11bHRpcGxlT2ZWYWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoY29udHJvbC52YWx1ZSAlIHRoaXMubXVsdGlwbGVPZiAhPT0gMCkgPyB7ICdtdWx0aXBsZU9mJzogdHJ1ZSB9IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dGVybmFsU2VydmVyRGVwZW5kZW5jeVZhbGlkYXRvcigpIHtcbiAgICAgICAgLy8gVE9ETzogVmFsaWRhciB0ZW1wbyBkZSByZXF1aXNpw6fDo29cbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+ICFjb250cm9sLnZhbHVlID8geyAnZXh0ZXJuYWxTZXJ2ZXJEZXBlbmRlbmN5JzogdHJ1ZSB9IDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRpbWVWYWxpZGF0b3IoKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4RXhwID0gbmV3IFJlZ0V4cCgnXigwWzAtOV18MVswLTldfDJbMC0zXSk6WzAtNV1bMC05XSQnKTtcblxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhFeHAudGVzdChjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAndGltZSc6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbnBqQ3BmVmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoIDw9IDExKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdG9yQ1BGKGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7ICdjcGYnOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoID09IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIHRoaXMudmFsaWRhdG9yQ05QSihjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAnY25waic6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXRjaFZhbGlkYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IHRoaXMubWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAnbWF0Y2gnOiB0cnVlIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1haWxWYWxpZGF0b3IoaXNMb2dpblZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZSk6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZW1haWxWYWxpZGF0b3JUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZW1haWxWYWxpZGF0b3JUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWFpbFZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UuZW1haWxWYWxpZGF0aW9uKHRoaXMudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBOZ3RIdHRwVmFsaWRhdGlvblJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xvZ2luVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IHsgJ2xvZ2luJzogdHJ1ZSB9IDogbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLnZhbGlkID8gbnVsbCA6IHsgJ2VtYWlsJzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFzc3dvcmRWYWxpZGF0b3IoKTogQXN5bmNWYWxpZGF0b3JGbiB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXNzd29yZFZhbGlkYXRvclRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wYXNzd29yZFZhbGlkYXRvclRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhc3N3b3JkVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS5wYXNzd29yZFZhbGlkYXRpb24odGhpcy52YWx1ZSwgdGhpcy5wYXNzd29yZGFibGVJZCwgdGhpcy5wYXNzd29yZFBvbGljeUlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZTogTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLnZhbGlkID8gbnVsbCA6IHsgJ2ludmFsaWRfcGFzc3dvcmQnOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNlYXJjaEV4aXN0aW5nUmVzb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5maW5kRXhpc3RpbmdSZXNvdXJjZS52YWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgICAgIHRoaXMubmd0UmVzb3VyY2VTZXJ2aWNlLmZpbmRFeGlzdGluZyh0aGlzLmZpbmRFeGlzdGluZ1Jlc291cmNlKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZTogTmd0SHR0cEZpbmRFeGlzdGluZ1Jlc291cmNlUmVzcG9uc2UpID0+IHRoaXMuZXhpc3RpbmdSZXNvdXJjZUlkID0gcmVzcG9uc2UuaWQpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMuZXhpc3RpbmdSZXNvdXJjZUlkID0gbnVsbClcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVBob25lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBob25lVmFsaWRhdG9yVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBob25lVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS5waG9uZVZhbGlkYXRpb24odGhpcy52YWx1ZSlcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4gdGhpcy52YWxpZGF0ZVBob25lUmVzdWx0LmVtaXQocmVzcG9uc2UpKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmlxdWVWYWxpZGF0b3IoKTogQXN5bmNWYWxpZGF0b3JGbiB7XG4gICAgICAgIGlmICghdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW4gb3JkZXIgdG8gdXNlIHVuaXF1ZSB2YWxpZGF0aW9uIHlvdSBtdXN0IHByb3ZpZGUgYSBpbXBsZW1lbnRhdGlvbiBmb3IgTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlIGNsYXNzIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy51bmlxdWVWYWxpZGF0b3JUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudW5pcXVlUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxdWVWYWxpZGF0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndFZhbGlkYXRpb25TZXJ2aWNlLnVuaXF1ZSh0aGlzLnVuaXF1ZVJlc291cmNlLCB0aGlzLnZhbHVlKS50aGVuKChyZXNwb25zZTogTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IG51bGwgOiB7ICd1bmlxdWUnOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRvckNOUEoodmFsdWUpIHtcbiAgICAgICAgbGV0IGIgPSBbNiwgNSwgNCwgMywgMiwgOSwgOCwgNywgNiwgNSwgNCwgMywgMl07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXS9nLCBcIlwiKSkubGVuZ3RoICE9IDE0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoLzB7MTR9Ly50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG4gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTI7IG4gKz0gdmFsdWVbaV0gKiBiWysraV0pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZVsxMl0gIT0gKCgobiAlPSAxMSkgPCAyKSA/IDAgOiAxMSAtIG4pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBuID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxMjsgbiArPSB2YWx1ZVtpXSAqIGJbaSsrXSkge1xuICAgICAgICAgICAgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlWzEzXSAhPSAoKChuICU9IDExKSA8IDIpID8gMCA6IDExIC0gbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHZhbGlkYXRvckNQRih2YWx1ZSkge1xuICAgICAgICBsZXQgbnVtZXJvcywgZGlnaXRvcywgc29tYSwgaSwgcmVzdWx0YWRvLCBkaWdpdG9zX2lndWFpcztcblxuICAgICAgICBkaWdpdG9zX2lndWFpcyA9IDE7XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KGkpICE9IHZhbHVlLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgICAgICBkaWdpdG9zX2lndWFpcyA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZ2l0b3NfaWd1YWlzKSB7XG4gICAgICAgICAgICBudW1lcm9zID0gdmFsdWUuc3Vic3RyaW5nKDAsIDkpO1xuICAgICAgICAgICAgZGlnaXRvcyA9IHZhbHVlLnN1YnN0cmluZyg5KTtcbiAgICAgICAgICAgIHNvbWEgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAxMDsgaSA+IDE7IGktLSkge1xuICAgICAgICAgICAgICAgIHNvbWEgKz0gbnVtZXJvcy5jaGFyQXQoMTAgLSBpKSAqIGk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdGFkbyA9IHNvbWEgJSAxMSA8IDIgPyAwIDogMTEgLSBzb21hICUgMTE7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHRhZG8gIT0gZGlnaXRvcy5jaGFyQXQoMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG51bWVyb3MgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgMTApO1xuICAgICAgICAgICAgc29tYSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDExOyBpID4gMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgc29tYSArPSBudW1lcm9zLmNoYXJBdCgxMSAtIGkpICogaTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0YWRvID0gc29tYSAlIDExIDwgMiA/IDAgOiAxMSAtIHNvbWEgJSAxMTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdGFkbyAhPSBkaWdpdG9zLmNoYXJBdCgxKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5hdGl2ZVZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbGVtZW50VGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50aXRsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZU1hc2tzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubWFzayA9PSBcImRlY2ltYWxcIikge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXC4vZywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFzayA9PSBcImNucGotY3BmXCIgfHwgdGhpcy5tYXNrID09IFwiY3BmXCIgfHwgdGhpcy5tYXNrID09IFwiY25walwiIHx8IHRoaXMubWFzayA9PSBcImNucGotY3BmLXJ1dFwiIHx8IHRoaXMubWFzayA9PSBcImN1aXRcIikge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXlxcZF0vZywgJycpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYXNrID09IElucHV0TWFza0VudW0uQ0VMTFBIT05FXG4gICAgICAgICAgICB8fCB0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5JTlRFUk5BVElPTkFMX1BIT05FXG4gICAgICAgICkge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcoJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyknLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnICcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcgJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJy0nLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnKycsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZT8uZW1haWxWYWxpZGF0aW9uID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzUGFzc3dvcmRWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2U/LnBhc3N3b3JkVmFsaWRhdGlvbiA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGlzYWJsZWRCeVBhcmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmd0Rm9ybT8uaXNEaXNhYmxlZFxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RTZWN0aW9uPy5pc0Rpc2FibGVkXG4gICAgICAgICAgICB8fCB0aGlzLm5ndE1vZGFsPy5pc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzQ2hhbmdlc0JldHdlZW5Nb2RlbHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZU1hc2tzKHRoaXMuZ2V0TmF0aXZlVmFsdWUoKSkgIT09IHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95U3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgfVxufVxuIiwiPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cIm1iLTIgZmxleCB7eyBuZ3RTdHlsZS5jb21waWxlKFsnY29sb3IudGV4dCcsICd0ZXh0JywgJ2ZvbnQnXSkgfX1cIiBbaGlkZGVuXT0nc2hpbmluZyc+XG4gICAge3sgbGFiZWwgfX06XG5cbiAgICA8c3BhbiAqbmdJZj1cImlzUmVxdWlyZWRcIiBjbGFzcz1cInRleHQtcmVkLTUwMCBmb250LWJvbGQgdGV4dC1tZCBtbC0xXCI+Kjwvc3Bhbj5cblxuICAgIDxuZ3QtaGVscGVyICpuZ0lmPVwiaGVscFRleHRcIiBbaGVscFRpdGxlXT1cImhlbHBUaXRsZVwiIFtpY29uQ29sb3JdPVwiaGVscFRleHRDb2xvclwiXG4gICAgICAgIFtoZWxwZXJSZXZlcnNlWVBvc2l0aW9uXT1cImhlbHBlclJldmVyc2VZUG9zaXRpb25cIiBbYXV0b1hSZXZlcnNlXT1cImhlbHBlckF1dG9YUmV2ZXJzZVwiIGNsYXNzPVwibWwtMVwiPlxuICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cImhlbHBUZXh0XCI+PC9zcGFuPlxuICAgIDwvbmd0LWhlbHBlcj5cbjwvbGFiZWw+XG5cbjxkaXYgY2xhc3M9XCJ7eyBzaGluaW5nID8gJ2hpZGRlbicgOiAnZmxleCByZWxhdGl2ZSd9fVwiPlxuICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxuICAgICAgICBjbGFzcz1cImZsZXggYm9yZGVyIGFwcGVhcmFuY2Utbm9uZSBmb2N1czpvdXRsaW5lLW5vbmUgbGVhZGluZy10aWdodCB3LWZ1bGwge3sgZ2V0SW5wdXRQYWRkaW5ncygpIH19IHt7IG5ndFN0eWxlLmNvbXBpbGUoWydoJywgJ3RleHQnLCAnY29sb3IuYm9yZGVyJywgJ2NvbG9yLmJnJywgJ2NvbG9yLnRleHQnLCAncm91bmRlZCcsICdjdXJzb3InXSkgfX1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiIFtyZWFkb25seV09XCJpc1JlYWRvbmx5IHx8IGxvYWRpbmdcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbc3R5bGVdPVwidXBwZXJjYXNlID8gJ3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UhaW1wb3J0YW50JzonJ1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnaW5wdXQtaGFzLWVycm9yIGJvcmRlci1yZWQtNzAwJzogZm9ybUNvbnRyb2w/LmVycm9ycyAmJiAoZm9ybUNvbnRyb2w/LmRpcnR5IHx8IChmb3JtQ29udGFpbmVyICYmIGZvcm1Db250YWluZXJbJ3N1Ym1pdHRlZCddKSl9XCJcbiAgICAgICAgW2F0dHIudHlwZV09XCJpbnB1dFByb3BlcnRpZXMuaHRtbFR5cGVcIiAobW91c2VsZWF2ZSk9XCJyZXN0b3JlUGxhY2Vob2xkZXIoKVwiIChmb2N1c291dCk9XCJyZXN0b3JlUGxhY2Vob2xkZXIoKVwiXG4gICAgICAgIChjaGFuZ2UpPVwib25OYXRpdmVDaGFuZ2UoKVwiICNlbGVtZW50PlxuICAgIDxzcGFuICpuZ0lmPVwiaW5uZXJMZWZ0SWNvblwiXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgc2VsZi1jZW50ZXIgcHgtMiB7eyBpbm5lckxlZnRJY29uQ29sb3IgfX0ge3sgb25DbGlja0xlZnRJY29uID8gJ2N1cnNvci1wb2ludGVyJyA6ICcnIH19XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tMZWZ0SWNvbi5lbWl0KClcIj5cblxuICAgICAgICA8bmd0LXN2ZyAqbmdJZj1cIiFzaG93Um91bmRlZEljb25cIiBjbGFzcz1cImZpbGwtY3VycmVudFwiIFtzcmNdPSdpbm5lckxlZnRJY29uJz48L25ndC1zdmc+XG4gICAgICAgIDxpbWcgKm5nSWY9XCJzaG93Um91bmRlZEljb25cIiBjbGFzcz1cInJvdW5kZWQtZnVsbCBoLTZcIiBbc3JjXT0naW5uZXJMZWZ0SWNvbic+XG4gICAgPC9zcGFuPlxuXG4gICAgPGRpdiAqbmdJZj1cImN1c3RvbUlubmVyQ29udGVudFRlbXBsYXRlXCIgY2xhc3M9XCJhYnNvbHV0ZSBzZWxmLWNlbnRlciBweC0yXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tSW5uZXJDb250ZW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFic29sdXRlIGgtZnVsbCBqdXN0aWZ5LWVuZCByaWdodC0wIHctYXV0b1wiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFkaXNhYmxlZCgpICYmIGFsbG93Q2xlYXIgJiYgdmFsdWUgJiYgIWxvYWRpbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWxmLWNlbnRlciByaWdodC0wIHB4LTIgdGV4dC1yZWQtNDAwIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT0nY2xlYXJJbnB1dCgkZXZlbnQpJz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJmaWxsLWN1cnJlbnQgc2VsZi1jZW50ZXJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTkuMSAxNy4ybC01LjMtNS4zIDUuMy01LjMtMS44LTEuOC01LjMgNS40LTUuMy01LjMtMS44IDEuNyA1LjMgNS4zLTUuMyA1LjNMNi43IDE5bDUuMy01LjMgNS4zIDUuMyAxLjgtMS44elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwic2VsZi1jZW50ZXIgcmlnaHQtMCBweC0yIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbG9hZGVyXCI+PC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cInR5cGUgPT0gJ3Bhc3N3b3JkJyAmJiB2YWx1ZVwiIGNsYXNzPVwic2VsZi1jZW50ZXIgcHgtMiBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImVsZW1lbnQudHlwZSA9PSAncGFzc3dvcmQnXCIgY2xhc3M9XCJmaWxsLWN1cnJlbnRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgKGNsaWNrKT0nc2hvd1Bhc3N3b3JkKCknPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNLjIgMTBhMTEgMTEgMCAwIDEgMTkuNiAwQTExIDExIDAgMCAxIC4yIDEwem05LjggNGE0IDQgMCAxIDAgMC04IDQgNCAwIDAgMCAwIDh6bTAtMmEyIDIgMCAxIDEgMC00IDIgMiAwIDAgMSAwIDR6XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZWxlbWVudC50eXBlID09ICd0ZXh0J1wiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIChjbGljayk9J2hpZGVQYXNzd29yZCgpJz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTEyLjgxIDQuMzZsLTEuNzcgMS43OGE0IDQgMCAwIDAtNC45IDQuOWwtMi43NiAyLjc1QzIuMDYgMTIuNzkuOTYgMTEuNDkuMiAxMGExMSAxMSAwIDAgMSAxMi42LTUuNjR6bTMuOCAxLjg1YzEuMzMgMSAyLjQzIDIuMyAzLjIgMy43OWExMSAxMSAwIDAgMS0xMi42MiA1LjY0bDEuNzctMS43OGE0IDQgMCAwIDAgNC45LTQuOWwyLjc2LTIuNzV6bS0uMjUtMy45OWwxLjQyIDEuNDJMMy42NCAxNy43OGwtMS40Mi0xLjQyTDE2LjM2IDIuMjJ6XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpbm5lclJpZ2h0SWNvbiAmJiB0eXBlICE9ICdwYXNzd29yZCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWxmLWNlbnRlciBweC0yIHt7IGlubmVyUmlnaHRJY29uQ29sb3IgfX0gIHt7IG9uQ2xpY2tSaWdodEljb24gPyAnY3Vyc29yLXBvaW50ZXInIDogJycgfX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tSaWdodEljb24uZW1pdCgpXCI+XG4gICAgICAgICAgICA8bmd0LXN2ZyBjbGFzcz1cImZpbGwtY3VycmVudFwiIFtzcmNdPSdpbm5lclJpZ2h0SWNvbic+PC9uZ3Qtc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDaGFyYWN0ZXJzTGVuZ3RoICYmIG1heFRvdGFsQ2hhcnNDb3VudCAmJiAhc2hpbmluZ1wiPlxuICAgIDxwIGNsYXNzPVwidGV4dC14cyBtdC0xXCI+XG4gICAgICAgIHt7IG5ndFRyYW5zbGF0ZVNlcnZpY2Uubmd0VGV4dEFyZWFSZW1haW5pbmdDaGFyYWN0ZXJzIH19OlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eyBnZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCkgfX08L3NwYW4+XG4gICAgPC9wPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9J3NoaW5pbmcnPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgIDxuZ3Qtc2hpbmluZyBjbGFzcz1cInt7IG5ndFN0eWxlLmNvbXBpbGUoWydoJ10pIH19IHctZnVsbFwiPjwvbmd0LXNoaW5pbmc+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPGlucHV0ICpuZ0lmPSdjb21wb25lbnRSZWFkeScgdHlwZT1cImhpZGRlblwiIFtuZ01vZGVsXT1cInZhbHVlXCIgW25hbWVdPVwibmFtZVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuXG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjxuZ3QtdmFsaWRhdGlvbiBbY29udHJvbF09XCJmb3JtQ29udHJvbFwiIFtjb250YWluZXJdPVwiZm9ybUNvbnRhaW5lclwiIFttaW5WYWx1ZV09J21pblZhbHVlJyBbbWluTGVuZ3RoXT0nbWluTGVuZ3RoJz5cbjwvbmd0LXZhbGlkYXRpb24+Il19
1
+ import { Component, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, ViewChild, } from '@angular/core';
2
+ import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
+ import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
4
+ import { applyInputMask, InputMaskEnum, removeInputMask } from '../../helpers/input-mask/input-mask.helper';
5
+ import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "../ngt-form/ngt-form.component";
10
+ import * as i4 from "../../services/http/ngt-http-validation.service";
11
+ import * as i5 from "../../services/http/ngt-http-resource.service";
12
+ import * as i6 from "../ngt-section/ngt-section.component";
13
+ import * as i7 from "../ngt-modal/ngt-modal.component";
14
+ import * as i8 from "../../services/http/ngt-translate.service";
15
+ import * as i9 from "@angular/common";
16
+ import * as i10 from "../ngt-validation/ngt-validation.component";
17
+ import * as i11 from "../ngt-shining/ngt-shining.component";
18
+ import * as i12 from "../ngt-svg/ngt-svg.component";
19
+ import * as i13 from "../ngt-helper/ngt-helper.component";
20
+ export class NgtInputComponent extends NgtBaseNgModel {
21
+ constructor(injector, renderer, changeDetector, ngtStylizableDirective, formContainer, ngtFormComponent, ngtValidationService, ngtResourceService, ngtForm, ngtSection, ngtModal, ngtTranslateService) {
22
+ super();
23
+ this.injector = injector;
24
+ this.renderer = renderer;
25
+ this.changeDetector = changeDetector;
26
+ this.ngtStylizableDirective = ngtStylizableDirective;
27
+ this.formContainer = formContainer;
28
+ this.ngtFormComponent = ngtFormComponent;
29
+ this.ngtValidationService = ngtValidationService;
30
+ this.ngtResourceService = ngtResourceService;
31
+ this.ngtForm = ngtForm;
32
+ this.ngtSection = ngtSection;
33
+ this.ngtModal = ngtModal;
34
+ this.ngtTranslateService = ngtTranslateService;
35
+ this.placeholder = '';
36
+ this.helpTextColor = 'text-green-500';
37
+ this.decimalMaskPrecision = 2;
38
+ this.showCharactersLength = false;
39
+ this.uppercase = false;
40
+ this.type = 'text';
41
+ this.helperAutoXReverse = true;
42
+ this.onClickLeftIcon = new EventEmitter();
43
+ this.onClickRightIcon = new EventEmitter();
44
+ this.validatePhoneResult = new EventEmitter();
45
+ this.inputProperties = {};
46
+ this.subscriptions = [];
47
+ if (this.ngtFormComponent) {
48
+ this.shining = this.ngtFormComponent.isShining();
49
+ this.subscriptions.push(this.ngtFormComponent.onShiningChange.subscribe((shining) => {
50
+ this.shining = shining;
51
+ }));
52
+ }
53
+ if (this.ngtStylizableDirective) {
54
+ this.ngtStyle = this.ngtStylizableDirective.getNgtStylizableService();
55
+ }
56
+ else {
57
+ this.ngtStyle = new NgtStylizableService();
58
+ }
59
+ this.ngtStyle.load(this.injector, 'NgtInput', {
60
+ h: 'h-12',
61
+ rounded: 'rounded',
62
+ text: 'text-sm',
63
+ font: 'font-normal',
64
+ color: {
65
+ border: 'border-gray-400 focus:border-gray-700',
66
+ bg: 'bg-bg-white focus:bg-white',
67
+ text: 'text-gray-800'
68
+ }
69
+ });
70
+ }
71
+ ngOnInit() {
72
+ if (!this.formContainer) {
73
+ console.error("The element must be inside a <form #form='ngForm'> tag!", this.element.nativeElement);
74
+ }
75
+ if (!this.name) {
76
+ console.error("The element must contain a name attribute!", this.element.nativeElement);
77
+ }
78
+ else {
79
+ setTimeout(() => {
80
+ this.componentReady = true;
81
+ this.changeDetector.detectChanges();
82
+ setTimeout(() => {
83
+ this.initComponent();
84
+ this.changeDetector.detectChanges();
85
+ if (!this.getElementTitle() || this.getElementTitle() === 'null') {
86
+ this.element.nativeElement.parentElement.parentElement.title = '';
87
+ }
88
+ this.changeDetector.detectChanges();
89
+ });
90
+ }, 500);
91
+ }
92
+ }
93
+ ngOnChanges(changes) {
94
+ this.setupMasks(changes.mask ? changes.mask.previousValue : null);
95
+ if (changes.match || changes.isRequired || changes.type || changes.mask || changes.minValue) {
96
+ this.updateValidations();
97
+ }
98
+ }
99
+ ngOnDestroy() {
100
+ this.destroySubscriptions();
101
+ }
102
+ onNativeChange() {
103
+ if (this.hasChangesBetweenModels()) {
104
+ this.value = this.removeMasks(this.getNativeValue());
105
+ }
106
+ }
107
+ change(value) {
108
+ if (value && typeof value === 'string' && this.mask == 'decimal') {
109
+ value = parseFloat(value);
110
+ }
111
+ if (!this.getNativeValue() || (this.validateMinValueOnMask)) {
112
+ this.element.nativeElement.value = value ?? '';
113
+ }
114
+ if (!value && value !== 0) {
115
+ this.clearInput();
116
+ }
117
+ let nativeValue = this.getNativeValue();
118
+ if (this.mask) {
119
+ let ngModelValue = this.removeMasks(nativeValue);
120
+ if (nativeValue && ngModelValue != this.value) {
121
+ this.value = ngModelValue;
122
+ }
123
+ if ((this.mask == InputMaskEnum.CELLPHONE || this.mask == InputMaskEnum.INTERNATIONAL_PHONE)
124
+ && this.allowPhoneValidation && this.value) {
125
+ this.validatePhone();
126
+ }
127
+ }
128
+ else {
129
+ let ngModelValue = this.removeMasks(value);
130
+ if (value && ngModelValue != value) {
131
+ this.value = ngModelValue;
132
+ }
133
+ if (this.value != nativeValue) {
134
+ this.element.nativeElement.value = ngModelValue;
135
+ }
136
+ }
137
+ if (this.componentReady) {
138
+ this.onValueChangeEvent.emit(this.value);
139
+ }
140
+ if (this.ngtResourceService && this.findExistingResource && this.value) {
141
+ this.searchExistingResource();
142
+ }
143
+ }
144
+ setFocus() {
145
+ setTimeout(() => {
146
+ this.element.nativeElement.focus();
147
+ }, 200);
148
+ }
149
+ clearInput(event) {
150
+ if (event) {
151
+ event.stopPropagation();
152
+ }
153
+ this.element.nativeElement.value = '';
154
+ this.value = '';
155
+ this.markAsPristine();
156
+ }
157
+ restorePlaceholder() {
158
+ setTimeout(() => this.element.nativeElement.placeholder = this.placeholder);
159
+ }
160
+ showPassword() {
161
+ this.element.nativeElement.type = 'text';
162
+ this.changeDetector.detectChanges();
163
+ }
164
+ hidePassword() {
165
+ this.element.nativeElement.type = 'password';
166
+ this.changeDetector.detectChanges();
167
+ }
168
+ getInputPaddings() {
169
+ let paddingClass = '';
170
+ if (this.innerLeftIcon || this.customInnerContentTemplate) {
171
+ paddingClass += 'pl-10 pr-4 ';
172
+ }
173
+ else {
174
+ paddingClass += 'px-4 ';
175
+ }
176
+ if (this.innerRightIcon || this.allowClear || this.type == 'password') {
177
+ if (this.allowClear && this.value && (this.innerRightIcon || this.type == 'password')) {
178
+ paddingClass += 'pr-16 ';
179
+ }
180
+ else {
181
+ paddingClass += 'pr-8 ';
182
+ }
183
+ }
184
+ return paddingClass;
185
+ }
186
+ getRemainingCharacters() {
187
+ if (this.element?.nativeElement?.value?.length) {
188
+ if ((this.maxTotalCharsCount - this.element.nativeElement.value.length) > 0) {
189
+ return this.maxTotalCharsCount - this.element.nativeElement.value.length;
190
+ }
191
+ else {
192
+ return 0;
193
+ }
194
+ }
195
+ return this.maxTotalCharsCount;
196
+ }
197
+ hasFocus() {
198
+ return document.activeElement === this.element.nativeElement;
199
+ }
200
+ disabled() {
201
+ return this.isDisabled || this.isDisabledByParent();
202
+ }
203
+ initComponent() {
204
+ if (this.formContainer && this.formContainer.control && (this.formControl = this.formContainer.control.get(this.name))) {
205
+ if (this.focus) {
206
+ this.setFocus();
207
+ }
208
+ let watch = "change";
209
+ if (this.jit) {
210
+ watch += " keyup keydown keypress";
211
+ }
212
+ watch.split(' ').forEach((evt) => {
213
+ this.renderer.listen(this.element.nativeElement, evt, () => {
214
+ let nativeValue = this.removeMasks(this.getNativeValue());
215
+ if (this.value != nativeValue) {
216
+ this.value = nativeValue;
217
+ }
218
+ });
219
+ });
220
+ this.renderer.listen(this.element.nativeElement, "keydown", (event) => {
221
+ if (this.element.nativeElement && this.element.nativeElement.value && this.element.nativeElement.value.length >= this.maxLength) {
222
+ // Backspace and delete
223
+ if (event.keyCode != 8 && event.keyCode != 46) {
224
+ event.preventDefault();
225
+ return false;
226
+ }
227
+ }
228
+ });
229
+ this.maxTotalCharsCount = this.maxLength;
230
+ this.updateValidations();
231
+ if (this.match) {
232
+ this.renderer.listen(this.element.nativeElement, "keypress", () => {
233
+ this.matchValidator();
234
+ });
235
+ }
236
+ if (this.value) {
237
+ this.formControl.markAsDirty();
238
+ }
239
+ else {
240
+ this.formControl.markAsPristine();
241
+ }
242
+ }
243
+ this.setupProperties();
244
+ }
245
+ updateValidations() {
246
+ if (!this.formControl) {
247
+ return;
248
+ }
249
+ const syncValidators = [];
250
+ if (this.type == 'email') {
251
+ syncValidators.push(Validators.email);
252
+ }
253
+ if (this.isRequired) {
254
+ syncValidators.push(Validators.required);
255
+ }
256
+ if (this.maxLength) {
257
+ syncValidators.push(Validators.maxLength(this.maxLength));
258
+ }
259
+ if (this.minLength) {
260
+ syncValidators.push(Validators.minLength(this.minLength));
261
+ }
262
+ if (this.mask == 'cnpj-cpf' || this.mask == 'cnpj-cpf-rut' || this.mask == 'cpf') {
263
+ syncValidators.push(this.cnpjCpfValidator());
264
+ }
265
+ if (this.mask == 'time') {
266
+ syncValidators.push(this.timeValidator());
267
+ }
268
+ if (this.match) {
269
+ syncValidators.push(this.matchValidator());
270
+ }
271
+ if (this.minValue !== undefined) {
272
+ syncValidators.push(this.minValueValidator());
273
+ }
274
+ if (this.multipleOf) {
275
+ syncValidators.push(this.multipleOfValidator());
276
+ }
277
+ if (this.externalServerDependency) {
278
+ syncValidators.push(this.externalServerDependencyValidator());
279
+ }
280
+ setTimeout(() => {
281
+ this.formControl.setValidators(syncValidators);
282
+ const asyncValidators = [];
283
+ if (this.uniqueResource) {
284
+ asyncValidators.push(this.uniqueValidator());
285
+ }
286
+ if (this.type == 'email' && this.hasEmailServiceValidation()) {
287
+ asyncValidators.push(this.emailValidator());
288
+ }
289
+ if (this.type == 'login' && this.hasEmailServiceValidation()) {
290
+ asyncValidators.push(this.emailValidator(true));
291
+ }
292
+ if (this.type == 'password' && this.validatePassword && this.hasPasswordValidation()) {
293
+ asyncValidators.push(this.passwordValidator());
294
+ }
295
+ this.formControl.setAsyncValidators(asyncValidators);
296
+ this.formControl.updateValueAndValidity();
297
+ });
298
+ }
299
+ setupMasks(previousMask) {
300
+ if (this.mask != previousMask && !this.mask) {
301
+ removeInputMask(this.element.nativeElement);
302
+ return this.clearInput();
303
+ }
304
+ let masks = {
305
+ [InputMaskEnum.CPF]: {
306
+ mask: ['999.999.999-99'],
307
+ showMaskOnHover: false
308
+ },
309
+ [InputMaskEnum.CNPJ]: {
310
+ mask: ['99.999.999/9999-99'],
311
+ showMaskOnHover: false
312
+ },
313
+ [InputMaskEnum.CUIT]: {
314
+ mask: ['99-99999999-9'],
315
+ clearMaskOnLostFocus: false
316
+ },
317
+ [InputMaskEnum.RUT]: {
318
+ mask: ['999999999999'],
319
+ clearMaskOnLostFocus: false
320
+ },
321
+ [InputMaskEnum.CPF_CNPJ_RUT]: {
322
+ mask: ['999.999.999-99', '999999999999', '99.999.999/9999-99'],
323
+ keepStatic: true,
324
+ showMaskOnHover: false
325
+ },
326
+ [InputMaskEnum.CPF_CNPJ]: {
327
+ mask: ['999.999.999-99', '99.999.999/9999-99'],
328
+ keepStatic: true,
329
+ showMaskOnHover: false
330
+ },
331
+ [InputMaskEnum.DECIMAL]: {
332
+ digits: this.decimalMaskPrecision,
333
+ groupSeparator: '.',
334
+ radixPoint: ',',
335
+ autoGroup: true,
336
+ repeat: 16,
337
+ rightAlign: false,
338
+ max: this.maxValue,
339
+ showMaskOnHover: false
340
+ },
341
+ [InputMaskEnum.CELLPHONE]: {
342
+ mask: ['(99) 999-999', '(99) 9999-9999', '(99) 99999-9999'],
343
+ keepStatic: true,
344
+ showMaskOnHover: false
345
+ },
346
+ [InputMaskEnum.INTERNATIONAL_PHONE]: {
347
+ mask: ['+999 99 999-999', '+99 (99) 9999-9999', '+99 (99) 99999-9999', '+999 (99) 9999-9999', '+999 (99) 99999-9999'],
348
+ keepStatic: true,
349
+ showMaskOnHover: false
350
+ },
351
+ [InputMaskEnum.PLATE]: {
352
+ mask: ['AAA-9&99'],
353
+ keepStatic: true,
354
+ showMaskOnHover: false
355
+ },
356
+ [InputMaskEnum.CEP]: {
357
+ mask: ['99999-999'],
358
+ showMaskOnHover: false
359
+ },
360
+ [InputMaskEnum.INTEGER]: {
361
+ max: this.maxValue,
362
+ min: this.validateMinValueOnMask ? this.minValue : undefined,
363
+ rightAlign: false,
364
+ showMaskOnHover: false
365
+ },
366
+ [InputMaskEnum.NUMERIC_STRING]: {
367
+ regex: "[0-9]*",
368
+ showMaskOnHover: false
369
+ },
370
+ [InputMaskEnum.TIME]: '99:99',
371
+ };
372
+ if (this.mask == InputMaskEnum.DECIMAL) {
373
+ applyInputMask(this.element.nativeElement, InputMaskEnum.DECIMAL, masks[this.mask]);
374
+ }
375
+ else if (this.mask == InputMaskEnum.INTEGER) {
376
+ applyInputMask(this.element.nativeElement, InputMaskEnum.INTEGER, masks[this.mask]);
377
+ }
378
+ else {
379
+ applyInputMask(this.element.nativeElement, masks[this.mask]);
380
+ }
381
+ }
382
+ setupProperties() {
383
+ let props = {
384
+ shortText: {
385
+ htmlType: "text",
386
+ length: 30
387
+ },
388
+ text: {
389
+ htmlType: "text",
390
+ length: 100
391
+ },
392
+ longText: {
393
+ htmlType: "text",
394
+ length: 150
395
+ },
396
+ extraLongText: {
397
+ htmlType: "text",
398
+ length: 300
399
+ },
400
+ customText: {
401
+ htmlType: "text",
402
+ length: this.maxLength
403
+ },
404
+ password: {
405
+ htmlType: "password",
406
+ length: 150
407
+ },
408
+ email: {
409
+ htmlType: "text",
410
+ length: 100,
411
+ },
412
+ decimal: {
413
+ htmlType: "text",
414
+ length: 9,
415
+ }
416
+ };
417
+ if (this.type in props) {
418
+ this.inputProperties = props[this.type];
419
+ this.maxLength = this.inputProperties.length;
420
+ }
421
+ else {
422
+ console.warn("Type [" + this.type + "] is not a valid tail-form-input type!", this.element.nativeElement);
423
+ }
424
+ }
425
+ minValueValidator() {
426
+ return (control) => parseFloat(control.value) < this.minValue ? { 'minValue': true } : null;
427
+ }
428
+ multipleOfValidator() {
429
+ return (control) => {
430
+ if (control.value) {
431
+ return (control.value % this.multipleOf !== 0) ? { 'multipleOf': true } : null;
432
+ }
433
+ };
434
+ }
435
+ externalServerDependencyValidator() {
436
+ // TODO: Validar tempo de requisição
437
+ return (control) => !control.value ? { 'externalServerDependency': true } : null;
438
+ }
439
+ timeValidator() {
440
+ const regexExp = new RegExp('^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
441
+ return (control) => {
442
+ if (control.value) {
443
+ if (regexExp.test(control.value)) {
444
+ return null;
445
+ }
446
+ else {
447
+ return { 'time': true };
448
+ }
449
+ }
450
+ };
451
+ }
452
+ cnpjCpfValidator() {
453
+ return (control) => {
454
+ if (!control.value) {
455
+ return null;
456
+ }
457
+ if (control.value && control.value.length <= 11) {
458
+ if (this.validatorCPF(control.value)) {
459
+ return null;
460
+ }
461
+ else {
462
+ return { 'cpf': true };
463
+ }
464
+ }
465
+ else if (control.value && control.value.length == 12) {
466
+ return null;
467
+ }
468
+ else {
469
+ if (control.value && this.validatorCNPJ(control.value)) {
470
+ return null;
471
+ }
472
+ else {
473
+ return { 'cnpj': true };
474
+ }
475
+ }
476
+ };
477
+ }
478
+ matchValidator() {
479
+ return (control) => {
480
+ if (this.value != this.match) {
481
+ return { 'match': true };
482
+ }
483
+ else {
484
+ return null;
485
+ }
486
+ };
487
+ }
488
+ emailValidator(isLoginValidation = false) {
489
+ return (control) => {
490
+ if (this.emailValidatorTimeout) {
491
+ clearTimeout(this.emailValidatorTimeout);
492
+ }
493
+ if (this.value) {
494
+ return new Promise((resolve) => {
495
+ this.emailValidatorTimeout = setTimeout(() => {
496
+ this.loading = true;
497
+ this.ngtValidationService.emailValidation(this.value)
498
+ .then((response) => {
499
+ this.loading = false;
500
+ if (isLoginValidation) {
501
+ resolve(response.valid ? { 'login': true } : null);
502
+ }
503
+ resolve(response.valid ? null : { 'email': true });
504
+ })
505
+ .catch(() => {
506
+ this.loading = false;
507
+ resolve(null);
508
+ });
509
+ }, 500);
510
+ });
511
+ }
512
+ return Promise.resolve(null);
513
+ };
514
+ }
515
+ passwordValidator() {
516
+ return (control) => {
517
+ if (this.passwordValidatorTimeout) {
518
+ clearTimeout(this.passwordValidatorTimeout);
519
+ }
520
+ if (this.value) {
521
+ return new Promise((resolve) => {
522
+ this.passwordValidatorTimeout = setTimeout(() => {
523
+ this.loading = true;
524
+ this.ngtValidationService.passwordValidation(this.value, this.passwordableId, this.passwordPolicyId)
525
+ .then((response) => {
526
+ this.loading = false;
527
+ resolve(response.valid ? null : { 'invalid_password': true });
528
+ })
529
+ .catch(() => {
530
+ this.loading = false;
531
+ resolve(null);
532
+ });
533
+ }, 500);
534
+ });
535
+ }
536
+ return Promise.resolve(null);
537
+ };
538
+ }
539
+ async searchExistingResource() {
540
+ if (this.searchExistingResourceTimeout) {
541
+ clearTimeout(this.searchExistingResourceTimeout);
542
+ }
543
+ this.searchExistingResourceTimeout = setTimeout(() => {
544
+ this.loading = true;
545
+ this.findExistingResource.value = this.value;
546
+ this.ngtResourceService.findExisting(this.findExistingResource)
547
+ .then((response) => this.existingResourceId = response.id)
548
+ .catch(() => this.existingResourceId = null)
549
+ .finally(() => this.loading = false);
550
+ }, 500);
551
+ }
552
+ async validatePhone() {
553
+ if (this.phoneValidatorTimeout) {
554
+ clearTimeout(this.phoneValidatorTimeout);
555
+ }
556
+ this.phoneValidatorTimeout = setTimeout(() => {
557
+ this.loading = true;
558
+ this.ngtValidationService.phoneValidation(this.value)
559
+ .then((response) => this.validatePhoneResult.emit(response))
560
+ .finally(() => this.loading = false);
561
+ });
562
+ }
563
+ uniqueValidator() {
564
+ if (!this.ngtValidationService) {
565
+ throw new Error("In order to use unique validation you must provide a implementation for NgtHttpValidationService class!");
566
+ }
567
+ return (control) => {
568
+ if (this.uniqueValidatorTimeout) {
569
+ clearTimeout(this.uniqueValidatorTimeout);
570
+ }
571
+ if (this.value && this.uniqueResource) {
572
+ return new Promise((resolve) => {
573
+ this.uniqueValidatorTimeout = setTimeout(() => {
574
+ this.loading = true;
575
+ this.ngtValidationService.unique(this.uniqueResource, this.value).then((response) => {
576
+ this.loading = false;
577
+ resolve(response.valid ? null : { 'unique': true });
578
+ }).catch(() => {
579
+ this.loading = false;
580
+ resolve(null);
581
+ });
582
+ }, 500);
583
+ });
584
+ }
585
+ return Promise.resolve(null);
586
+ };
587
+ }
588
+ validatorCNPJ(value) {
589
+ let b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
590
+ if ((value = value.replace(/[^\d]/g, "")).length != 14) {
591
+ return false;
592
+ }
593
+ if (/0{14}/.test(value)) {
594
+ return false;
595
+ }
596
+ let n = 0;
597
+ for (let i = 0; i < 12; n += value[i] * b[++i]) {
598
+ ;
599
+ }
600
+ if (value[12] != (((n %= 11) < 2) ? 0 : 11 - n)) {
601
+ return false;
602
+ }
603
+ n = 0;
604
+ for (let i = 0; i <= 12; n += value[i] * b[i++]) {
605
+ ;
606
+ }
607
+ if (value[13] != (((n %= 11) < 2) ? 0 : 11 - n)) {
608
+ return false;
609
+ }
610
+ return true;
611
+ }
612
+ ;
613
+ validatorCPF(value) {
614
+ let numeros, digitos, soma, i, resultado, digitos_iguais;
615
+ digitos_iguais = 1;
616
+ if (value.length < 11) {
617
+ return false;
618
+ }
619
+ for (i = 0; i < value.length - 1; i++) {
620
+ if (value.charAt(i) != value.charAt(i + 1)) {
621
+ digitos_iguais = 0;
622
+ break;
623
+ }
624
+ }
625
+ if (!digitos_iguais) {
626
+ numeros = value.substring(0, 9);
627
+ digitos = value.substring(9);
628
+ soma = 0;
629
+ for (i = 10; i > 1; i--) {
630
+ soma += numeros.charAt(10 - i) * i;
631
+ }
632
+ resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
633
+ if (resultado != digitos.charAt(0)) {
634
+ return false;
635
+ }
636
+ numeros = value.substring(0, 10);
637
+ soma = 0;
638
+ for (i = 11; i > 1; i--) {
639
+ soma += numeros.charAt(11 - i) * i;
640
+ }
641
+ resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
642
+ if (resultado != digitos.charAt(1)) {
643
+ return false;
644
+ }
645
+ return true;
646
+ }
647
+ else {
648
+ return false;
649
+ }
650
+ }
651
+ getNativeValue() {
652
+ return this.element.nativeElement.value;
653
+ }
654
+ getElementTitle() {
655
+ return this.element.nativeElement.parentElement.parentElement.title;
656
+ }
657
+ removeMasks(value) {
658
+ if (this.mask == "decimal") {
659
+ value = (value + "")
660
+ .replace(/\./g, '')
661
+ .replace(',', '.');
662
+ }
663
+ else if (this.mask == "cnpj-cpf" || this.mask == "cpf" || this.mask == "cnpj" || this.mask == "cnpj-cpf-rut" || this.mask == "cuit") {
664
+ value = (value + "")
665
+ .replace(/[^\d]/g, '');
666
+ }
667
+ else if (this.mask == InputMaskEnum.CELLPHONE
668
+ || this.mask == InputMaskEnum.INTERNATIONAL_PHONE) {
669
+ value = (value + "")
670
+ .replace('(', '')
671
+ .replace(')', '')
672
+ .replace(' ', '')
673
+ .replace(' ', '')
674
+ .replace('-', '')
675
+ .replace('+', '');
676
+ }
677
+ return value;
678
+ }
679
+ hasEmailServiceValidation() {
680
+ return typeof this.ngtValidationService?.emailValidation === 'function';
681
+ }
682
+ hasPasswordValidation() {
683
+ return typeof this.ngtValidationService?.passwordValidation === 'function';
684
+ }
685
+ isDisabledByParent() {
686
+ return this.ngtForm?.isDisabled
687
+ || this.ngtSection?.isDisabled
688
+ || this.ngtModal?.isDisabled;
689
+ }
690
+ hasChangesBetweenModels() {
691
+ return this.removeMasks(this.getNativeValue()) !== this.value;
692
+ }
693
+ destroySubscriptions() {
694
+ this.subscriptions.forEach(subscription => subscription.unsubscribe());
695
+ this.subscriptions = [];
696
+ }
697
+ }
698
+ NgtInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.NgtStylizableDirective, optional: true, self: true }, { token: i2.ControlContainer, host: true, optional: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtHttpValidationService, optional: true, skipSelf: true }, { token: i5.NgtHttpResourceService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i6.NgtSectionComponent, optional: true, skipSelf: true }, { token: i7.NgtModalComponent, optional: true, skipSelf: true }, { token: i8.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
699
+ NgtInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtInputComponent, selector: "ngt-input", inputs: { label: "label", placeholder: "placeholder", shining: "shining", loading: "loading", helpTitle: "helpTitle", helpTextColor: "helpTextColor", helpText: "helpText", innerLeftIcon: "innerLeftIcon", innerLeftIconColor: "innerLeftIconColor", innerRightIcon: "innerRightIcon", innerRightIconColor: "innerRightIconColor", decimalMaskPrecision: "decimalMaskPrecision", showCharactersLength: "showCharactersLength", uppercase: "uppercase", customInnerContentTemplate: "customInnerContentTemplate", isDisabled: "isDisabled", isReadonly: "isReadonly", showRoundedIcon: "showRoundedIcon", type: "type", name: "name", mask: "mask", focus: "focus", allowClear: "allowClear", jit: "jit", findExistingResource: "findExistingResource", allowPhoneValidation: "allowPhoneValidation", validatePassword: "validatePassword", passwordableId: "passwordableId", passwordPolicyId: "passwordPolicyId", isRequired: "isRequired", uniqueResource: "uniqueResource", minValue: "minValue", maxValue: "maxValue", maxLength: "maxLength", minLength: "minLength", match: "match", multipleOf: "multipleOf", validateMinValueOnMask: "validateMinValueOnMask", externalServerDependency: "externalServerDependency", helperReverseYPosition: "helperReverseYPosition", helperAutoXReverse: "helperAutoXReverse" }, outputs: { onClickLeftIcon: "onClickLeftIcon", onClickRightIcon: "onClickRightIcon", validatePhoneResult: "validatePhoneResult" }, providers: [
700
+ NgtMakeProvider(NgtInputComponent),
701
+ ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\r\n {{ label }}:\r\n\r\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\r\n\r\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\r\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\r\n <span [innerHtml]=\"helpText\"></span>\r\n </ngt-helper>\r\n</label>\r\n\r\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\r\n <input autocomplete=\"new-password\"\r\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\r\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\r\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\r\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\r\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\r\n (change)=\"onNativeChange()\" #element>\r\n <span *ngIf=\"innerLeftIcon\"\r\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickLeftIcon.emit()\">\r\n\r\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"fill-current\" [src]='innerLeftIcon'></ngt-svg>\r\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-6\" [src]='innerLeftIcon'>\r\n </span>\r\n\r\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\r\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\r\n </div>\r\n\r\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\r\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\r\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\r\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\r\n <div class=\"div-loader\"></div>\r\n </span>\r\n\r\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\r\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\r\n <path\r\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\r\n <path\r\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"innerRightIcon && type != 'password'\"\r\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickRightIcon.emit()\">\r\n <ngt-svg class=\"fill-current\" [src]='innerRightIcon'></ngt-svg>\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\r\n <p class=\"text-xs mt-1\">\r\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\r\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\r\n </p>\r\n</ng-container>\r\n\r\n<ng-container *ngIf='shining'>\r\n <div class=\"flex\">\r\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\r\n </div>\r\n</ng-container>\r\n\r\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\r\n\r\n<ng-content></ng-content>\r\n\r\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\r\n</ngt-validation>", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i11.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i12.NgtSvgComponent, selector: "ngt-svg", inputs: ["src", "class"] }, { kind: "component", type: i13.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }], viewProviders: [
702
+ { provide: ControlContainer, useExisting: NgForm }
703
+ ] });
704
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, decorators: [{
705
+ type: Component,
706
+ args: [{ selector: 'ngt-input', providers: [
707
+ NgtMakeProvider(NgtInputComponent),
708
+ ], viewProviders: [
709
+ { provide: ControlContainer, useExisting: NgForm }
710
+ ], template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\r\n {{ label }}:\r\n\r\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\r\n\r\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\r\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\r\n <span [innerHtml]=\"helpText\"></span>\r\n </ngt-helper>\r\n</label>\r\n\r\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\r\n <input autocomplete=\"new-password\"\r\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\r\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\r\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\r\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\r\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\r\n (change)=\"onNativeChange()\" #element>\r\n <span *ngIf=\"innerLeftIcon\"\r\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickLeftIcon.emit()\">\r\n\r\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"fill-current\" [src]='innerLeftIcon'></ngt-svg>\r\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-6\" [src]='innerLeftIcon'>\r\n </span>\r\n\r\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\r\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\r\n </div>\r\n\r\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\r\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\r\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\r\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\r\n <div class=\"div-loader\"></div>\r\n </span>\r\n\r\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\r\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\r\n <path\r\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\r\n <path\r\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"innerRightIcon && type != 'password'\"\r\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickRightIcon.emit()\">\r\n <ngt-svg class=\"fill-current\" [src]='innerRightIcon'></ngt-svg>\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\r\n <p class=\"text-xs mt-1\">\r\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\r\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\r\n </p>\r\n</ng-container>\r\n\r\n<ng-container *ngIf='shining'>\r\n <div class=\"flex\">\r\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\r\n </div>\r\n</ng-container>\r\n\r\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\r\n\r\n<ng-content></ng-content>\r\n\r\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\r\n</ngt-validation>", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
711
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.NgtStylizableDirective, decorators: [{
712
+ type: Self
713
+ }, {
714
+ type: Optional
715
+ }] }, { type: i2.ControlContainer, decorators: [{
716
+ type: Optional
717
+ }, {
718
+ type: Host
719
+ }] }, { type: i3.NgtFormComponent, decorators: [{
720
+ type: Optional
721
+ }, {
722
+ type: SkipSelf
723
+ }] }, { type: i4.NgtHttpValidationService, decorators: [{
724
+ type: Optional
725
+ }, {
726
+ type: SkipSelf
727
+ }] }, { type: i5.NgtHttpResourceService, decorators: [{
728
+ type: Optional
729
+ }, {
730
+ type: SkipSelf
731
+ }] }, { type: i3.NgtFormComponent, decorators: [{
732
+ type: Optional
733
+ }, {
734
+ type: SkipSelf
735
+ }] }, { type: i6.NgtSectionComponent, decorators: [{
736
+ type: Optional
737
+ }, {
738
+ type: SkipSelf
739
+ }] }, { type: i7.NgtModalComponent, decorators: [{
740
+ type: Optional
741
+ }, {
742
+ type: SkipSelf
743
+ }] }, { type: i8.NgtTranslateService, decorators: [{
744
+ type: Optional
745
+ }] }]; }, propDecorators: { element: [{
746
+ type: ViewChild,
747
+ args: ["element", { static: true }]
748
+ }], label: [{
749
+ type: Input
750
+ }], placeholder: [{
751
+ type: Input
752
+ }], shining: [{
753
+ type: Input
754
+ }], loading: [{
755
+ type: Input
756
+ }], helpTitle: [{
757
+ type: Input
758
+ }], helpTextColor: [{
759
+ type: Input
760
+ }], helpText: [{
761
+ type: Input
762
+ }], innerLeftIcon: [{
763
+ type: Input
764
+ }], innerLeftIconColor: [{
765
+ type: Input
766
+ }], innerRightIcon: [{
767
+ type: Input
768
+ }], innerRightIconColor: [{
769
+ type: Input
770
+ }], decimalMaskPrecision: [{
771
+ type: Input
772
+ }], showCharactersLength: [{
773
+ type: Input
774
+ }], uppercase: [{
775
+ type: Input
776
+ }], customInnerContentTemplate: [{
777
+ type: Input
778
+ }], isDisabled: [{
779
+ type: Input
780
+ }], isReadonly: [{
781
+ type: Input
782
+ }], showRoundedIcon: [{
783
+ type: Input
784
+ }], type: [{
785
+ type: Input
786
+ }], name: [{
787
+ type: Input
788
+ }], mask: [{
789
+ type: Input
790
+ }], focus: [{
791
+ type: Input
792
+ }], allowClear: [{
793
+ type: Input
794
+ }], jit: [{
795
+ type: Input
796
+ }], findExistingResource: [{
797
+ type: Input
798
+ }], allowPhoneValidation: [{
799
+ type: Input
800
+ }], validatePassword: [{
801
+ type: Input
802
+ }], passwordableId: [{
803
+ type: Input
804
+ }], passwordPolicyId: [{
805
+ type: Input
806
+ }], isRequired: [{
807
+ type: Input
808
+ }], uniqueResource: [{
809
+ type: Input
810
+ }], minValue: [{
811
+ type: Input
812
+ }], maxValue: [{
813
+ type: Input
814
+ }], maxLength: [{
815
+ type: Input
816
+ }], minLength: [{
817
+ type: Input
818
+ }], match: [{
819
+ type: Input
820
+ }], multipleOf: [{
821
+ type: Input
822
+ }], validateMinValueOnMask: [{
823
+ type: Input
824
+ }], externalServerDependency: [{
825
+ type: Input
826
+ }], helperReverseYPosition: [{
827
+ type: Input
828
+ }], helperAutoXReverse: [{
829
+ type: Input
830
+ }], onClickLeftIcon: [{
831
+ type: Output
832
+ }], onClickRightIcon: [{
833
+ type: Output
834
+ }], validatePhoneResult: [{
835
+ type: Output
836
+ }] } });
837
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFFBQVEsRUFFUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVE1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I1RixNQUFNLE9BQU8saUJBQWtCLFNBQVEsY0FBYztJQXVFakQsWUFDWSxRQUFrQixFQUNsQixRQUFtQixFQUNuQixjQUFpQyxFQUdqQyxzQkFBOEMsRUFHL0MsYUFBK0IsRUFHOUIsZ0JBQWtDLEVBR2xDLG9CQUE4QyxFQUc5QyxrQkFBMEMsRUFHMUMsT0FBeUIsRUFHekIsVUFBK0IsRUFHL0IsUUFBMkIsRUFHNUIsbUJBQXdDO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBL0JBLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixt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QUFuQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLEdBQUc7c0JBQWxCLEtBQUs7Z0JBR1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUNVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLHNCQUFzQjtzQkFBckMsS0FBSztnQkFDVSx3QkFBd0I7c0JBQXZDLEtBQUs7Z0JBQ1Usc0JBQXNCO3NCQUFyQyxLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFFVyxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLGdCQUFnQjtzQkFBaEMsTUFBTTtnQkFDVSxtQkFBbUI7c0JBQW5DLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSG9zdCxcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNlbGYsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgU2tpcFNlbGYsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBBc3luY1ZhbGlkYXRvckZuLCBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgTmd0QmFzZU5nTW9kZWwsIE5ndE1ha2VQcm92aWRlciB9IGZyb20gJy4uLy4uL2Jhc2Uvbmd0LWJhc2UtbmctbW9kZWwnO1xyXG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9uZ3Qtc3R5bGl6YWJsZS9uZ3Qtc3R5bGl6YWJsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBhcHBseUlucHV0TWFzaywgSW5wdXRNYXNrRW51bSwgcmVtb3ZlSW5wdXRNYXNrIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnB1dC1tYXNrL2lucHV0LW1hc2suaGVscGVyJztcclxuaW1wb3J0IHtcclxuICAgIE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZUludGVyZmFjZSxcclxuICAgIE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZVJlc3BvbnNlLFxyXG4gICAgTmd0SHR0cFJlc291cmNlU2VydmljZSxcclxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLXJlc291cmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RIdHRwVmFsaWRhdGlvblJlc3BvbnNlLCBOZ3RIdHRwVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLXZhbGlkYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC10cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndFN0eWxpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9uZ3QtZm9ybS9uZ3QtZm9ybS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOZ3RTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LXNlY3Rpb24vbmd0LXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd0LWlucHV0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWlucHV0LmNvbXBvbmVudC5jc3MnXSxcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIE5ndE1ha2VQcm92aWRlcihOZ3RJbnB1dENvbXBvbmVudCksXHJcbiAgICBdLFxyXG4gICAgdmlld1Byb3ZpZGVyczogW1xyXG4gICAgICAgIHsgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3RJbnB1dENvbXBvbmVudCBleHRlbmRzIE5ndEJhc2VOZ01vZGVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQFZpZXdDaGlsZChcImVsZW1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLy8gVmlzdWFsXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hpbmluZzogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHQ6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpbm5lckxlZnRJY29uOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJMZWZ0SWNvbkNvbG9yOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJSaWdodEljb246IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpbm5lclJpZ2h0SWNvbkNvbG9yOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVjaW1hbE1hc2tQcmVjaXNpb246IG51bWJlciA9IDI7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0NoYXJhY3RlcnNMZW5ndGg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyB1cHBlcmNhc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvL0JlaGF2aW9yXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1JlYWRvbmx5OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dSb3VuZGVkSWNvbjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0eXBlOiBzdHJpbmcgPSAndGV4dCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIG1hc2s6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBmb2N1czogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd0NsZWFyOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGppdDogYm9vbGVhbjtcclxuXHJcbiAgICAvL1ZhbGlkYXRpb25zXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZmluZEV4aXN0aW5nUmVzb3VyY2U6IE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZUludGVyZmFjZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd1Bob25lVmFsaWRhdGlvbjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWxpZGF0ZVBhc3N3b3JkOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhc3N3b3JkYWJsZUlkOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFzc3dvcmRQb2xpY3lJZDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdW5pcXVlUmVzb3VyY2U6IGFueTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5WYWx1ZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcHVibGljIG1heFZhbHVlOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF0Y2g6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZU9mOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGVNaW5WYWx1ZU9uTWFzazogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBleHRlcm5hbFNlcnZlckRlcGVuZGVuY3k6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscGVyUmV2ZXJzZVlQb3NpdGlvbjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwZXJBdXRvWFJldmVyc2U6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGlja0xlZnRJY29uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsaWNrUmlnaHRJY29uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyB2YWxpZGF0ZVBob25lUmVzdWx0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIHB1YmxpYyBtYXhUb3RhbENoYXJzQ291bnQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBleGlzdGluZ1Jlc291cmNlSWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBjb21wb25lbnRSZWFkeTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBpbnB1dFByb3BlcnRpZXM6IHtcclxuICAgICAgICBodG1sVHlwZT86IHN0cmluZztcclxuICAgICAgICBsZW5ndGg/OiBudW1iZXI7XHJcbiAgICB9ID0ge307XHJcblxyXG4gICAgcHVibGljIG5ndFN0eWxlOiBOZ3RTdHlsaXphYmxlU2VydmljZTtcclxuXHJcbiAgICBwcml2YXRlIGVtYWlsVmFsaWRhdG9yVGltZW91dDogYW55O1xyXG4gICAgcHJpdmF0ZSBwYXNzd29yZFZhbGlkYXRvclRpbWVvdXQ6IGFueTtcclxuICAgIHByaXZhdGUgcGhvbmVWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XHJcbiAgICBwcml2YXRlIHVuaXF1ZVZhbGlkYXRvclRpbWVvdXQ6IGFueTtcclxuICAgIHByaXZhdGUgc2VhcmNoRXhpc3RpbmdSZXNvdXJjZVRpbWVvdXQ6IGFueTtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcblxyXG4gICAgICAgIEBTZWxmKCkgQE9wdGlvbmFsKClcclxuICAgICAgICBwcml2YXRlIG5ndFN0eWxpemFibGVEaXJlY3RpdmU6IE5ndFN0eWxpemFibGVEaXJlY3RpdmUsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBIb3N0KClcclxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcclxuICAgICAgICBwcml2YXRlIG5ndEZvcm1Db21wb25lbnQ6IE5ndEZvcm1Db21wb25lbnQsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RWYWxpZGF0aW9uU2VydmljZTogTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlLFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0UmVzb3VyY2VTZXJ2aWNlOiBOZ3RIdHRwUmVzb3VyY2VTZXJ2aWNlLFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0Rm9ybTogTmd0Rm9ybUNvbXBvbmVudCxcclxuXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcclxuICAgICAgICBwcml2YXRlIG5ndFNlY3Rpb246IE5ndFNlY3Rpb25Db21wb25lbnQsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RNb2RhbDogTmd0TW9kYWxDb21wb25lbnQsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpXHJcbiAgICAgICAgcHVibGljIG5ndFRyYW5zbGF0ZVNlcnZpY2U6IE5ndFRyYW5zbGF0ZVNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ndEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gdGhpcy5uZ3RGb3JtQ29tcG9uZW50LmlzU2hpbmluZygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5ndEZvcm1Db21wb25lbnQub25TaGluaW5nQ2hhbmdlLnN1YnNjcmliZSgoc2hpbmluZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHNoaW5pbmc7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5ndFN0eWxlID0gdGhpcy5uZ3RTdHlsaXphYmxlRGlyZWN0aXZlLmdldE5ndFN0eWxpemFibGVTZXJ2aWNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IG5ldyBOZ3RTdHlsaXphYmxlU2VydmljZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5uZ3RTdHlsZS5sb2FkKHRoaXMuaW5qZWN0b3IsICdOZ3RJbnB1dCcsIHtcclxuICAgICAgICAgICAgaDogJ2gtMTInLFxyXG4gICAgICAgICAgICByb3VuZGVkOiAncm91bmRlZCcsXHJcbiAgICAgICAgICAgIHRleHQ6ICd0ZXh0LXNtJyxcclxuICAgICAgICAgICAgZm9udDogJ2ZvbnQtbm9ybWFsJyxcclxuICAgICAgICAgICAgY29sb3I6IHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ2JvcmRlci1ncmF5LTQwMCBmb2N1czpib3JkZXItZ3JheS03MDAnLFxyXG4gICAgICAgICAgICAgICAgYmc6ICdiZy1iZy13aGl0ZSBmb2N1czpiZy13aGl0ZScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAndGV4dC1ncmF5LTgwMCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGVsZW1lbnQgbXVzdCBiZSBpbnNpZGUgYSA8Zm9ybSAjZm9ybT0nbmdGb3JtJz4gdGFnIVwiLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIGVsZW1lbnQgbXVzdCBjb250YWluIGEgbmFtZSBhdHRyaWJ1dGUhXCIsIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRFbGVtZW50VGl0bGUoKSB8fCB0aGlzLmdldEVsZW1lbnRUaXRsZSgpID09PSAnbnVsbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRpdGxlID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIHRoaXMuc2V0dXBNYXNrcyhjaGFuZ2VzLm1hc2sgPyBjaGFuZ2VzLm1hc2sucHJldmlvdXNWYWx1ZSA6IG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoY2hhbmdlcy5tYXRjaCB8fCBjaGFuZ2VzLmlzUmVxdWlyZWQgfHwgY2hhbmdlcy50eXBlIHx8IGNoYW5nZXMubWFzayB8fCBjaGFuZ2VzLm1pblZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25OYXRpdmVDaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlc0JldHdlZW5Nb2RlbHMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW1vdmVNYXNrcyh0aGlzLmdldE5hdGl2ZVZhbHVlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2hhbmdlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLm1hc2sgPT0gJ2RlY2ltYWwnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZ2V0TmF0aXZlVmFsdWUoKSB8fCAodGhpcy52YWxpZGF0ZU1pblZhbHVlT25NYXNrKSkge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlID8/ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYXRpdmVWYWx1ZSA9IHRoaXMuZ2V0TmF0aXZlVmFsdWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWFzaykge1xyXG4gICAgICAgICAgICBsZXQgbmdNb2RlbFZhbHVlID0gdGhpcy5yZW1vdmVNYXNrcyhuYXRpdmVWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobmF0aXZlVmFsdWUgJiYgbmdNb2RlbFZhbHVlICE9IHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZ01vZGVsVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICh0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5DRUxMUEhPTkUgfHwgdGhpcy5tYXNrID09IElucHV0TWFza0VudW0uSU5URVJOQVRJT05BTF9QSE9ORSlcclxuICAgICAgICAgICAgICAgICYmIHRoaXMuYWxsb3dQaG9uZVZhbGlkYXRpb24gJiYgdGhpcy52YWx1ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQaG9uZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IG5nTW9kZWxWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIG5nTW9kZWxWYWx1ZSAhPSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbmF0aXZlVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbmdNb2RlbFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWFkeSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmd0UmVzb3VyY2VTZXJ2aWNlICYmIHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UgJiYgdGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEV4aXN0aW5nUmVzb3VyY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEZvY3VzKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH0sIDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFySW5wdXQoZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xyXG5cclxuICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc3RvcmVQbGFjZWhvbGRlcigpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dQYXNzd29yZCgpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50eXBlID0gJ3RleHQnO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlUGFzc3dvcmQoKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudHlwZSA9ICdwYXNzd29yZCc7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldElucHV0UGFkZGluZ3MoKSB7XHJcbiAgICAgICAgbGV0IHBhZGRpbmdDbGFzczogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlubmVyTGVmdEljb24gfHwgdGhpcy5jdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3BsLTEwIHByLTQgJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3B4LTQgJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMuYWxsb3dDbGVhciB8fCB0aGlzLnR5cGUgPT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd0NsZWFyICYmIHRoaXMudmFsdWUgJiYgKHRoaXMuaW5uZXJSaWdodEljb24gfHwgdGhpcy50eXBlID09ICdwYXNzd29yZCcpKSB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3ByLTE2ICc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3ByLTggJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhZGRpbmdDbGFzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVtYWluaW5nQ2hhcmFjdGVycygpIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50Py5uYXRpdmVFbGVtZW50Py52YWx1ZT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5tYXhUb3RhbENoYXJzQ291bnQgLSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGgpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF4VG90YWxDaGFyc0NvdW50IC0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1heFRvdGFsQ2hhcnNDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkIHx8IHRoaXMuaXNEaXNhYmxlZEJ5UGFyZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1Db250YWluZXIgJiYgdGhpcy5mb3JtQ29udGFpbmVyLmNvbnRyb2wgJiYgKHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbC5nZXQodGhpcy5uYW1lKSkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHdhdGNoID0gXCJjaGFuZ2VcIjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmppdCkge1xyXG4gICAgICAgICAgICAgICAgd2F0Y2ggKz0gXCIga2V5dXAga2V5ZG93biBrZXlwcmVzc1wiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB3YXRjaC5zcGxpdCgnICcpLmZvckVhY2goKGV2dCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGV2dCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYXRpdmVWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModGhpcy5nZXROYXRpdmVWYWx1ZSgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbmF0aXZlVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5hdGl2ZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgJiYgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoID49IHRoaXMubWF4TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFja3NwYWNlIGFuZCBkZWxldGVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSA4ICYmIGV2ZW50LmtleUNvZGUgIT0gNDYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tYXhUb3RhbENoYXJzQ291bnQgPSB0aGlzLm1heExlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBcImtleXByZXNzXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoVmFsaWRhdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR1cFByb3BlcnRpZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZhbGlkYXRpb25zKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzeW5jVmFsaWRhdG9ycyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50eXBlID09ICdlbWFpbCcpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1heExlbmd0aCkge1xyXG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4TGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5taW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbkxlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWFzayA9PSAnY25wai1jcGYnIHx8IHRoaXMubWFzayA9PSAnY25wai1jcGYtcnV0JyB8fCB0aGlzLm1hc2sgPT0gJ2NwZicpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmNucGpDcGZWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5tYXNrID09ICd0aW1lJykge1xyXG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMudGltZVZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKSB7XHJcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy5tYXRjaFZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLm1pblZhbHVlVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVPZikge1xyXG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubXVsdGlwbGVPZlZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmV4dGVybmFsU2VydmVyRGVwZW5kZW5jeSkge1xyXG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuZXh0ZXJuYWxTZXJ2ZXJEZXBlbmRlbmN5VmFsaWRhdG9yKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhzeW5jVmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXF1ZVJlc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLnVuaXF1ZVZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnZW1haWwnICYmIHRoaXMuaGFzRW1haWxTZXJ2aWNlVmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmVtYWlsVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09ICdsb2dpbicgJiYgdGhpcy5oYXNFbWFpbFNlcnZpY2VWYWxpZGF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuZW1haWxWYWxpZGF0b3IodHJ1ZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09ICdwYXNzd29yZCcgJiYgdGhpcy52YWxpZGF0ZVBhc3N3b3JkICYmIHRoaXMuaGFzUGFzc3dvcmRWYWxpZGF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMucGFzc3dvcmRWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0dXBNYXNrcyhwcmV2aW91c01hc2s/OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5tYXNrICE9IHByZXZpb3VzTWFzayAmJiAhdGhpcy5tYXNrKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZUlucHV0TWFzayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhcklucHV0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWFza3MgPSB7XHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNQRl06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTk5Ljk5OS45OTktOTknXSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ05QSl06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTkuOTk5Ljk5OS85OTk5LTk5J10sXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNVSVRdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5LTk5OTk5OTk5LTknXSxcclxuICAgICAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5SVVRdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OTk5OTk5OTk5OSddLFxyXG4gICAgICAgICAgICAgICAgY2xlYXJNYXNrT25Mb3N0Rm9jdXM6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNQRl9DTlBKX1JVVF06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTk5Ljk5OS45OTktOTknLCAnOTk5OTk5OTk5OTk5JywgJzk5Ljk5OS45OTkvOTk5OS05OSddLFxyXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ1BGX0NOUEpdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OS45OTkuOTk5LTk5JywgJzk5Ljk5OS45OTkvOTk5OS05OSddLFxyXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uREVDSU1BTF06IHtcclxuICAgICAgICAgICAgICAgIGRpZ2l0czogdGhpcy5kZWNpbWFsTWFza1ByZWNpc2lvbixcclxuICAgICAgICAgICAgICAgIGdyb3VwU2VwYXJhdG9yOiAnLicsXHJcbiAgICAgICAgICAgICAgICByYWRpeFBvaW50OiAnLCcsXHJcbiAgICAgICAgICAgICAgICBhdXRvR3JvdXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZXBlYXQ6IDE2LFxyXG4gICAgICAgICAgICAgICAgcmlnaHRBbGlnbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4VmFsdWUsXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNFTExQSE9ORV06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnKDk5KSA5OTktOTk5JywgJyg5OSkgOTk5OS05OTk5JywgJyg5OSkgOTk5OTktOTk5OSddLFxyXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uSU5URVJOQVRJT05BTF9QSE9ORV06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnKzk5OSA5OSA5OTktOTk5JywgJys5OSAoOTkpIDk5OTktOTk5OScsICcrOTkgKDk5KSA5OTk5OS05OTk5JywgJys5OTkgKDk5KSA5OTk5LTk5OTknLCAnKzk5OSAoOTkpIDk5OTk5LTk5OTknXSxcclxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLlBMQVRFXToge1xyXG4gICAgICAgICAgICAgICAgbWFzazogWydBQUEtOSY5OSddLFxyXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ0VQXToge1xyXG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTk5OS05OTknXSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uSU5URUdFUl06IHtcclxuICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhWYWx1ZSxcclxuICAgICAgICAgICAgICAgIG1pbjogdGhpcy52YWxpZGF0ZU1pblZhbHVlT25NYXNrID8gdGhpcy5taW5WYWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHJpZ2h0QWxpZ246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5OVU1FUklDX1NUUklOR106IHtcclxuICAgICAgICAgICAgICAgIHJlZ2V4OiBcIlswLTldKlwiLFxyXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5USU1FXTogJzk5Ojk5JyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tYXNrID09IElucHV0TWFza0VudW0uREVDSU1BTCkge1xyXG4gICAgICAgICAgICBhcHBseUlucHV0TWFzayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgSW5wdXRNYXNrRW51bS5ERUNJTUFMLCBtYXNrc1t0aGlzLm1hc2tdKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLklOVEVHRVIpIHtcclxuICAgICAgICAgICAgYXBwbHlJbnB1dE1hc2sodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIElucHV0TWFza0VudW0uSU5URUdFUiwgbWFza3NbdGhpcy5tYXNrXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwbHlJbnB1dE1hc2sodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIG1hc2tzW3RoaXMubWFza10pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwUHJvcGVydGllcygpIHtcclxuICAgICAgICBsZXQgcHJvcHMgPSB7XHJcbiAgICAgICAgICAgIHNob3J0VGV4dDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAzMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEwMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsb25nVGV4dDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNTBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXh0cmFMb25nVGV4dDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAzMDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY3VzdG9tVGV4dDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLm1heExlbmd0aFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwYXNzd29yZDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwicGFzc3dvcmRcIixcclxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTUwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVtYWlsOiB7XHJcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEwMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGVjaW1hbDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA5LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSBpbiBwcm9wcykge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0UHJvcGVydGllcyA9IHByb3BzW3RoaXMudHlwZV07XHJcbiAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gdGhpcy5pbnB1dFByb3BlcnRpZXMubGVuZ3RoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlR5cGUgW1wiICsgdGhpcy50eXBlICsgXCJdIGlzIG5vdCBhIHZhbGlkIHRhaWwtZm9ybS1pbnB1dCB0eXBlIVwiLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWluVmFsdWVWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHBhcnNlRmxvYXQoY29udHJvbC52YWx1ZSkgPCB0aGlzLm1pblZhbHVlID8geyAnbWluVmFsdWUnOiB0cnVlIH0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbXVsdGlwbGVPZlZhbGlkYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb250cm9sLnZhbHVlICUgdGhpcy5tdWx0aXBsZU9mICE9PSAwKSA/IHsgJ211bHRpcGxlT2YnOiB0cnVlIH0gOiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dGVybmFsU2VydmVyRGVwZW5kZW5jeVZhbGlkYXRvcigpIHtcclxuICAgICAgICAvLyBUT0RPOiBWYWxpZGFyIHRlbXBvIGRlIHJlcXVpc2nDp8Ojb1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiAhY29udHJvbC52YWx1ZSA/IHsgJ2V4dGVybmFsU2VydmVyRGVwZW5kZW5jeSc6IHRydWUgfSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0aW1lVmFsaWRhdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4RXhwID0gbmV3IFJlZ0V4cCgnXigwWzAtOV18MVswLTldfDJbMC0zXSk6WzAtNV1bMC05XSQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZWdleEV4cC50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7ICd0aW1lJzogdHJ1ZSB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNucGpDcGZWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZS5sZW5ndGggPD0gMTEpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRvckNQRihjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAnY3BmJzogdHJ1ZSB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZS5sZW5ndGggPT0gMTIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgdGhpcy52YWxpZGF0b3JDTlBKKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7ICdjbnBqJzogdHJ1ZSB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1hdGNoVmFsaWRhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IHRoaXMubWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ICdtYXRjaCc6IHRydWUgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVtYWlsVmFsaWRhdG9yKGlzTG9naW5WYWxpZGF0aW9uOiBib29sZWFuID0gZmFsc2UpOiBBc3luY1ZhbGlkYXRvckZuIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lbWFpbFZhbGlkYXRvclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVtYWlsVmFsaWRhdG9yVGltZW91dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS5lbWFpbFZhbGlkYXRpb24odGhpcy52YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZTogTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dpblZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IHsgJ2xvZ2luJzogdHJ1ZSB9IDogbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLnZhbGlkID8gbnVsbCA6IHsgJ2VtYWlsJzogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBhc3N3b3JkVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhc3N3b3JkVmFsaWRhdG9yVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGFzc3dvcmRWYWxpZGF0b3JUaW1lb3V0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFzc3dvcmRWYWxpZGF0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndFZhbGlkYXRpb25TZXJ2aWNlLnBhc3N3b3JkVmFsaWRhdGlvbih0aGlzLnZhbHVlLCB0aGlzLnBhc3N3b3JkYWJsZUlkLCB0aGlzLnBhc3N3b3JkUG9saWN5SWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IG51bGwgOiB7ICdpbnZhbGlkX3Bhc3N3b3JkJzogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBzZWFyY2hFeGlzdGluZ1Jlc291cmNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VhcmNoRXhpc3RpbmdSZXNvdXJjZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5maW5kRXhpc3RpbmdSZXNvdXJjZS52YWx1ZSA9IHRoaXMudmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5ndFJlc291cmNlU2VydmljZS5maW5kRXhpc3RpbmcodGhpcy5maW5kRXhpc3RpbmdSZXNvdXJjZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZTogTmd0SHR0cEZpbmRFeGlzdGluZ1Jlc291cmNlUmVzcG9uc2UpID0+IHRoaXMuZXhpc3RpbmdSZXNvdXJjZUlkID0gcmVzcG9uc2UuaWQpXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy5leGlzdGluZ1Jlc291cmNlSWQgPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVBob25lKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBob25lVmFsaWRhdG9yVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UucGhvbmVWYWxpZGF0aW9uKHRoaXMudmFsdWUpXHJcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4gdGhpcy52YWxpZGF0ZVBob25lUmVzdWx0LmVtaXQocmVzcG9uc2UpKVxyXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW5pcXVlVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGlmICghdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbiBvcmRlciB0byB1c2UgdW5pcXVlIHZhbGlkYXRpb24geW91IG11c3QgcHJvdmlkZSBhIGltcGxlbWVudGF0aW9uIGZvciBOZ3RIdHRwVmFsaWRhdGlvblNlcnZpY2UgY2xhc3MhXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudW5pcXVlUmVzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS51bmlxdWUodGhpcy51bmlxdWVSZXNvdXJjZSwgdGhpcy52YWx1ZSkudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudmFsaWQgPyBudWxsIDogeyAndW5pcXVlJzogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbGlkYXRvckNOUEoodmFsdWUpIHtcclxuICAgICAgICBsZXQgYiA9IFs2LCA1LCA0LCAzLCAyLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyXTtcclxuXHJcbiAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXS9nLCBcIlwiKSkubGVuZ3RoICE9IDE0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgvMHsxNH0vLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgbiArPSB2YWx1ZVtpXSAqIGJbKytpXSkge1xyXG4gICAgICAgICAgICA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWVbMTJdICE9ICgoKG4gJT0gMTEpIDwgMikgPyAwIDogMTEgLSBuKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTI7IG4gKz0gdmFsdWVbaV0gKiBiW2krK10pIHtcclxuICAgICAgICAgICAgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlWzEzXSAhPSAoKChuICU9IDExKSA8IDIpID8gMCA6IDExIC0gbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgdmFsaWRhdG9yQ1BGKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IG51bWVyb3MsIGRpZ2l0b3MsIHNvbWEsIGksIHJlc3VsdGFkbywgZGlnaXRvc19pZ3VhaXM7XHJcblxyXG4gICAgICAgIGRpZ2l0b3NfaWd1YWlzID0gMTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IDExKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpKSAhPSB2YWx1ZS5jaGFyQXQoaSArIDEpKSB7XHJcbiAgICAgICAgICAgICAgICBkaWdpdG9zX2lndWFpcyA9IDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFkaWdpdG9zX2lndWFpcykge1xyXG4gICAgICAgICAgICBudW1lcm9zID0gdmFsdWUuc3Vic3RyaW5nKDAsIDkpO1xyXG4gICAgICAgICAgICBkaWdpdG9zID0gdmFsdWUuc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICBzb21hID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDEwOyBpID4gMTsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBzb21hICs9IG51bWVyb3MuY2hhckF0KDEwIC0gaSkgKiBpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXN1bHRhZG8gPSBzb21hICUgMTEgPCAyID8gMCA6IDExIC0gc29tYSAlIDExO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdGFkbyAhPSBkaWdpdG9zLmNoYXJBdCgwKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBudW1lcm9zID0gdmFsdWUuc3Vic3RyaW5nKDAsIDEwKTtcclxuICAgICAgICAgICAgc29tYSA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxMTsgaSA+IDE7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgc29tYSArPSBudW1lcm9zLmNoYXJBdCgxMSAtIGkpICogaTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzdWx0YWRvID0gc29tYSAlIDExIDwgMiA/IDAgOiAxMSAtIHNvbWEgJSAxMTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRhZG8gIT0gZGlnaXRvcy5jaGFyQXQoMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE5hdGl2ZVZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEVsZW1lbnRUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVNYXNrcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFzayA9PSBcImRlY2ltYWxcIikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSArIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwuL2csICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXNrID09IFwiY25wai1jcGZcIiB8fCB0aGlzLm1hc2sgPT0gXCJjcGZcIiB8fCB0aGlzLm1hc2sgPT0gXCJjbnBqXCIgfHwgdGhpcy5tYXNrID09IFwiY25wai1jcGYtcnV0XCIgfHwgdGhpcy5tYXNrID09IFwiY3VpdFwiKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlICsgXCJcIilcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXlxcZF0vZywgJycpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLkNFTExQSE9ORVxyXG4gICAgICAgICAgICB8fCB0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5JTlRFUk5BVElPTkFMX1BIT05FXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlICsgXCJcIilcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcoJywgJycpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnKScsICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyAnLCAnJylcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcgJywgJycpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnLScsICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJysnLCAnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYXNFbWFpbFNlcnZpY2VWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZT8uZW1haWxWYWxpZGF0aW9uID09PSAnZnVuY3Rpb24nO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzUGFzc3dvcmRWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZT8ucGFzc3dvcmRWYWxpZGF0aW9uID09PSAnZnVuY3Rpb24nO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNEaXNhYmxlZEJ5UGFyZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ndEZvcm0/LmlzRGlzYWJsZWRcclxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RTZWN0aW9uPy5pc0Rpc2FibGVkXHJcbiAgICAgICAgICAgIHx8IHRoaXMubmd0TW9kYWw/LmlzRGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYXNDaGFuZ2VzQmV0d2Vlbk1vZGVscygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVNYXNrcyh0aGlzLmdldE5hdGl2ZVZhbHVlKCkpICE9PSB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICAgIH1cclxufVxyXG4iLCI8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwibWItMiBmbGV4IHt7IG5ndFN0eWxlLmNvbXBpbGUoWydjb2xvci50ZXh0JywgJ3RleHQnLCAnZm9udCddKSB9fVwiIFtoaWRkZW5dPSdzaGluaW5nJz5cclxuICAgIHt7IGxhYmVsIH19OlxyXG5cclxuICAgIDxzcGFuICpuZ0lmPVwiaXNSZXF1aXJlZFwiIGNsYXNzPVwidGV4dC1yZWQtNTAwIGZvbnQtYm9sZCB0ZXh0LW1kIG1sLTFcIj4qPC9zcGFuPlxyXG5cclxuICAgIDxuZ3QtaGVscGVyICpuZ0lmPVwiaGVscFRleHRcIiBbaGVscFRpdGxlXT1cImhlbHBUaXRsZVwiIFtpY29uQ29sb3JdPVwiaGVscFRleHRDb2xvclwiXHJcbiAgICAgICAgW2hlbHBlclJldmVyc2VZUG9zaXRpb25dPVwiaGVscGVyUmV2ZXJzZVlQb3NpdGlvblwiIFthdXRvWFJldmVyc2VdPVwiaGVscGVyQXV0b1hSZXZlcnNlXCIgY2xhc3M9XCJtbC0xXCI+XHJcbiAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJoZWxwVGV4dFwiPjwvc3Bhbj5cclxuICAgIDwvbmd0LWhlbHBlcj5cclxuPC9sYWJlbD5cclxuXHJcbjxkaXYgY2xhc3M9XCJ7eyBzaGluaW5nID8gJ2hpZGRlbicgOiAnZmxleCByZWxhdGl2ZSd9fVwiPlxyXG4gICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGJvcmRlciBhcHBlYXJhbmNlLW5vbmUgZm9jdXM6b3V0bGluZS1ub25lIGxlYWRpbmctdGlnaHQgdy1mdWxsIHt7IGdldElucHV0UGFkZGluZ3MoKSB9fSB7eyBuZ3RTdHlsZS5jb21waWxlKFsnaCcsICd0ZXh0JywgJ2NvbG9yLmJvcmRlcicsICdjb2xvci5iZycsICdjb2xvci50ZXh0JywgJ3JvdW5kZWQnLCAnY3Vyc29yJ10pIH19XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiIFtyZWFkb25seV09XCJpc1JlYWRvbmx5IHx8IGxvYWRpbmdcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFtzdHlsZV09XCJ1cHBlcmNhc2UgPyAndGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZSFpbXBvcnRhbnQnOicnXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2lucHV0LWhhcy1lcnJvciBib3JkZXItcmVkLTcwMCc6IGZvcm1Db250cm9sPy5lcnJvcnMgJiYgKGZvcm1Db250cm9sPy5kaXJ0eSB8fCAoZm9ybUNvbnRhaW5lciAmJiBmb3JtQ29udGFpbmVyWydzdWJtaXR0ZWQnXSkpfVwiXHJcbiAgICAgICAgW2F0dHIudHlwZV09XCJpbnB1dFByb3BlcnRpZXMuaHRtbFR5cGVcIiAobW91c2VsZWF2ZSk9XCJyZXN0b3JlUGxhY2Vob2xkZXIoKVwiIChmb2N1c291dCk9XCJyZXN0b3JlUGxhY2Vob2xkZXIoKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvbk5hdGl2ZUNoYW5nZSgpXCIgI2VsZW1lbnQ+XHJcbiAgICA8c3BhbiAqbmdJZj1cImlubmVyTGVmdEljb25cIlxyXG4gICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgc2VsZi1jZW50ZXIgcHgtMiB7eyBpbm5lckxlZnRJY29uQ29sb3IgfX0ge3sgb25DbGlja0xlZnRJY29uID8gJ2N1cnNvci1wb2ludGVyJyA6ICcnIH19XCJcclxuICAgICAgICAoY2xpY2spPVwib25DbGlja0xlZnRJY29uLmVtaXQoKVwiPlxyXG5cclxuICAgICAgICA8bmd0LXN2ZyAqbmdJZj1cIiFzaG93Um91bmRlZEljb25cIiBjbGFzcz1cImZpbGwtY3VycmVudFwiIFtzcmNdPSdpbm5lckxlZnRJY29uJz48L25ndC1zdmc+XHJcbiAgICAgICAgPGltZyAqbmdJZj1cInNob3dSb3VuZGVkSWNvblwiIGNsYXNzPVwicm91bmRlZC1mdWxsIGgtNlwiIFtzcmNdPSdpbm5lckxlZnRJY29uJz5cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiY3VzdG9tSW5uZXJDb250ZW50VGVtcGxhdGVcIiBjbGFzcz1cImFic29sdXRlIHNlbGYtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUlubmVyQ29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBhYnNvbHV0ZSBoLWZ1bGwganVzdGlmeS1lbmQgcmlnaHQtMCB3LWF1dG9cIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFkaXNhYmxlZCgpICYmIGFsbG93Q2xlYXIgJiYgdmFsdWUgJiYgIWxvYWRpbmdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInNlbGYtY2VudGVyIHJpZ2h0LTAgcHgtMiB0ZXh0LXJlZC00MDAgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPSdjbGVhcklucHV0KCRldmVudCknPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiZmlsbC1jdXJyZW50IHNlbGYtY2VudGVyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOS4xIDE3LjJsLTUuMy01LjMgNS4zLTUuMy0xLjgtMS44LTUuMyA1LjQtNS4zLTUuMy0xLjggMS43IDUuMyA1LjMtNS4zIDUuM0w2LjcgMTlsNS4zLTUuMyA1LjMgNS4zIDEuOC0xLjh6XCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cInNlbGYtY2VudGVyIHJpZ2h0LTAgcHgtMiB0ZXh0LWdyYXktNTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbG9hZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cInR5cGUgPT0gJ3Bhc3N3b3JkJyAmJiB2YWx1ZVwiIGNsYXNzPVwic2VsZi1jZW50ZXIgcHgtMiBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZWxlbWVudC50eXBlID09ICdwYXNzd29yZCdcIiBjbGFzcz1cImZpbGwtY3VycmVudFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIChjbGljayk9J3Nob3dQYXNzd29yZCgpJz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0uMiAxMGExMSAxMSAwIDAgMSAxOS42IDBBMTEgMTEgMCAwIDEgLjIgMTB6bTkuOCA0YTQgNCAwIDEgMCAwLTggNCA0IDAgMCAwIDAgOHptMC0yYTIgMiAwIDEgMSAwLTQgMiAyIDAgMCAxIDAgNHpcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT0gJ3RleHQnXCIgY2xhc3M9XCJmaWxsLWN1cnJlbnRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiAoY2xpY2spPSdoaWRlUGFzc3dvcmQoKSc+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuODEgNC4zNmwtMS43NyAxLjc4YTQgNCAwIDAgMC00LjkgNC45bC0yLjc2IDIuNzVDMi4wNiAxMi43OS45NiAxMS40OS4yIDEwYTExIDExIDAgMCAxIDEyLjYtNS42NHptMy44IDEuODVjMS4zMyAxIDIuNDMgMi4zIDMuMiAzLjc5YTExIDExIDAgMCAxLTEyLjYyIDUuNjRsMS43Ny0xLjc4YTQgNCAwIDAgMCA0LjktNC45bDIuNzYtMi43NXptLS4yNS0zLjk5bDEuNDIgMS40MkwzLjY0IDE3Ljc4bC0xLjQyLTEuNDJMMTYuMzYgMi4yMnpcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW5uZXJSaWdodEljb24gJiYgdHlwZSAhPSAncGFzc3dvcmQnXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJzZWxmLWNlbnRlciBweC0yIHt7IGlubmVyUmlnaHRJY29uQ29sb3IgfX0gIHt7IG9uQ2xpY2tSaWdodEljb24gPyAnY3Vyc29yLXBvaW50ZXInIDogJycgfX1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25DbGlja1JpZ2h0SWNvbi5lbWl0KClcIj5cclxuICAgICAgICAgICAgPG5ndC1zdmcgY2xhc3M9XCJmaWxsLWN1cnJlbnRcIiBbc3JjXT0naW5uZXJSaWdodEljb24nPjwvbmd0LXN2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NoYXJhY3RlcnNMZW5ndGggJiYgbWF4VG90YWxDaGFyc0NvdW50ICYmICFzaGluaW5nXCI+XHJcbiAgICA8cCBjbGFzcz1cInRleHQteHMgbXQtMVwiPlxyXG4gICAgICAgIHt7IG5ndFRyYW5zbGF0ZVNlcnZpY2Uubmd0VGV4dEFyZWFSZW1haW5pbmdDaGFyYWN0ZXJzIH19OlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7IGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKSB9fTwvc3Bhbj5cclxuICAgIDwvcD5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPSdzaGluaW5nJz5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwie3sgbmd0U3R5bGUuY29tcGlsZShbJ2gnXSkgfX0gdy1mdWxsXCI+PC9uZ3Qtc2hpbmluZz5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxpbnB1dCAqbmdJZj0nY29tcG9uZW50UmVhZHknIHR5cGU9XCJoaWRkZW5cIiBbbmdNb2RlbF09XCJ2YWx1ZVwiIFtuYW1lXT1cIm5hbWVcIiBbdmFsdWVdPVwidmFsdWVcIj5cclxuXHJcbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuXHJcbjxuZ3QtdmFsaWRhdGlvbiBbY29udHJvbF09XCJmb3JtQ29udHJvbFwiIFtjb250YWluZXJdPVwiZm9ybUNvbnRhaW5lclwiIFttaW5WYWx1ZV09J21pblZhbHVlJyBbbWluTGVuZ3RoXT0nbWluTGVuZ3RoJz5cclxuPC9uZ3QtdmFsaWRhdGlvbj4iXX0=