@rangertechnologies/ngnxt 2.1.243-beta → 2.1.244

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 (103) hide show
  1. package/esm2022/environments/version.mjs +15 -0
  2. package/esm2022/lib/ar.i18n.mjs +29 -0
  3. package/esm2022/lib/components/button/nxt-button.component.mjs +165 -0
  4. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +361 -0
  5. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +271 -0
  6. package/esm2022/lib/components/custom-model/custom-model.component.mjs +51 -0
  7. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +156 -0
  8. package/esm2022/lib/components/datatable/datatable.component.mjs +1742 -0
  9. package/esm2022/lib/components/file-upload/file-upload.component.mjs +283 -0
  10. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +104 -0
  11. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +208 -0
  12. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +562 -0
  13. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +2 -0
  14. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +2 -0
  15. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +2 -0
  16. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +2 -0
  17. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +2 -0
  18. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +2 -0
  19. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +2 -0
  20. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +2 -0
  21. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +2 -0
  22. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +8 -0
  23. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +139 -0
  24. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +194 -0
  25. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +239 -0
  26. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +79 -0
  27. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +40 -0
  28. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +4 -0
  29. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +75 -0
  30. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +401 -0
  31. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +2936 -0
  32. package/esm2022/lib/components/pagination/pagination.component.mjs +101 -0
  33. package/esm2022/lib/components/pick-location/pick-location.component.mjs +227 -0
  34. package/esm2022/lib/components/search-box/search-box.component.mjs +417 -0
  35. package/esm2022/lib/country.json +43237 -0
  36. package/esm2022/lib/en.i18n.mjs +29 -0
  37. package/esm2022/lib/i18n-config.service.mjs +4 -0
  38. package/esm2022/lib/i18n.component.mjs +45 -0
  39. package/esm2022/lib/i18n.module.mjs +38 -0
  40. package/esm2022/lib/i18n.pipe.mjs +26 -0
  41. package/esm2022/lib/i18n.service.mjs +56 -0
  42. package/esm2022/lib/interfaces/actionMeta.mjs +2 -0
  43. package/esm2022/lib/interfaces/apimeta.mjs +2 -0
  44. package/esm2022/lib/interfaces/dependencyMeta.mjs +2 -0
  45. package/esm2022/lib/model/bookletWrapper.mjs +9 -0
  46. package/esm2022/lib/model/changeWrapper.mjs +11 -0
  47. package/esm2022/lib/model/errorWrapper.mjs +6 -0
  48. package/esm2022/lib/nxt-app.component.mjs +22 -0
  49. package/esm2022/lib/nxt-app.module.mjs +139 -0
  50. package/esm2022/lib/nxt-app.service.mjs +14 -0
  51. package/esm2022/lib/pages/booklet/booklet.component.mjs +673 -0
  52. package/esm2022/lib/pages/builder/element/element.component.mjs +476 -0
  53. package/esm2022/lib/pages/builder/form/form.component.mjs +45 -0
  54. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +89 -0
  55. package/esm2022/lib/pages/builder/properties/properties.component.mjs +944 -0
  56. package/esm2022/lib/pages/builder/templates/templates.component.mjs +34 -0
  57. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +680 -0
  58. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +1118 -0
  59. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +838 -0
  60. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +2237 -0
  61. package/esm2022/lib/pipe/custom-translate.pipe.mjs +27 -0
  62. package/esm2022/lib/pipe/get-value.pipe.mjs +48 -0
  63. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +39 -0
  64. package/esm2022/lib/sample.mjs +3715 -0
  65. package/esm2022/lib/services/change.service.mjs +46 -0
  66. package/esm2022/lib/services/country.service.mjs +135 -0
  67. package/esm2022/lib/services/data.service.mjs +100 -0
  68. package/esm2022/lib/services/form-builder.service.mjs +385 -0
  69. package/esm2022/lib/services/pdf-designer.service.mjs +398 -0
  70. package/esm2022/lib/services/salesforce.service.mjs +41 -0
  71. package/esm2022/lib/services/shared.service.mjs +100 -0
  72. package/esm2022/lib/services/storage.service.mjs +43 -0
  73. package/esm2022/lib/services/template.service.mjs +351 -0
  74. package/esm2022/lib/services/translation.service.mjs +61 -0
  75. package/esm2022/lib/tam.i18n.mjs +29 -0
  76. package/esm2022/lib/wrapper.mjs +175 -0
  77. package/esm2022/public-api.mjs +25 -0
  78. package/esm2022/rangertechnologies-ngnxt.mjs +5 -0
  79. package/fesm2022/rangertechnologies-ngnxt.mjs +7614 -7827
  80. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  81. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +2 -1
  82. package/lib/components/datatable/datatable.component.d.ts +34 -28
  83. package/lib/components/file-upload/file-upload.component.d.ts +4 -3
  84. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  85. package/lib/components/list-view-filter/list-view-filter.component.d.ts +3 -3
  86. package/lib/components/nxt-input/nxt-input.component.d.ts +5 -1
  87. package/lib/components/pick-location/pick-location.component.d.ts +3 -1
  88. package/lib/components/search-box/search-box.component.d.ts +2 -1
  89. package/lib/pages/builder/element/element.component.d.ts +2 -15
  90. package/lib/pages/builder/properties/common-fields.constants.d.ts +4 -16
  91. package/lib/pages/builder/properties/properties.component.d.ts +95 -129
  92. package/lib/pipe/custom-translate.pipe.d.ts +3 -3
  93. package/lib/pipe/get-value.pipe.d.ts +4 -4
  94. package/lib/pipe/search-filter/search-filter.pipe.d.ts +3 -3
  95. package/lib/services/form-builder.service.d.ts +0 -1
  96. package/package.json +6 -4
  97. package/rangertechnologies-ngnxt-2.1.244.tgz +0 -0
  98. package/lib/pipe/date/date.pipe.d.ts +0 -7
  99. package/lib/pipe/editColumnCheck/edit-column-check.pipe.d.ts +0 -7
  100. package/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.d.ts +0 -7
  101. package/lib/pipe/editColumnType/edit-column-type.pipe.d.ts +0 -7
  102. package/lib/pipe/time/time.pipe.d.ts +0 -7
  103. package/rangertechnologies-ngnxt-2.1.243-beta.tgz +0 -0
@@ -0,0 +1,15 @@
1
+ // IMPORTANT: THIS FILE IS AUTO GENERATED! DO NOT MANUALLY EDIT OR CHECKIN!
2
+ /* tslint:disable */
3
+ export const VERSION = {
4
+ "dirty": true,
5
+ "raw": "78a817f6-dirty",
6
+ "hash": "78a817f6",
7
+ "distance": null,
8
+ "tag": null,
9
+ "semver": null,
10
+ "suffix": "78a817f6-dirty",
11
+ "semverString": null,
12
+ "version": "2.1.244"
13
+ };
14
+ /* tslint:enable */
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2Vudmlyb25tZW50cy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJFQUEyRTtBQUMzRSxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHO0lBQ25CLE9BQU8sRUFBRSxJQUFJO0lBQ2IsS0FBSyxFQUFFLGdCQUFnQjtJQUN2QixNQUFNLEVBQUUsVUFBVTtJQUNsQixVQUFVLEVBQUUsSUFBSTtJQUNoQixLQUFLLEVBQUUsSUFBSTtJQUNYLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixjQUFjLEVBQUUsSUFBSTtJQUNwQixTQUFTLEVBQUUsU0FBUztDQUN2QixDQUFDO0FBQ0YsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSU1QT1JUQU5UOiBUSElTIEZJTEUgSVMgQVVUTyBHRU5FUkFURUQhIERPIE5PVCBNQU5VQUxMWSBFRElUIE9SIENIRUNLSU4hXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSB7XG4gICAgXCJkaXJ0eVwiOiB0cnVlLFxuICAgIFwicmF3XCI6IFwiNzhhODE3ZjYtZGlydHlcIixcbiAgICBcImhhc2hcIjogXCI3OGE4MTdmNlwiLFxuICAgIFwiZGlzdGFuY2VcIjogbnVsbCxcbiAgICBcInRhZ1wiOiBudWxsLFxuICAgIFwic2VtdmVyXCI6IG51bGwsXG4gICAgXCJzdWZmaXhcIjogXCI3OGE4MTdmNi1kaXJ0eVwiLFxuICAgIFwic2VtdmVyU3RyaW5nXCI6IG51bGwsXG4gICAgXCJ2ZXJzaW9uXCI6IFwiMi4xLjI0NFwiXG59O1xuLyogdHNsaW50OmVuYWJsZSAqL1xuIl19
@@ -0,0 +1,29 @@
1
+ const arI18n = {
2
+ required: "مطلوب",
3
+ addMore: "أضف المزيد",
4
+ select: "يختار",
5
+ attachment: "مرفق",
6
+ chooseFiles: "اختر الملفات",
7
+ uploadFile: "رفع ملف",
8
+ thisFieldIsRequired: "هذه الخانة مطلوبه.",
9
+ pickYourLocation: "اختر موقعك",
10
+ // firstName: "الاسم الأول",
11
+ // lastName: "اسم العائلة",
12
+ // division: "قسم",
13
+ // numberPlate: "لوحة الأرقام",
14
+ calibrated: "معايرة",
15
+ enterValue: "أدخل القيمة",
16
+ details: "تفاصيل", // HA 20FEB24 PTW details to Details
17
+ pleaseMakeChoice: "يرجى الاختيار",
18
+ attach: "يربط",
19
+ add: "يضيف",
20
+ zeroOfZero: "0 من 0",
21
+ selectDate: "حدد تاريخ",
22
+ toBuyTicket: "لشراء تذكرة",
23
+ pickLocation: "اختر الموقع",
24
+ enterLocation: "إدخال الدولة",
25
+ searchNearestLocation: "البحث عن أقرب موقع",
26
+ currentTheme: "rtl",
27
+ };
28
+ export default arI18n;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXIuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9hci5pMThuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sTUFBTSxHQUFHO0lBQ1gsUUFBUSxFQUFFLE9BQU87SUFDakIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLE9BQU87SUFDZixVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsY0FBYztJQUMzQixVQUFVLEVBQUUsU0FBUztJQUNyQixtQkFBbUIsRUFBRSxvQkFBb0I7SUFDekMsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5Qiw0QkFBNEI7SUFDNUIsMkJBQTJCO0lBQzNCLG1CQUFtQjtJQUNuQiwrQkFBK0I7SUFDL0IsVUFBVSxFQUFFLFFBQVE7SUFDcEIsVUFBVSxFQUFFLGFBQWE7SUFDekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxvQ0FBb0M7SUFDdkQsZ0JBQWdCLEVBQUUsZUFBZTtJQUNqQyxNQUFNLEVBQUUsTUFBTTtJQUNkLEdBQUcsRUFBRSxNQUFNO0lBQ1gsVUFBVSxFQUFFLFFBQVE7SUFDcEIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsWUFBWSxFQUFFLGFBQWE7SUFDM0IsYUFBYSxFQUFFLGNBQWM7SUFDN0IscUJBQXFCLEVBQUUsb0JBQW9CO0lBQzNDLFlBQVksRUFBRSxLQUFLO0NBQ3RCLENBQUE7QUFFRCxlQUFlLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGFySTE4biA9IHtcbiAgICByZXF1aXJlZDogXCLZhdi32YTZiNioXCIsXG4gICAgYWRkTW9yZTogXCLYo9i22YEg2KfZhNmF2LLZitivXCIsXG4gICAgc2VsZWN0OiBcItmK2K7Yqtin2LFcIixcbiAgICBhdHRhY2htZW50OiBcItmF2LHZgdmCXCIsXG4gICAgY2hvb3NlRmlsZXM6IFwi2KfYrtiq2LEg2KfZhNmF2YTZgdin2KpcIixcbiAgICB1cGxvYWRGaWxlOiBcItix2YHYuSDZhdmE2YFcIixcbiAgICB0aGlzRmllbGRJc1JlcXVpcmVkOiBcItmH2LDZhyDYp9mE2K7Yp9mG2Kkg2YXYt9mE2YjYqNmHLlwiLFxuICAgIHBpY2tZb3VyTG9jYXRpb246IFwi2KfYrtiq2LEg2YXZiNmC2LnZg1wiLFxuICAgIC8vIGZpcnN0TmFtZTogXCLYp9mE2KfYs9mFINin2YTYo9mI2YRcIixcbiAgICAvLyBsYXN0TmFtZTogXCLYp9iz2YUg2KfZhNi52KfYptmE2KlcIixcbiAgICAvLyBkaXZpc2lvbjogXCLZgtiz2YVcIixcbiAgICAvLyBudW1iZXJQbGF0ZTogXCLZhNmI2K3YqSDYp9mE2KPYsdmC2KfZhVwiLFxuICAgIGNhbGlicmF0ZWQ6IFwi2YXYudin2YrYsdipXCIsXG4gICAgZW50ZXJWYWx1ZTogXCLYo9iv2K7ZhCDYp9mE2YLZitmF2KlcIixcbiAgICBkZXRhaWxzOiBcItiq2YHYp9i12YrZhFwiLCAvLyBIQSAyMEZFQjI0IFBUVyBkZXRhaWxzIHRvIERldGFpbHNcbiAgICBwbGVhc2VNYWtlQ2hvaWNlOiBcItmK2LHYrNmJINin2YTYp9iu2KrZitin2LFcIixcbiAgICBhdHRhY2g6IFwi2YrYsdio2LdcIixcbiAgICBhZGQ6IFwi2YrYttmK2YFcIixcbiAgICB6ZXJvT2ZaZXJvOiBcIjAg2YXZhiAwXCIsXG4gICAgc2VsZWN0RGF0ZTogXCLYrdiv2K8g2KrYp9ix2YrYrlwiLFxuICAgIHRvQnV5VGlja2V0OiBcItmE2LTYsdin2KEg2KrYsNmD2LHYqVwiLFxuICAgIHBpY2tMb2NhdGlvbjogXCLYp9iu2KrYsSDYp9mE2YXZiNmC2LlcIixcbiAgICBlbnRlckxvY2F0aW9uOiBcItil2K/Yrtin2YQg2KfZhNiv2YjZhNipXCIsXG4gICAgc2VhcmNoTmVhcmVzdExvY2F0aW9uOiBcItin2YTYqNit2Ksg2LnZhiDYo9mC2LHYqCDZhdmI2YLYuVwiLFxuICAgIGN1cnJlbnRUaGVtZTogXCJydGxcIixcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJJMThuOyJdfQ==
@@ -0,0 +1,165 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
3
+ import { NxtCustomTranslatePipe } from '../../pipe/custom-translate.pipe';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/translation.service";
6
+ import * as i2 from "@angular/common";
7
+ export class NxtButtonComponent {
8
+ cdRef;
9
+ translationService;
10
+ elementRef;
11
+ buttonValue = ''; //SKS24JAN25 button text
12
+ buttonType = 'primary'; //SKS24JAN25 If the button type is 'text-only', it should display only the text without a border or outline. For 'grey-text', the button should have a border and a background color, but the text color should be gray, similar to 'blue-text'
13
+ type = 'button'; //SKS24JAN25 The button types are "button," "group," and "dropdown."
14
+ buttonDisable = false; //SKS24JAN25 use this input to disable a button when needed.
15
+ btnBgColor = ''; // Use this input to set a custom background color for the button.
16
+ btnBorder = ''; // Use this input to set a custom border style for the button.
17
+ btnTextColor = ''; // Use this input to set a custom text color for the button.
18
+ btnHeight = ''; // Use this input to set a custom height for the button.
19
+ btnWidth = ''; // Use this input to set a custom width for the button.
20
+ btnIconLeftSrc = ''; // Use this input to set the source of the left-side icon for the button.
21
+ btnIconRightSrc = ''; // Use this input to set the source of the right-side icon for the button.
22
+ btnHoverBgColor = ''; // Use this input to set the background color of the button on hover.
23
+ btnHoverTextColor = ''; // Use this input to set the text color of the button on hover.
24
+ btnId = 'default'; // Use this input to set a custom ID for the button. Default is 'default'.
25
+ dataDismiss = ''; // Use this input to specify the dismiss action for the button (e.g., 'modal' to close a modal).
26
+ buttonBorder = '0px'; // Use this input to set the border size of the button. Default is '0px' for no border.
27
+ modalToTrigger = ''; // Use this input to specify the ID or target of the modal to be triggered.
28
+ isImageSvg = false; // Use this input to determine if the image is an SVG. Default is false (non-SVG).
29
+ tabIndex = ''; // Use this input to set the tab index for the element, controlling the focus order.
30
+ buttonConfig = ''; // Use this input to pass configuration settings for the group and dropdown buttons (e.g., styles, actions).
31
+ mode = 'edit'; // New mode input
32
+ languageCode;
33
+ buttonClickEmit = new EventEmitter();
34
+ iconSrc = ''; // Ensure it's always a string
35
+ isDropdownOpen = false;
36
+ // SKS24JAN25 dropdown button config
37
+ // dropdownButton = {
38
+ // btnBgColor: '#007bff',
39
+ // btnBorder: '1px solid #0056b3',
40
+ // btnTextColor: '#ffffff',
41
+ // btnHeight: '40px',
42
+ // btnWidth: '150px',
43
+ // btnHoverBgColor: '#0056b3',
44
+ // btnHoverTextColor: '#ffffff',
45
+ // label: 'Dropdown',
46
+ // iconSrc: '',
47
+ // items: [
48
+ // { label: 'Action 1',iconSrc: '', hover: false },
49
+ // { label: 'Action 2',iconSrc: '', hover: false },
50
+ // { label: 'Action 3',iconSrc: '', hover: false }
51
+ // ]
52
+ // };
53
+ constructor(cdRef, translationService, elementRef) {
54
+ this.cdRef = cdRef;
55
+ this.translationService = translationService;
56
+ this.elementRef = elementRef;
57
+ }
58
+ ngOnInit() {
59
+ // SKS14JUL25 Initialize language settings on component load
60
+ // SKS14JUL25 Get the saved language from localStorage (if any)
61
+ let lang = this.languageCode || this.translationService.getLanguage() || localStorage.getItem('language') || 'en';
62
+ // SKS14JUL25 If languageCode is already set (e.g., from input or config), apply it
63
+ if (lang) {
64
+ this.translationService.setLanguage(this.languageCode);
65
+ this.languageCode = lang;
66
+ }
67
+ // SKS14JUL25 Subscribe to translation load event to trigger change detection,
68
+ //SKS14JUL25 ensuring that translations using pipes get updated properly
69
+ this.translationService.translationsLoaded$.subscribe(() => {
70
+ this.cdRef.detectChanges(); //SKS14JUL25 Force pipe re-evaluation after language change
71
+ });
72
+ }
73
+ ngOnChanges(changes) {
74
+ // SKS14JUL25 Check if there's a change in the input property 'languageCode'
75
+ if (changes['languageCode']) {
76
+ // SKS14JUL25 If new languageCode is set, update the translation service
77
+ if (this.languageCode) {
78
+ this.translationService.setLanguage(this.languageCode);
79
+ }
80
+ }
81
+ }
82
+ //SKS24JAN25 Function to get styles for dropdown and group buttons based on the provided configuration.
83
+ getButtonStyles(config) {
84
+ return {
85
+ 'button-custom-bg': config.btnBgColor || '',
86
+ 'button-custom-border': config.btnBorder || '',
87
+ 'button-custom-color': config.btnTextColor || '',
88
+ 'button-custom-height': config.btnHeight || '',
89
+ 'button-custom-width': config.btnWidth || '',
90
+ 'button-hover-bg': config.btnHoverBgColor || '',
91
+ 'button-hover-text-color': config.btnHoverTextColor || ''
92
+ };
93
+ }
94
+ buttonClicked($event) {
95
+ this.buttonClickEmit.emit($event);
96
+ if (this.isDropdownOpen) {
97
+ this.isDropdownOpen = false;
98
+ }
99
+ }
100
+ toggleDropdown() {
101
+ this.isDropdownOpen = !this.isDropdownOpen;
102
+ }
103
+ //SKS24JAN25 Listener for clicks outside the dropdown button to close or manage its state.
104
+ onClickOutside(event) {
105
+ if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) {
106
+ this.isDropdownOpen = false;
107
+ }
108
+ }
109
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtButtonComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TranslationService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NxtButtonComponent, isStandalone: true, selector: "nxt-button", inputs: { buttonValue: "buttonValue", buttonType: "buttonType", type: "type", buttonDisable: "buttonDisable", btnBgColor: "btnBgColor", btnBorder: "btnBorder", btnTextColor: "btnTextColor", btnHeight: "btnHeight", btnWidth: "btnWidth", btnIconLeftSrc: "btnIconLeftSrc", btnIconRightSrc: "btnIconRightSrc", btnHoverBgColor: "btnHoverBgColor", btnHoverTextColor: "btnHoverTextColor", btnId: "btnId", dataDismiss: "dataDismiss", buttonBorder: "buttonBorder", modalToTrigger: "modalToTrigger", isImageSvg: "isImageSvg", tabIndex: "tabIndex", buttonConfig: "buttonConfig", mode: "mode", languageCode: "languageCode" }, outputs: { buttonClickEmit: "buttonClickEmit" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, usesOnChanges: true, ngImport: i0, template: "<!-- SKS24JAN25 group button -->\n<div *ngIf=\"type === 'group'\" class=\"btn-group\" role=\"group\" aria-label=\"Button Group\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.btnId !== 'default' ? btn.btnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <span class=\"custom-tooltip\" \n style=\"background-color:{{btn.tooltipBcColor}};\n color:{{btn.tooltipColor}};\n font-size:{{btn.tooltipFSize}}\">\n {{ btn.tooltipPath || btn.tooltip | nxtCustomTranslate : btn.tooltip }}\n <div class=\"tooltip-pointer\" style=\"background-color:{{btn.tooltipBcColor}};\"></div>\n </span>\n </button>\n</div>\n \n<!-- SKS24JAN25 single button -->\n<button type=\"button\" *ngIf=\"type !== 'group' && type !== 'dropdown'\" class=\"btn btn-primary fc-button {{buttonType}}\" [tabindex]=\"tabIndex\"\n [attr.data-bs-toggle]=\"modalToTrigger != '' ? 'modal' : ''\"\n [attr.data-bs-target]=\"modalToTrigger != '' ? '#'+modalToTrigger : ''\"\n style=\"button-custom-bg: {{btnBgColor}};button-custom-border: {{btnBorder}};button-custom-color: {{btnTextColor}};button-custom-height: {{btnHeight}};button-custom-width: {{btnWidth}};button-hover-bg: {{btnHoverBgColor}};button-hover-text-color: {{btnHoverTextColor}};\"\n [disabled]=\"buttonDisable\" [attr.data-bs-dismiss]='dataDismiss' (click)=\"buttonClicked($event)\"\n [attr.id]=\"btnId != 'default' ? btnId : null\">\n <img *ngIf=\"btnIconLeftSrc != '' && isImageSvg\" src=\"{{btnIconLeftSrc}}\"\n class=\"fc-btn-icon left-icon\">\n <img *ngIf=\"btnIconLeftSrc != '' && !isImageSvg\" src=\"{{btnIconLeftSrc}}\" class=\"fc-btn-icon left-icon\">\n <span class=\"fc-btn-text\">{{buttonValue}}</span>\n <img *ngIf=\"btnIconRightSrc != '' && isImageSvg\" src=\"{{btnIconRightSrc}}\"\n class=\"fc-btn-icon right-icon\">\n <img *ngIf=\"btnIconRightSrc != '' && !isImageSvg\" src=\"{{btnIconRightSrc}}\" class=\"fc-btn-icon right-icon\">\n</button>\n\n<!-- SKS24JAN25 dropdown button -->\n<div *ngIf=\"type === 'dropdown'\" class=\"dropdown\">\n <svg class=\"clickable-img\" (click)=\"toggleDropdown()\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.3\" y=\"0.3\" width=\"39.4\" height=\"39.4\" rx=\"11.7\" fill=\"#FAFBFD\" stroke=\"#D5D5D5\" stroke-width=\"0.6\"/>\n <path d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\" fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> \n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.btnId !== 'default' ? btn.btnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <span class=\"fc-btn-text\" style=\"padding-left: 12px;\">{{btn.name}}</span>\n </button>\n </div>\n</div>\n", styles: [".fc-button,.fc-button:hover,.fc-button:active,.fc-button:focus{outline:none;border:none;box-shadow:none}.fc-button{padding:6.5px}.fc-button:active{transform:scale(1.02)}.text-only{background:transparent;color:var(--fc-primary-color);border:none;outline:none}.grey-text{color:var(--fc-text-color)}.blue-text{color:var(--fc-primary-color)}.grey-border{color:#272525;background:transparent;border:2px solid #dddddd}.grey-border:hover{color:#272525;background:#6a2aff0a;border:2px solid #6a2aff59}.grey-border:active,.grey-border:focus{background-color:#386bf6;border:2px solid #3268ff;color:#fff}.blue-border,.blue-border:hover,.blue-border:active,.blue-border:focus{border:1px solid var(--fc-primary-color)}.bg-transparent{background-color:transparent}.custom-btn{background-color:var(button-custom-bg);border-color:var(button-custom-border);color:var(button-custom-color);height:var(button-custom-height);width:var(button-custom-width)}.custom-btn:hover,.custom-btn:active,.custom-btn:focus{border-color:var(button-custom-border);background-color:var(button-hover-bg);color:var(button-hover-text-color)}.fc-btn-text{display:inline-flex;vertical-align:middle;font-size:14px;font-weight:400;padding-left:5px;padding-right:5px}.right-icon{margin-left:5px}.left-icon{margin-right:5px}.fc-button.side-save-component,.fc-button.side-cancel-component{border:1px solid transparent}.fc-button.side-save-component:focus,.fc-button.side-cancel-component:focus{box-shadow:0 0 0 .25rem #0d6efd40;border:1px solid #86b7fe}.btn-group{background-color:#fdfeff;border:1px solid #dddddd;border-radius:7px}.btn-icon{background-color:#fdfeff;border:1px solid #dddddd}.custom-tooltip{visibility:visible;position:absolute;background-color:#0773ff;color:#fff;text-align:center;padding:5px 10px;border-radius:4px;font-size:12px;white-space:nowrap;bottom:100%;left:50%;transform:translate(-50%);opacity:0;transition:opacity .2s;z-index:10;margin-bottom:10px}.tooltip-pointer{position:absolute;width:0;height:0;bottom:-5px;left:50%;transform:translate(-50%);border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #0773ff}.tooltip-container:hover .custom-tooltip{visibility:visible;opacity:1}.clickable-img{position:relative;cursor:pointer;height:41px;transition:transform .3s ease,box-shadow .3s ease;border:2px solid #dddddd;border-radius:13px}.clickable-img:hover{transform:scale(.95);border:2px solid rgb(31,105,255);border-radius:14px}.dropdown{position:relative;display:inline-block}.dropdown-menu{right:0;top:45px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 4px 8px #0000001a;left:unset}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}.dropdown-menu .btn:hover{background-color:#f1f1f1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtButtonComponent, decorators: [{
113
+ type: Component,
114
+ args: [{ selector: 'nxt-button', standalone: true, imports: [CommonModule, NxtCustomTranslatePipe], template: "<!-- SKS24JAN25 group button -->\n<div *ngIf=\"type === 'group'\" class=\"btn-group\" role=\"group\" aria-label=\"Button Group\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.btnId !== 'default' ? btn.btnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <span class=\"custom-tooltip\" \n style=\"background-color:{{btn.tooltipBcColor}};\n color:{{btn.tooltipColor}};\n font-size:{{btn.tooltipFSize}}\">\n {{ btn.tooltipPath || btn.tooltip | nxtCustomTranslate : btn.tooltip }}\n <div class=\"tooltip-pointer\" style=\"background-color:{{btn.tooltipBcColor}};\"></div>\n </span>\n </button>\n</div>\n \n<!-- SKS24JAN25 single button -->\n<button type=\"button\" *ngIf=\"type !== 'group' && type !== 'dropdown'\" class=\"btn btn-primary fc-button {{buttonType}}\" [tabindex]=\"tabIndex\"\n [attr.data-bs-toggle]=\"modalToTrigger != '' ? 'modal' : ''\"\n [attr.data-bs-target]=\"modalToTrigger != '' ? '#'+modalToTrigger : ''\"\n style=\"button-custom-bg: {{btnBgColor}};button-custom-border: {{btnBorder}};button-custom-color: {{btnTextColor}};button-custom-height: {{btnHeight}};button-custom-width: {{btnWidth}};button-hover-bg: {{btnHoverBgColor}};button-hover-text-color: {{btnHoverTextColor}};\"\n [disabled]=\"buttonDisable\" [attr.data-bs-dismiss]='dataDismiss' (click)=\"buttonClicked($event)\"\n [attr.id]=\"btnId != 'default' ? btnId : null\">\n <img *ngIf=\"btnIconLeftSrc != '' && isImageSvg\" src=\"{{btnIconLeftSrc}}\"\n class=\"fc-btn-icon left-icon\">\n <img *ngIf=\"btnIconLeftSrc != '' && !isImageSvg\" src=\"{{btnIconLeftSrc}}\" class=\"fc-btn-icon left-icon\">\n <span class=\"fc-btn-text\">{{buttonValue}}</span>\n <img *ngIf=\"btnIconRightSrc != '' && isImageSvg\" src=\"{{btnIconRightSrc}}\"\n class=\"fc-btn-icon right-icon\">\n <img *ngIf=\"btnIconRightSrc != '' && !isImageSvg\" src=\"{{btnIconRightSrc}}\" class=\"fc-btn-icon right-icon\">\n</button>\n\n<!-- SKS24JAN25 dropdown button -->\n<div *ngIf=\"type === 'dropdown'\" class=\"dropdown\">\n <svg class=\"clickable-img\" (click)=\"toggleDropdown()\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.3\" y=\"0.3\" width=\"39.4\" height=\"39.4\" rx=\"11.7\" fill=\"#FAFBFD\" stroke=\"#D5D5D5\" stroke-width=\"0.6\"/>\n <path d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\" fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg> \n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <button *ngFor=\"let btn of buttonConfig.buttons\"\n type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [attr.tabindex]=\"btn.tabIndex\"\n [attr.data-bs-toggle]=\"btn.modalToTrigger ? 'modal' : null\"\n [attr.data-bs-target]=\"btn.modalToTrigger ? '#' + btn.modalToTrigger : null\"\n [ngStyle]=\"getButtonStyles(btn)\"\n [disabled]=\"btn.buttonDisable\"\n [attr.data-bs-dismiss]=\"btn.dataDismiss\"\n (click)=\"buttonClicked(btn)\"\n [attr.id]=\"btn.btnId !== 'default' ? btn.btnId : null\">\n <img *ngIf=\"btn.isImageSvg\" [src]=\"btn.iconSrc\">\n <span class=\"fc-btn-text\" style=\"padding-left: 12px;\">{{btn.name}}</span>\n </button>\n </div>\n</div>\n", styles: [".fc-button,.fc-button:hover,.fc-button:active,.fc-button:focus{outline:none;border:none;box-shadow:none}.fc-button{padding:6.5px}.fc-button:active{transform:scale(1.02)}.text-only{background:transparent;color:var(--fc-primary-color);border:none;outline:none}.grey-text{color:var(--fc-text-color)}.blue-text{color:var(--fc-primary-color)}.grey-border{color:#272525;background:transparent;border:2px solid #dddddd}.grey-border:hover{color:#272525;background:#6a2aff0a;border:2px solid #6a2aff59}.grey-border:active,.grey-border:focus{background-color:#386bf6;border:2px solid #3268ff;color:#fff}.blue-border,.blue-border:hover,.blue-border:active,.blue-border:focus{border:1px solid var(--fc-primary-color)}.bg-transparent{background-color:transparent}.custom-btn{background-color:var(button-custom-bg);border-color:var(button-custom-border);color:var(button-custom-color);height:var(button-custom-height);width:var(button-custom-width)}.custom-btn:hover,.custom-btn:active,.custom-btn:focus{border-color:var(button-custom-border);background-color:var(button-hover-bg);color:var(button-hover-text-color)}.fc-btn-text{display:inline-flex;vertical-align:middle;font-size:14px;font-weight:400;padding-left:5px;padding-right:5px}.right-icon{margin-left:5px}.left-icon{margin-right:5px}.fc-button.side-save-component,.fc-button.side-cancel-component{border:1px solid transparent}.fc-button.side-save-component:focus,.fc-button.side-cancel-component:focus{box-shadow:0 0 0 .25rem #0d6efd40;border:1px solid #86b7fe}.btn-group{background-color:#fdfeff;border:1px solid #dddddd;border-radius:7px}.btn-icon{background-color:#fdfeff;border:1px solid #dddddd}.custom-tooltip{visibility:visible;position:absolute;background-color:#0773ff;color:#fff;text-align:center;padding:5px 10px;border-radius:4px;font-size:12px;white-space:nowrap;bottom:100%;left:50%;transform:translate(-50%);opacity:0;transition:opacity .2s;z-index:10;margin-bottom:10px}.tooltip-pointer{position:absolute;width:0;height:0;bottom:-5px;left:50%;transform:translate(-50%);border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #0773ff}.tooltip-container:hover .custom-tooltip{visibility:visible;opacity:1}.clickable-img{position:relative;cursor:pointer;height:41px;transition:transform .3s ease,box-shadow .3s ease;border:2px solid #dddddd;border-radius:13px}.clickable-img:hover{transform:scale(.95);border:2px solid rgb(31,105,255);border-radius:14px}.dropdown{position:relative;display:inline-block}.dropdown-menu{right:0;top:45px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 4px 8px #0000001a;left:unset}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}.dropdown-menu .btn:hover{background-color:#f1f1f1}\n"] }]
115
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.TranslationService }, { type: i0.ElementRef }], propDecorators: { buttonValue: [{
116
+ type: Input
117
+ }], buttonType: [{
118
+ type: Input
119
+ }], type: [{
120
+ type: Input
121
+ }], buttonDisable: [{
122
+ type: Input
123
+ }], btnBgColor: [{
124
+ type: Input
125
+ }], btnBorder: [{
126
+ type: Input
127
+ }], btnTextColor: [{
128
+ type: Input
129
+ }], btnHeight: [{
130
+ type: Input
131
+ }], btnWidth: [{
132
+ type: Input
133
+ }], btnIconLeftSrc: [{
134
+ type: Input
135
+ }], btnIconRightSrc: [{
136
+ type: Input
137
+ }], btnHoverBgColor: [{
138
+ type: Input
139
+ }], btnHoverTextColor: [{
140
+ type: Input
141
+ }], btnId: [{
142
+ type: Input
143
+ }], dataDismiss: [{
144
+ type: Input
145
+ }], buttonBorder: [{
146
+ type: Input
147
+ }], modalToTrigger: [{
148
+ type: Input
149
+ }], isImageSvg: [{
150
+ type: Input
151
+ }], tabIndex: [{
152
+ type: Input
153
+ }], buttonConfig: [{
154
+ type: Input
155
+ }], mode: [{
156
+ type: Input
157
+ }], languageCode: [{
158
+ type: Input
159
+ }], buttonClickEmit: [{
160
+ type: Output
161
+ }], onClickOutside: [{
162
+ type: HostListener,
163
+ args: ['document:click', ['$event']]
164
+ }] } });
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnh0LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vbnh0LWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vbnh0LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMzSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7OztBQVMxRSxNQUFNLE9BQU8sa0JBQWtCO0lBaURUO0lBQWtDO0lBQWdEO0lBL0M3RixXQUFXLEdBQVcsRUFBRSxDQUFDLENBQUMseUJBQXlCO0lBQ25ELFVBQVUsR0FBVyxTQUFTLENBQUMsQ0FBQywrT0FBK087SUFDL1EsSUFBSSxHQUFXLFFBQVEsQ0FBQyxDQUFDLG9FQUFvRTtJQUM3RixhQUFhLEdBQVksS0FBSyxDQUFDLENBQUMsNERBQTREO0lBQzVGLFVBQVUsR0FBVyxFQUFFLENBQUMsQ0FBQyxrRUFBa0U7SUFDM0YsU0FBUyxHQUFXLEVBQUUsQ0FBQyxDQUFDLDhEQUE4RDtJQUN0RixZQUFZLEdBQVcsRUFBRSxDQUFDLENBQUMsNERBQTREO0lBQ3ZGLFNBQVMsR0FBVyxFQUFFLENBQUMsQ0FBQyx3REFBd0Q7SUFDaEYsUUFBUSxHQUFXLEVBQUUsQ0FBQyxDQUFDLHVEQUF1RDtJQUM5RSxjQUFjLEdBQVcsRUFBRSxDQUFDLENBQUMseUVBQXlFO0lBQ3RHLGVBQWUsR0FBVyxFQUFFLENBQUMsQ0FBQyww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QUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQTZFUCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE54dEN1c3RvbVRyYW5zbGF0ZVBpcGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbnh0LWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL254dC1idXR0b24uY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE54dEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gXG4gIEBJbnB1dCgpIGJ1dHRvblZhbHVlOiBzdHJpbmcgPSAnJzsgLy9TS1MyNEpBTjI1IGJ1dHRvbiB0ZXh0IFxuICBASW5wdXQoKSBidXR0b25UeXBlOiBzdHJpbmcgPSAncHJpbWFyeSc7IC8vU0tTMjRKQU4yNSBJZiB0aGUgYnV0dG9uIHR5cGUgaXMgJ3RleHQtb25seScsIGl0IHNob3VsZCBkaXNwbGF5IG9ubHkgdGhlIHRleHQgd2l0aG91dCBhIGJvcmRlciBvciBvdXRsaW5lLiBGb3IgJ2dyZXktdGV4dCcsIHRoZSBidXR0b24gc2hvdWxkIGhhdmUgYSBib3JkZXIgYW5kIGEgYmFja2dyb3VuZCBjb2xvciwgYnV0IHRoZSB0ZXh0IGNvbG9yIHNob3VsZCBiZSBncmF5LCBzaW1pbGFyIHRvICdibHVlLXRleHQnXG4gIEBJbnB1dCgpIHR5cGU6IHN0cmluZyA9ICdidXR0b24nOyAvL1NLUzI0SkFOMjUgVGhlIGJ1dHRvbiB0eXBlcyBhcmUgXCJidXR0b24sXCIgXCJncm91cCxcIiBhbmQgXCJkcm9wZG93bi5cIlxuICBASW5wdXQoKSBidXR0b25EaXNhYmxlOiBib29sZWFuID0gZmFsc2U7IC8vU0tTMjRKQU4yNSB1c2UgdGhpcyBpbnB1dCB0byBkaXNhYmxlIGEgYnV0dG9uIHdoZW4gbmVlZGVkLlxuICBASW5wdXQoKSBidG5CZ0NvbG9yOiBzdHJpbmcgPSAnJzsgLy8gVXNlIHRoaXMgaW5wdXQgdG8gc2V0IGEgY3VzdG9tIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBidXR0b24uXG4gIEBJbnB1dCgpIGJ0bkJvcmRlcjogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNldCBhIGN1c3RvbSBib3JkZXIgc3R5bGUgZm9yIHRoZSBidXR0b24uXG4gIEBJbnB1dCgpIGJ0blRleHRDb2xvcjogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNldCBhIGN1c3RvbSB0ZXh0IGNvbG9yIGZvciB0aGUgYnV0dG9uLlxuICBASW5wdXQoKSBidG5IZWlnaHQ6IHN0cmluZyA9ICcnOyAvLyBVc2UgdGhpcyBpbnB1dCB0byBzZXQgYSBjdXN0b20gaGVpZ2h0IGZvciB0aGUgYnV0dG9uLlxuICBASW5wdXQoKSBidG5XaWR0aDogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNldCBhIGN1c3RvbSB3aWR0aCBmb3IgdGhlIGJ1dHRvbi5cbiAgQElucHV0KCkgYnRuSWNvbkxlZnRTcmM6IHN0cmluZyA9ICcnOyAvLyBVc2UgdGhpcyBpbnB1dCB0byBzZXQgdGhlIHNvdXJjZSBvZiB0aGUgbGVmdC1zaWRlIGljb24gZm9yIHRoZSBidXR0b24uXG4gIEBJbnB1dCgpIGJ0bkljb25SaWdodFNyYzogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNldCB0aGUgc291cmNlIG9mIHRoZSByaWdodC1zaWRlIGljb24gZm9yIHRoZSBidXR0b24uXG4gIEBJbnB1dCgpIGJ0bkhvdmVyQmdDb2xvcjogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgYnV0dG9uIG9uIGhvdmVyLlxuICBASW5wdXQoKSBidG5Ib3ZlclRleHRDb2xvcjogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNldCB0aGUgdGV4dCBjb2xvciBvZiB0aGUgYnV0dG9uIG9uIGhvdmVyLlxuICBASW5wdXQoKSBidG5JZDogc3RyaW5nID0gJ2RlZmF1bHQnOyAvLyBVc2UgdGhpcyBpbnB1dCB0byBzZXQgYSBjdXN0b20gSUQgZm9yIHRoZSBidXR0b24uIERlZmF1bHQgaXMgJ2RlZmF1bHQnLlxuICBASW5wdXQoKSBkYXRhRGlzbWlzczogc3RyaW5nID0gJyc7IC8vIFVzZSB0aGlzIGlucHV0IHRvIHNwZWNpZnkgdGhlIGRpc21pc3MgYWN0aW9uIGZvciB0aGUgYnV0dG9uIChlLmcuLCAnbW9kYWwnIHRvIGNsb3NlIGEgbW9kYWwpLlxuICBASW5wdXQoKSBidXR0b25Cb3JkZXI6IHN0cmluZyA9ICcwcHgnOyAvLyBVc2UgdGhpcyBpbnB1dCB0byBzZXQgdGhlIGJvcmRlciBzaXplIG9mIHRoZSBidXR0b24uIERlZmF1bHQgaXMgJzBweCcgZm9yIG5vIGJvcmRlci5cbiAgQElucHV0KCkgbW9kYWxUb1RyaWdnZXI6IHN0cmluZyA9ICcnOyAvLyBVc2UgdGhpcyBpbnB1dCB0byBzcGVjaWZ5IHRoZSBJRCBvciB0YXJnZXQgb2YgdGhlIG1vZGFsIHRvIGJlIHRyaWdnZXJlZC5cbiAgQElucHV0KCkgaXNJbWFnZVN2ZzogYm9vbGVhbiA9IGZhbHNlOyAvLyBVc2UgdGhpcyBpbnB1dCB0byBkZXRlcm1pbmUgaWYgdGhlIGltYWdlIGlzIGFuIFNWRy4gRGVmYXVsdCBpcyBmYWxzZSAobm9uLVNWRykuXG4gIEBJbnB1dCgpIHRhYkluZGV4OiBhbnkgPSAnJzsvLyBVc2UgdGhpcyBpbnB1dCB0byBzZXQgdGhlIHRhYiBpbmRleCBmb3IgdGhlIGVsZW1lbnQsIGNvbnRyb2xsaW5nIHRoZSBmb2N1cyBvcmRlci5cbiAgQElucHV0KCkgYnV0dG9uQ29uZmlnOiBhbnkgPSAnJzsgLy8gVXNlIHRoaXMgaW5wdXQgdG8gcGFzcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZ3JvdXAgYW5kIGRyb3Bkb3duIGJ1dHRvbnMgKGUuZy4sIHN0eWxlcywgYWN0aW9ucykuXG4gIEBJbnB1dCgpIG1vZGU6ICd2aWV3JyB8ICdlZGl0JyB8ICdwcmludCcgPSAnZWRpdCc7IC8vIE5ldyBtb2RlIGlucHV0XG4gIEBJbnB1dCgpIGxhbmd1YWdlQ29kZTogYW55IDtcbiAgXG4gIEBPdXRwdXQoKSBidXR0b25DbGlja0VtaXQ6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgaWNvblNyYzogYW55ID0gJyc7IC8vIEVuc3VyZSBpdCdzIGFsd2F5cyBhIHN0cmluZ1xuICBpc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gIFxuXG4gIC8vIFNLUzI0SkFOMjUgZHJvcGRvd24gYnV0dG9uIGNvbmZpZ1xuXG4gIC8vIGRyb3Bkb3duQnV0dG9uID0ge1xuICAvLyAgIGJ0bkJnQ29sb3I6ICcjMDA3YmZmJyxcbiAgLy8gICBidG5Cb3JkZXI6ICcxcHggc29saWQgIzAwNTZiMycsXG4gIC8vICAgYnRuVGV4dENvbG9yOiAnI2ZmZmZmZicsXG4gIC8vICAgYnRuSGVpZ2h0OiAnNDBweCcsXG4gIC8vICAgYnRuV2lkdGg6ICcxNTBweCcsXG4gIC8vICAgYnRuSG92ZXJCZ0NvbG9yOiAnIzAwNTZiMycsXG4gIC8vICAgYnRuSG92ZXJUZXh0Q29sb3I6ICcjZmZmZmZmJyxcbiAgLy8gICBsYWJlbDogJ0Ryb3Bkb3duJyxcbiAgLy8gICBpY29uU3JjOiAnJyxcbiAgLy8gICBpdGVtczogW1xuICAvLyAgICAgeyBsYWJlbDogJ0FjdGlvbiAxJyxpY29uU3JjOiAnJywgaG92ZXI6IGZhbHNlIH0sXG4gIC8vICAgICB7IGxhYmVsOiAnQWN0aW9uIDInLGljb25TcmM6ICcnLCBob3ZlcjogZmFsc2UgfSxcbiAgLy8gICAgIHsgbGFiZWw6ICdBY3Rpb24gMycsaWNvblNyYzogJycsIGhvdmVyOiBmYWxzZSB9XG4gIC8vICAgXVxuICAvLyB9O1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTS1MxNEpVTDI1IEluaXRpYWxpemUgbGFuZ3VhZ2Ugc2V0dGluZ3Mgb24gY29tcG9uZW50IGxvYWRcbiAgICAvLyBTS1MxNEpVTDI1IEdldCB0aGUgc2F2ZWQgbGFuZ3VhZ2UgZnJvbSBsb2NhbFN0b3JhZ2UgKGlmIGFueSlcbiAgICBsZXQgbGFuZyA9IHRoaXMubGFuZ3VhZ2VDb2RlIHx8IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldExhbmd1YWdlKCkgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJykgfHwgJ2VuJztcbiAgICAvLyBTS1MxNEpVTDI1IElmIGxhbmd1YWdlQ29kZSBpcyBhbHJlYWR5IHNldCAoZS5nLiwgZnJvbSBpbnB1dCBvciBjb25maWcpLCBhcHBseSBpdFxuICAgIGlmIChsYW5nKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlQ29kZSk7XG4gICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IGxhbmc7XG4gICAgfVxuICAgIC8vIFNLUzE0SlVMMjUgU3Vic2NyaWJlIHRvIHRyYW5zbGF0aW9uIGxvYWQgZXZlbnQgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uLFxuICAgIC8vU0tTMTRKVUwyNSBlbnN1cmluZyB0aGF0IHRyYW5zbGF0aW9ucyB1c2luZyBwaXBlcyBnZXQgdXBkYXRlZCBwcm9wZXJseVxuICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0aW9uc0xvYWRlZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpOyAvL1NLUzE0SlVMMjUgRm9yY2UgcGlwZSByZS1ldmFsdWF0aW9uIGFmdGVyIGxhbmd1YWdlIGNoYW5nZVxuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gU0tTMTRKVUwyNSBDaGVjayBpZiB0aGVyZSdzIGEgY2hhbmdlIGluIHRoZSBpbnB1dCBwcm9wZXJ0eSAnbGFuZ3VhZ2VDb2RlJ1xuICAgIGlmIChjaGFuZ2VzWydsYW5ndWFnZUNvZGUnXSkge1xuICAgICAgLy8gU0tTMTRKVUwyNSBJZiBuZXcgbGFuZ3VhZ2VDb2RlIGlzIHNldCwgdXBkYXRlIHRoZSB0cmFuc2xhdGlvbiBzZXJ2aWNlXG4gICAgICBpZiAodGhpcy5sYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0TGFuZ3VhZ2UodGhpcy5sYW5ndWFnZUNvZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSAgXG4gIC8vU0tTMjRKQU4yNSBGdW5jdGlvbiB0byBnZXQgc3R5bGVzIGZvciBkcm9wZG93biBhbmQgZ3JvdXAgYnV0dG9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbi5cbiAgZ2V0QnV0dG9uU3R5bGVzKGNvbmZpZzogYW55KTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdidXR0b24tY3VzdG9tLWJnJzogY29uZmlnLmJ0bkJnQ29sb3IgfHwgJycsXG4gICAgICAnYnV0dG9uLWN1c3RvbS1ib3JkZXInOiBjb25maWcuYnRuQm9yZGVyIHx8ICcnLFxuICAgICAgJ2J1dHRvbi1jdXN0b20tY29sb3InOiBjb25maWcuYnRuVGV4dENvbG9yIHx8ICcnLFxuICAgICAgJ2J1dHRvbi1jdXN0b20taGVpZ2h0JzogY29uZmlnLmJ0bkhlaWdodCB8fCAnJyxcbiAgICAgICdidXR0b24tY3VzdG9tLXdpZHRoJzogY29uZmlnLmJ0bldpZHRoIHx8ICcnLFxuICAgICAgJ2J1dHRvbi1ob3Zlci1iZyc6IGNvbmZpZy5idG5Ib3ZlckJnQ29sb3IgfHwgJycsXG4gICAgICAnYnV0dG9uLWhvdmVyLXRleHQtY29sb3InOiBjb25maWcuYnRuSG92ZXJUZXh0Q29sb3IgfHwgJydcbiAgICB9O1xuICB9XG4gIFxuXG4gIGJ1dHRvbkNsaWNrZWQoJGV2ZW50OmFueSl7XG4gICAgdGhpcy5idXR0b25DbGlja0VtaXQuZW1pdCgkZXZlbnQpO1xuICAgIGlmKHRoaXMuaXNEcm9wZG93bk9wZW4pe1xuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3Blbj1mYWxzZVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKCkge1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcbiAgfVxuLy9TS1MyNEpBTjI1IExpc3RlbmVyIGZvciBjbGlja3Mgb3V0c2lkZSB0aGUgZHJvcGRvd24gYnV0dG9uIHRvIGNsb3NlIG9yIG1hbmFnZSBpdHMgc3RhdGUuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc0Ryb3Bkb3duT3BlbiAmJiAhdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICkge1xuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBTS1MyNEpBTjI1IGdyb3VwIGJ1dHRvbiAtLT5cbjxkaXYgKm5nSWY9XCJ0eXBlID09PSAnZ3JvdXAnXCIgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiQnV0dG9uIEdyb3VwXCI+XG4gICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgYnRuIG9mIGJ1dHRvbkNvbmZpZy5idXR0b25zXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWljb24ge3tidG4uYnV0dG9uVHlwZX19IHRvb2x0aXAtY29udGFpbmVyXCJcbiAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImJ0bi50YWJJbmRleFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJzLXRvZ2dsZV09XCJidG4ubW9kYWxUb1RyaWdnZXIgPyAnbW9kYWwnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJzLXRhcmdldF09XCJidG4ubW9kYWxUb1RyaWdnZXIgPyAnIycgKyBidG4ubW9kYWxUb1RyaWdnZXIgOiBudWxsXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldEJ1dHRvblN0eWxlcyhidG4pXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uYnV0dG9uRGlzYWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJzLWRpc21pc3NdPVwiYnRuLmRhdGFEaXNtaXNzXCJcbiAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGJ0bilcIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiYnRuLmJ0bklkICE9PSAnZGVmYXVsdCcgPyBidG4uYnRuSWQgOiBudWxsXCI+XG4gICAgICAgIDxpbWcgKm5nSWY9XCJidG4uaXNJbWFnZVN2Z1wiIFtzcmNdPVwiYnRuLmljb25TcmNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiIFxuICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOnt7YnRuLnRvb2x0aXBCY0NvbG9yfX07XG4gICAgICAgICAgICBjb2xvcjp7e2J0bi50b29sdGlwQ29sb3J9fTtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTp7e2J0bi50b29sdGlwRlNpemV9fVwiPlxuICAgICAgICAgICAge3sgYnRuLnRvb2x0aXBQYXRoIHx8IGJ0bi50b29sdGlwIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogYnRuLnRvb2x0aXAgfX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLXBvaW50ZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6e3tidG4udG9vbHRpcEJjQ29sb3J9fTtcIj48L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+XG4gIFxuPCEtLSBTS1MyNEpBTjI1IHNpbmdsZSBidXR0b24gLS0+XG48YnV0dG9uIHR5cGU9XCJidXR0b25cIiAgKm5nSWY9XCJ0eXBlICE9PSAnZ3JvdXAnICYmIHR5cGUgIT09ICdkcm9wZG93bidcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBmYy1idXR0b24ge3tidXR0b25UeXBlfX1cIiBbdGFiaW5kZXhdPVwidGFiSW5kZXhcIlxuICAgIFthdHRyLmRhdGEtYnMtdG9nZ2xlXT1cIm1vZGFsVG9UcmlnZ2VyICE9ICcnID8gJ21vZGFsJyA6ICcnXCJcbiAgICBbYXR0ci5kYXRhLWJzLXRhcmdldF09XCJtb2RhbFRvVHJpZ2dlciAhPSAnJyA/ICcjJyttb2RhbFRvVHJpZ2dlciA6ICcnXCJcbiAgICBzdHlsZT1cImJ1dHRvbi1jdXN0b20tYmc6IHt7YnRuQmdDb2xvcn19O2J1dHRvbi1jdXN0b20tYm9yZGVyOiB7e2J0bkJvcmRlcn19O2J1dHRvbi1jdXN0b20tY29sb3I6IHt7YnRuVGV4dENvbG9yfX07YnV0dG9uLWN1c3RvbS1oZWlnaHQ6IHt7YnRuSGVpZ2h0fX07YnV0dG9uLWN1c3RvbS13aWR0aDoge3tidG5XaWR0aH19O2J1dHRvbi1ob3Zlci1iZzoge3tidG5Ib3ZlckJnQ29sb3J9fTtidXR0b24taG92ZXItdGV4dC1jb2xvcjoge3tidG5Ib3ZlclRleHRDb2xvcn19O1wiXG4gICAgW2Rpc2FibGVkXT1cImJ1dHRvbkRpc2FibGVcIiBbYXR0ci5kYXRhLWJzLWRpc21pc3NdPSdkYXRhRGlzbWlzcycgKGNsaWNrKT1cImJ1dHRvbkNsaWNrZWQoJGV2ZW50KVwiXG4gICAgW2F0dHIuaWRdPVwiYnRuSWQgIT0gJ2RlZmF1bHQnID8gYnRuSWQgOiBudWxsXCI+XG4gICAgPGltZyAqbmdJZj1cImJ0bkljb25MZWZ0U3JjICE9ICcnICYmIGlzSW1hZ2VTdmdcIiBzcmM9XCJ7e2J0bkljb25MZWZ0U3JjfX1cIlxuICAgICAgICBjbGFzcz1cImZjLWJ0bi1pY29uIGxlZnQtaWNvblwiPlxuICAgIDxpbWcgKm5nSWY9XCJidG5JY29uTGVmdFNyYyAhPSAnJyAmJiAhaXNJbWFnZVN2Z1wiIHNyYz1cInt7YnRuSWNvbkxlZnRTcmN9fVwiIGNsYXNzPVwiZmMtYnRuLWljb24gbGVmdC1pY29uXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJmYy1idG4tdGV4dFwiPnt7YnV0dG9uVmFsdWV9fTwvc3Bhbj5cbiAgICA8aW1nICpuZ0lmPVwiYnRuSWNvblJpZ2h0U3JjICE9ICcnICYmIGlzSW1hZ2VTdmdcIiBzcmM9XCJ7e2J0bkljb25SaWdodFNyY319XCJcbiAgICAgICAgY2xhc3M9XCJmYy1idG4taWNvbiByaWdodC1pY29uXCI+XG4gICAgPGltZyAqbmdJZj1cImJ0bkljb25SaWdodFNyYyAhPSAnJyAmJiAhaXNJbWFnZVN2Z1wiIHNyYz1cInt7YnRuSWNvblJpZ2h0U3JjfX1cIiBjbGFzcz1cImZjLWJ0bi1pY29uIHJpZ2h0LWljb25cIj5cbjwvYnV0dG9uPlxuXG48IS0tIFNLUzI0SkFOMjUgZHJvcGRvd24gYnV0dG9uIC0tPlxuPGRpdiAqbmdJZj1cInR5cGUgPT09ICdkcm9wZG93bidcIiBjbGFzcz1cImRyb3Bkb3duXCI+XG4gICAgPHN2ZyBjbGFzcz1cImNsaWNrYWJsZS1pbWdcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiICB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxyZWN0IHg9XCIwLjNcIiB5PVwiMC4zXCIgd2lkdGg9XCIzOS40XCIgaGVpZ2h0PVwiMzkuNFwiIHJ4PVwiMTEuN1wiIGZpbGw9XCIjRkFGQkZEXCIgc3Ryb2tlPVwiI0Q1RDVENVwiIHN0cm9rZS13aWR0aD1cIjAuNlwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xOS45OTk5IDI1LjY2NjdDMjMuNjgxOCAyNS42NjY3IDI2LjY2NjYgMjIuNjgxOSAyNi42NjY2IDE5QzI2LjY2NjYgMTUuMzE4MSAyMy42ODE4IDEyLjMzMzQgMTkuOTk5OSAxMi4zMzM0QzE2LjMxOCAxMi4zMzM0IDEzLjMzMzMgMTUuMzE4MSAxMy4zMzMzIDE5QzEzLjMzMzMgMjIuNjgxOSAxNi4zMTggMjUuNjY2NyAxOS45OTk5IDI1LjY2NjdaXCIgZmlsbD1cIiMyOTJEMzJcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xNy42NDY3IDE4LjE2TDIwLjAwMDEgMjAuNTA2N0wyMi4zNTM0IDE4LjE2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgPC9zdmc+ICBcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiICAqbmdJZj1cImlzRHJvcGRvd25PcGVuXCI+XG4gICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IGJ0biBvZiBidXR0b25Db25maWcuYnV0dG9uc1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1pY29uIHt7YnRuLmJ1dHRvblR5cGV9fSB0b29sdGlwLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJidG4udGFiSW5kZXhcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1icy10b2dnbGVdPVwiYnRuLm1vZGFsVG9UcmlnZ2VyID8gJ21vZGFsJyA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1icy10YXJnZXRdPVwiYnRuLm1vZGFsVG9UcmlnZ2VyID8gJyMnICsgYnRuLm1vZGFsVG9UcmlnZ2VyIDogbnVsbFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRCdXR0b25TdHlsZXMoYnRuKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnRuLmJ1dHRvbkRpc2FibGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1icy1kaXNtaXNzXT1cImJ0bi5kYXRhRGlzbWlzc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChidG4pXCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cImJ0bi5idG5JZCAhPT0gJ2RlZmF1bHQnID8gYnRuLmJ0bklkIDogbnVsbFwiPlxuICAgICAgICAgICAgPGltZyAqbmdJZj1cImJ0bi5pc0ltYWdlU3ZnXCIgW3NyY109XCJidG4uaWNvblNyY1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYy1idG4tdGV4dFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMnB4O1wiPnt7YnRuLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==