@skyux/indicators 8.7.0 → 9.0.0-alpha.0

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 (118) hide show
  1. package/{esm2020 → esm2022}/lib/modules/alert/alert.component.mjs +56 -55
  2. package/{esm2020 → esm2022}/lib/modules/alert/alert.module.mjs +13 -13
  3. package/{esm2020 → esm2022}/lib/modules/chevron/chevron.component.mjs +4 -4
  4. package/{esm2020 → esm2022}/lib/modules/chevron/chevron.module.mjs +13 -13
  5. package/{esm2020 → esm2022}/lib/modules/expansion-indicator/expansion-indicator.component.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/modules/expansion-indicator/expansion-indicator.module.mjs +5 -5
  7. package/{esm2020 → esm2022}/lib/modules/help-inline/help-inline-aria-expanded.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/modules/help-inline/help-inline.component.mjs +4 -4
  9. package/{esm2020 → esm2022}/lib/modules/help-inline/help-inline.module.mjs +13 -13
  10. package/esm2022/lib/modules/icon/icon-class-list.pipe.mjs +35 -0
  11. package/esm2022/lib/modules/icon/icon-resolver.service.mjs +57 -0
  12. package/{esm2020 → esm2022}/lib/modules/icon/icon-stack.component.mjs +4 -4
  13. package/{esm2020 → esm2022}/lib/modules/icon/icon.component.mjs +4 -4
  14. package/{esm2020 → esm2022}/lib/modules/icon/icon.module.mjs +5 -5
  15. package/{esm2020 → esm2022}/lib/modules/key-info/key-info-label.component.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/modules/key-info/key-info-value.component.mjs +4 -4
  17. package/{esm2020 → esm2022}/lib/modules/key-info/key-info.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/lib/modules/key-info/key-info.module.mjs +9 -9
  19. package/esm2022/lib/modules/label/label.component.mjs +118 -0
  20. package/{esm2020 → esm2022}/lib/modules/label/label.module.mjs +11 -11
  21. package/{esm2020 → esm2022}/lib/modules/shared/sky-indicators-resources.module.mjs +11 -11
  22. package/esm2022/lib/modules/status-indicator/status-indicator.component.mjs +104 -0
  23. package/{esm2020 → esm2022}/lib/modules/status-indicator/status-indicator.module.mjs +13 -13
  24. package/esm2022/lib/modules/text-highlight/text-highlight.directive.mjs +151 -0
  25. package/{esm2020 → esm2022}/lib/modules/text-highlight/text-highlight.module.mjs +5 -5
  26. package/{esm2020 → esm2022}/lib/modules/tokens/token.component.mjs +15 -15
  27. package/esm2022/lib/modules/tokens/tokens.component.mjs +332 -0
  28. package/{esm2020 → esm2022}/lib/modules/tokens/tokens.module.mjs +11 -11
  29. package/esm2022/lib/modules/wait/wait-adapter.service.mjs +224 -0
  30. package/{esm2020 → esm2022}/lib/modules/wait/wait-page.component.mjs +4 -4
  31. package/esm2022/lib/modules/wait/wait.component.mjs +171 -0
  32. package/{esm2020 → esm2022}/lib/modules/wait/wait.module.mjs +5 -5
  33. package/esm2022/lib/modules/wait/wait.service.mjs +159 -0
  34. package/esm2022/testing/alert/alert-harness.mjs +112 -0
  35. package/esm2022/testing/alert-fixture.mjs +70 -0
  36. package/esm2022/testing/chevron/chevron-harness.mjs +38 -0
  37. package/esm2022/testing/help-inline/help-inline-harness.mjs +25 -0
  38. package/esm2022/testing/icon/icon-harness.mjs +86 -0
  39. package/esm2022/testing/key-info/key-info-harness.mjs +43 -0
  40. package/{esm2020 → esm2022}/testing/key-info/key-info-label-harness.mjs +5 -5
  41. package/{esm2020 → esm2022}/testing/key-info/key-info-value-harness.mjs +5 -5
  42. package/esm2022/testing/label/label-harness.mjs +88 -0
  43. package/esm2022/testing/label-fixture.mjs +42 -0
  44. package/esm2022/testing/tokens/token-harness.mjs +63 -0
  45. package/esm2022/testing/tokens/tokens-harness.mjs +45 -0
  46. package/esm2022/testing/wait/wait-harness.mjs +60 -0
  47. package/esm2022/testing/wait-fixture.mjs +28 -0
  48. package/{fesm2020 → fesm2022}/skyux-indicators-testing.mjs +146 -190
  49. package/{fesm2020 → fesm2022}/skyux-indicators-testing.mjs.map +1 -1
  50. package/{fesm2020 → fesm2022}/skyux-indicators.mjs +756 -737
  51. package/fesm2022/skyux-indicators.mjs.map +1 -0
  52. package/lib/modules/alert/alert.component.d.ts +1 -1
  53. package/lib/modules/chevron/chevron.component.d.ts +1 -1
  54. package/lib/modules/expansion-indicator/expansion-indicator.component.d.ts +1 -1
  55. package/lib/modules/help-inline/help-inline.component.d.ts +1 -1
  56. package/lib/modules/icon/icon-stack.component.d.ts +1 -1
  57. package/lib/modules/icon/icon.component.d.ts +1 -1
  58. package/lib/modules/key-info/key-info.component.d.ts +1 -1
  59. package/lib/modules/label/label.component.d.ts +1 -1
  60. package/lib/modules/status-indicator/status-indicator.component.d.ts +1 -1
  61. package/lib/modules/text-highlight/text-highlight.directive.d.ts +1 -1
  62. package/lib/modules/tokens/token.component.d.ts +1 -1
  63. package/lib/modules/tokens/tokens.component.d.ts +1 -1
  64. package/lib/modules/wait/wait-page.component.d.ts +1 -1
  65. package/lib/modules/wait/wait.component.d.ts +1 -1
  66. package/package.json +17 -25
  67. package/esm2020/lib/modules/icon/icon-class-list.pipe.mjs +0 -40
  68. package/esm2020/lib/modules/icon/icon-resolver.service.mjs +0 -60
  69. package/esm2020/lib/modules/label/label.component.mjs +0 -116
  70. package/esm2020/lib/modules/status-indicator/status-indicator.component.mjs +0 -104
  71. package/esm2020/lib/modules/text-highlight/text-highlight.directive.mjs +0 -154
  72. package/esm2020/lib/modules/tokens/tokens.component.mjs +0 -320
  73. package/esm2020/lib/modules/wait/wait-adapter.service.mjs +0 -221
  74. package/esm2020/lib/modules/wait/wait.component.mjs +0 -167
  75. package/esm2020/lib/modules/wait/wait.service.mjs +0 -161
  76. package/esm2020/testing/alert/alert-harness.mjs +0 -118
  77. package/esm2020/testing/alert-fixture.mjs +0 -72
  78. package/esm2020/testing/chevron/chevron-harness.mjs +0 -44
  79. package/esm2020/testing/help-inline/help-inline-harness.mjs +0 -31
  80. package/esm2020/testing/icon/icon-harness.mjs +0 -90
  81. package/esm2020/testing/key-info/key-info-harness.mjs +0 -49
  82. package/esm2020/testing/label/label-harness.mjs +0 -94
  83. package/esm2020/testing/label-fixture.mjs +0 -45
  84. package/esm2020/testing/tokens/token-harness.mjs +0 -69
  85. package/esm2020/testing/tokens/tokens-harness.mjs +0 -45
  86. package/esm2020/testing/wait/wait-harness.mjs +0 -66
  87. package/esm2020/testing/wait-fixture.mjs +0 -31
  88. package/fesm2015/skyux-indicators-testing.mjs +0 -854
  89. package/fesm2015/skyux-indicators-testing.mjs.map +0 -1
  90. package/fesm2015/skyux-indicators.mjs +0 -2172
  91. package/fesm2015/skyux-indicators.mjs.map +0 -1
  92. package/fesm2020/skyux-indicators.mjs.map +0 -1
  93. /package/{esm2020 → esm2022}/index.mjs +0 -0
  94. /package/{esm2020 → esm2022}/lib/modules/icon/icon-stack-item.mjs +0 -0
  95. /package/{esm2020 → esm2022}/lib/modules/icon/types/icon-resolved.mjs +0 -0
  96. /package/{esm2020 → esm2022}/lib/modules/icon/types/icon-type.mjs +0 -0
  97. /package/{esm2020 → esm2022}/lib/modules/icon/types/icon-variant-type.mjs +0 -0
  98. /package/{esm2020 → esm2022}/lib/modules/key-info/key-info-layout-type.mjs +0 -0
  99. /package/{esm2020 → esm2022}/lib/modules/label/label-type.mjs +0 -0
  100. /package/{esm2020 → esm2022}/lib/modules/shared/indicator-description-type.mjs +0 -0
  101. /package/{esm2020 → esm2022}/lib/modules/shared/indicator-icon-type.mjs +0 -0
  102. /package/{esm2020 → esm2022}/lib/modules/shared/indicator-icon-utility.mjs +0 -0
  103. /package/{esm2020 → esm2022}/lib/modules/shared/indicator-icon.mjs +0 -0
  104. /package/{esm2020 → esm2022}/lib/modules/tokens/types/token-selected-event-args.mjs +0 -0
  105. /package/{esm2020 → esm2022}/lib/modules/tokens/types/token.mjs +0 -0
  106. /package/{esm2020 → esm2022}/lib/modules/tokens/types/tokens-message-type.mjs +0 -0
  107. /package/{esm2020 → esm2022}/lib/modules/tokens/types/tokens-message.mjs +0 -0
  108. /package/{esm2020 → esm2022}/skyux-indicators.mjs +0 -0
  109. /package/{esm2020 → esm2022}/testing/alert/alert-harness-filters.mjs +0 -0
  110. /package/{esm2020 → esm2022}/testing/help-inline/help-inline-harness-filters.mjs +0 -0
  111. /package/{esm2020 → esm2022}/testing/icon/icon-harness-filters.mjs +0 -0
  112. /package/{esm2020 → esm2022}/testing/key-info/key-info-harness-filters.mjs +0 -0
  113. /package/{esm2020 → esm2022}/testing/label/label-harness-filters.mjs +0 -0
  114. /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
  115. /package/{esm2020 → esm2022}/testing/skyux-indicators-testing.mjs +0 -0
  116. /package/{esm2020 → esm2022}/testing/tokens/token-harness-filters.mjs +0 -0
  117. /package/{esm2020 → esm2022}/testing/tokens/tokens-harness-filters.mjs +0 -0
  118. /package/{esm2020 → esm2022}/testing/wait/wait-harness-filters.mjs +0 -0
@@ -1,154 +0,0 @@
1
- var _SkyTextHighlightDirective_instances, _SkyTextHighlightDirective_existingHighlight, _SkyTextHighlightDirective_observer, _SkyTextHighlightDirective_searchTerms, _SkyTextHighlightDirective_el, _SkyTextHighlightDirective_observerSvc, _SkyTextHighlightDirective_disconnectObserver, _SkyTextHighlightDirective_highlight, _SkyTextHighlightDirective_observeDom;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { Directive, ElementRef, Input, inject, } from '@angular/core';
4
- import { SkyMutationObserverService } from '@skyux/core';
5
- import * as i0 from "@angular/core";
6
- const CLASS_NAME = 'sky-highlight-mark';
7
- const SPECIAL_CHAR_REGEX = /[-/\\^$*+?.()|[\]{}]/g;
8
- function markNode(node, searchRegex) {
9
- // The search regular expression is reused across calls to markNode(), so reset
10
- // it so it searches from the start of the string each time.
11
- searchRegex.lastIndex = 0;
12
- const text = node.nodeValue;
13
- if (text) {
14
- const match = searchRegex.exec(text);
15
- if (match) {
16
- // Split apart text node with mark tags in the middle on the search term.
17
- const matchIndex = match.index;
18
- const middle = node.splitText(matchIndex);
19
- middle.splitText(searchRegex.lastIndex - matchIndex);
20
- const middleClone = middle.cloneNode(true);
21
- const markNode = document.createElement('mark');
22
- markNode.className = CLASS_NAME;
23
- markNode.appendChild(middleClone);
24
- /* istanbul ignore else */
25
- if (middle.parentNode) {
26
- middle.parentNode.replaceChild(markNode, middle);
27
- }
28
- return 1;
29
- }
30
- }
31
- return 0;
32
- }
33
- function markTextNodes(node, searchRegex) {
34
- if (node.nodeType === 3) {
35
- return markNode(node, searchRegex);
36
- }
37
- else if (node.nodeType === 1 && node.childNodes) {
38
- for (let i = 0; i < node.childNodes.length; i++) {
39
- const childNode = node.childNodes[i];
40
- i += markTextNodes(childNode, searchRegex);
41
- }
42
- }
43
- return 0;
44
- }
45
- function removeHighlight(el) {
46
- const matchedElements = el.nativeElement.querySelectorAll(`mark.${CLASS_NAME}`);
47
- if (matchedElements) {
48
- for (let i = 0; i < matchedElements.length; i++) {
49
- const node = matchedElements[i];
50
- const parentNode = node.parentNode;
51
- if (parentNode && node.firstChild) {
52
- parentNode.replaceChild(node.firstChild, node);
53
- parentNode.normalize();
54
- }
55
- }
56
- }
57
- }
58
- function createSearchRegex(searchTerms) {
59
- let searchRegex;
60
- if (searchTerms.length > 0) {
61
- // Escape all the special regular expression characters by adding a
62
- // preceding '\' to each match.
63
- searchTerms = searchTerms.map((searchTerm) => searchTerm.replace(SPECIAL_CHAR_REGEX, '\\$&'));
64
- searchRegex = new RegExp(searchTerms.join('|'), 'gi');
65
- }
66
- return searchRegex;
67
- }
68
- // Need to add the following to classes which contain static methods.
69
- // See: https://github.com/ng-packagr/ng-packagr/issues/641
70
- // @dynamic
71
- /**
72
- * Highlights all matching text within the current DOM element.
73
- */
74
- export class SkyTextHighlightDirective {
75
- constructor() {
76
- _SkyTextHighlightDirective_instances.add(this);
77
- _SkyTextHighlightDirective_existingHighlight.set(this, false);
78
- _SkyTextHighlightDirective_observer.set(this, void 0);
79
- _SkyTextHighlightDirective_searchTerms.set(this, []);
80
- _SkyTextHighlightDirective_el.set(this, inject(ElementRef));
81
- _SkyTextHighlightDirective_observerSvc.set(this, inject(SkyMutationObserverService));
82
- }
83
- /**
84
- * The text to highlight.
85
- */
86
- set skyHighlight(value) {
87
- value = value || [];
88
- if (Array.isArray(value)) {
89
- __classPrivateFieldSet(this, _SkyTextHighlightDirective_searchTerms, value.filter((item) => !!item), "f");
90
- // Reorder strings by their length in descending order to avoid missing matches
91
- // that contain substrings of other matches.
92
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_searchTerms, "f").sort(function (a, b) {
93
- return b.length - a.length;
94
- });
95
- }
96
- else {
97
- __classPrivateFieldSet(this, _SkyTextHighlightDirective_searchTerms, [value], "f");
98
- }
99
- }
100
- ngOnChanges(changes) {
101
- if (changes['skyHighlight'] && !changes['skyHighlight'].firstChange) {
102
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_instances, "m", _SkyTextHighlightDirective_highlight).call(this);
103
- }
104
- }
105
- ngAfterViewInit() {
106
- __classPrivateFieldSet(this, _SkyTextHighlightDirective_observer, __classPrivateFieldGet(this, _SkyTextHighlightDirective_observerSvc, "f").create(() => {
107
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_instances, "m", _SkyTextHighlightDirective_highlight).call(this);
108
- }), "f");
109
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_instances, "m", _SkyTextHighlightDirective_highlight).call(this);
110
- }
111
- ngOnDestroy() {
112
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_instances, "m", _SkyTextHighlightDirective_disconnectObserver).call(this);
113
- }
114
- }
115
- _SkyTextHighlightDirective_existingHighlight = new WeakMap(), _SkyTextHighlightDirective_observer = new WeakMap(), _SkyTextHighlightDirective_searchTerms = new WeakMap(), _SkyTextHighlightDirective_el = new WeakMap(), _SkyTextHighlightDirective_observerSvc = new WeakMap(), _SkyTextHighlightDirective_instances = new WeakSet(), _SkyTextHighlightDirective_disconnectObserver = function _SkyTextHighlightDirective_disconnectObserver() {
116
- if (__classPrivateFieldGet(this, _SkyTextHighlightDirective_observer, "f")) {
117
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_observer, "f").disconnect();
118
- }
119
- }, _SkyTextHighlightDirective_highlight = function _SkyTextHighlightDirective_highlight() {
120
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_instances, "m", _SkyTextHighlightDirective_disconnectObserver).call(this);
121
- if (__classPrivateFieldGet(this, _SkyTextHighlightDirective_existingHighlight, "f")) {
122
- removeHighlight(__classPrivateFieldGet(this, _SkyTextHighlightDirective_el, "f"));
123
- }
124
- const node = __classPrivateFieldGet(this, _SkyTextHighlightDirective_el, "f").nativeElement;
125
- if (node) {
126
- const searchRegex = createSearchRegex(__classPrivateFieldGet(this, _SkyTextHighlightDirective_searchTerms, "f"));
127
- // mark all matched text in the DOM
128
- if (searchRegex) {
129
- markTextNodes(node, searchRegex);
130
- __classPrivateFieldSet(this, _SkyTextHighlightDirective_existingHighlight, true, "f");
131
- }
132
- }
133
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_instances, "m", _SkyTextHighlightDirective_observeDom).call(this);
134
- }, _SkyTextHighlightDirective_observeDom = function _SkyTextHighlightDirective_observeDom() {
135
- if (__classPrivateFieldGet(this, _SkyTextHighlightDirective_observer, "f")) {
136
- const config = {
137
- attributes: false,
138
- childList: true,
139
- characterData: true,
140
- };
141
- __classPrivateFieldGet(this, _SkyTextHighlightDirective_observer, "f").observe(__classPrivateFieldGet(this, _SkyTextHighlightDirective_el, "f").nativeElement, config);
142
- }
143
- };
144
- SkyTextHighlightDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextHighlightDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
145
- SkyTextHighlightDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: SkyTextHighlightDirective, selector: "[skyHighlight]", inputs: { skyHighlight: "skyHighlight" }, usesOnChanges: true, ngImport: i0 });
146
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextHighlightDirective, decorators: [{
147
- type: Directive,
148
- args: [{
149
- selector: '[skyHighlight]',
150
- }]
151
- }], propDecorators: { skyHighlight: [{
152
- type: Input
153
- }] } });
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2luZGljYXRvcnMvc3JjL2xpYi9tb2R1bGVzL3RleHQtaGlnaGxpZ2h0L3RleHQtaGlnaGxpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFJTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUV6RCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztBQUN4QyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDO0FBRW5ELFNBQVMsUUFBUSxDQUFDLElBQVUsRUFBRSxXQUFtQjtJQUMvQywrRUFBK0U7SUFDL0UsNERBQTREO0lBQzVELFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRTFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFFNUIsSUFBSSxJQUFJLEVBQUU7UUFDUixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLElBQUksS0FBSyxFQUFFO1lBQ1QseUVBQXlFO1lBQ3pFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFFL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDckQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFD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LE1BQXhCLElBQUksQ0FBc0IsQ0FBQztJQUUzQixJQUFJLHVCQUFBLElBQUksb0RBQW1CLEVBQUU7UUFDM0IsZUFBZSxDQUFDLHVCQUFBLElBQUkscUNBQUksQ0FBQyxDQUFDO0tBQzNCO0lBRUQsTUFBTSxJQUFJLEdBQUcsdUJBQUEsSUFBSSxxQ0FBSSxDQUFDLGFBQWEsQ0FBQztJQUVwQyxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLHVCQUFBLElBQUksOENBQWEsQ0FBQyxDQUFDO1FBRXpELG1DQUFtQztRQUNuQyxJQUFJLFdBQVcsRUFBRTtZQUNmLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDakMsdUJBQUEsSUFBSSxnREFBc0IsSUFBSSxNQUFBLENBQUM7U0FDaEM7S0FDRjtJQUVELHVCQUFBLElBQUksbUZBQVksTUFBaEIsSUFBSSxDQUFjLENBQUM7QUFDckIsQ0FBQztJQUdDLElBQUksdUJBQUEsSUFBSSwyQ0FBVSxFQUFFO1FBQ2xCLE1BQU0sTUFBTSxHQUFHO1lBQ2IsVUFBVSxFQUFFLEtBQUs7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDO1FBRUYsdUJBQUEsSUFBSSwyQ0FBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBQSxJQUFJLHFDQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3hEO0FBQ0gsQ0FBQztzSEF2RlUseUJBQXlCOzBHQUF6Qix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFIckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQjs4QkFRWSxZQUFZO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lNdXRhdGlvbk9ic2VydmVyU2VydmljZSB9IGZyb20gJ0Bza3l1eC9jb3JlJztcblxuY29uc3QgQ0xBU1NfTkFNRSA9ICdza3ktaGlnaGxpZ2h0LW1hcmsnO1xuY29uc3QgU1BFQ0lBTF9DSEFSX1JFR0VYID0gL1stL1xcXFxeJCorPy4oKXxbXFxde31dL2c7XG5cbmZ1bmN0aW9uIG1hcmtOb2RlKG5vZGU6IFRleHQsIHNlYXJjaFJlZ2V4OiBSZWdFeHApOiBudW1iZXIge1xuICAvLyBUaGUgc2VhcmNoIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyByZXVzZWQgYWNyb3NzIGNhbGxzIHRvIG1hcmtOb2RlKCksIHNvIHJlc2V0XG4gIC8vIGl0IHNvIGl0IHNlYXJjaGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgZWFjaCB0aW1lLlxuICBzZWFyY2hSZWdleC5sYXN0SW5kZXggPSAwO1xuXG4gIGNvbnN0IHRleHQgPSBub2RlLm5vZGVWYWx1ZTtcblxuICBpZiAodGV4dCkge1xuICAgIGNvbnN0IG1hdGNoID0gc2VhcmNoUmVnZXguZXhlYyh0ZXh0KTtcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgLy8gU3BsaXQgYXBhcnQgdGV4dCBub2RlIHdpdGggbWFyayB0YWdzIGluIHRoZSBtaWRkbGUgb24gdGhlIHNlYXJjaCB0ZXJtLlxuICAgICAgY29uc3QgbWF0Y2hJbmRleCA9IG1hdGNoLmluZGV4O1xuXG4gICAgICBjb25zdCBtaWRkbGUgPSBub2RlLnNwbGl0VGV4dChtYXRjaEluZGV4KTtcbiAgICAgIG1pZGRsZS5zcGxpdFRleHQoc2VhcmNoUmVnZXgubGFzdEluZGV4IC0gbWF0Y2hJbmRleCk7XG4gICAgICBjb25zdCBtaWRkbGVDbG9uZSA9IG1pZGRsZS5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG1hcmtOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWFyaycpO1xuICAgICAgbWFya05vZGUuY2xhc3NOYW1lID0gQ0xBU1NfTkFNRTtcbiAgICAgIG1hcmtOb2RlLmFwcGVuZENoaWxkKG1pZGRsZUNsb25lKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChtaWRkbGUucGFyZW50Tm9kZSkge1xuICAgICAgICBtaWRkbGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobWFya05vZGUsIG1pZGRsZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBtYXJrVGV4dE5vZGVzKG5vZGU6IE5vZGUsIHNlYXJjaFJlZ2V4OiBSZWdFeHApOiBudW1iZXIge1xuICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBtYXJrTm9kZShub2RlIGFzIFRleHQsIHNlYXJjaFJlZ2V4KTtcbiAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuY2hpbGROb2Rlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZE5vZGUgPSBub2RlLmNoaWxkTm9kZXNbaV07XG4gICAgICBpICs9IG1hcmtUZXh0Tm9kZXMoY2hpbGROb2RlLCBzZWFyY2hSZWdleCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUhpZ2hsaWdodChlbDogRWxlbWVudFJlZik6IHZvaWQge1xuICBjb25zdCBtYXRjaGVkRWxlbWVudHMgPSAoZWwubmF0aXZlRWxlbWVudCBhcyBFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgIGBtYXJrLiR7Q0xBU1NfTkFNRX1gXG4gICk7XG5cbiAgaWYgKG1hdGNoZWRFbGVtZW50cykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gbWF0Y2hlZEVsZW1lbnRzW2ldO1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgaWYgKHBhcmVudE5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCwgbm9kZSk7XG4gICAgICAgIHBhcmVudE5vZGUubm9ybWFsaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlYXJjaFJlZ2V4KHNlYXJjaFRlcm1zOiBzdHJpbmdbXSk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gIGxldCBzZWFyY2hSZWdleDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChzZWFyY2hUZXJtcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gRXNjYXBlIGFsbCB0aGUgc3BlY2lhbCByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVycyBieSBhZGRpbmcgYVxuICAgIC8vIHByZWNlZGluZyAnXFwnIHRvIGVhY2ggbWF0Y2guXG4gICAgc2VhcmNoVGVybXMgPSBzZWFyY2hUZXJtcy5tYXAoKHNlYXJjaFRlcm0pID0+XG4gICAgICBzZWFyY2hUZXJtLnJlcGxhY2UoU1BFQ0lBTF9DSEFSX1JFR0VYLCAnXFxcXCQmJylcbiAgICApO1xuXG4gICAgc2VhcmNoUmVnZXggPSBuZXcgUmVnRXhwKHNlYXJjaFRlcm1zLmpvaW4oJ3wnKSwgJ2dpJyk7XG4gIH1cblxuICByZXR1cm4gc2VhcmNoUmVnZXg7XG59XG5cbi8vIE5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgdG8gY2xhc3NlcyB3aGljaCBjb250YWluIHN0YXRpYyBtZXRob2RzLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbmctcGFja2Fnci9uZy1wYWNrYWdyL2lzc3Vlcy82NDFcbi8vIEBkeW5hbWljXG4vKipcbiAqIEhpZ2hsaWdodHMgYWxsIG1hdGNoaW5nIHRleHQgd2l0aGluIHRoZSBjdXJyZW50IERPTSBlbGVtZW50LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2t5SGlnaGxpZ2h0XScsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRIaWdobGlnaHREaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICAvKipcbiAgICogVGhlIHRleHQgdG8gaGlnaGxpZ2h0LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBza3lIaWdobGlnaHQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSB2YWx1ZSB8fCBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGhpcy4jc2VhcmNoVGVybXMgPSB2YWx1ZS5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbSk7XG4gICAgICAvLyBSZW9yZGVyIHN0cmluZ3MgYnkgdGhlaXIgbGVuZ3RoIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gYXZvaWQgbWlzc2luZyBtYXRjaGVzXG4gICAgICAvLyB0aGF0IGNvbnRhaW4gc3Vic3RyaW5ncyBvZiBvdGhlciBtYXRjaGVzLlxuICAgICAgdGhpcy4jc2VhcmNoVGVybXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNzZWFyY2hUZXJtcyA9IFt2YWx1ZSBhcyBzdHJpbmddO1xuICAgIH1cbiAgfVxuXG4gICNleGlzdGluZ0hpZ2hsaWdodCA9IGZhbHNlO1xuXG4gICNvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IHVuZGVmaW5lZDtcblxuICAjc2VhcmNoVGVybXM6IHN0cmluZ1tdID0gW107XG5cbiAgI2VsID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAjb2JzZXJ2ZXJTdmMgPSBpbmplY3QoU2t5TXV0YXRpb25PYnNlcnZlclNlcnZpY2UpO1xuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NreUhpZ2hsaWdodCddICYmICFjaGFuZ2VzWydza3lIaWdobGlnaHQnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy4jaGlnaGxpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNvYnNlcnZlciA9IHRoaXMuI29ic2VydmVyU3ZjLmNyZWF0ZSgoKSA9PiB7XG4gICAgICB0aGlzLiNoaWdobGlnaHQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuI2hpZ2hsaWdodCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI2Rpc2Nvbm5lY3RPYnNlcnZlcigpO1xuICB9XG5cbiAgI2Rpc2Nvbm5lY3RPYnNlcnZlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jb2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuI29ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICAjaGlnaGxpZ2h0KCk6IHZvaWQge1xuICAgIHRoaXMuI2Rpc2Nvbm5lY3RPYnNlcnZlcigpO1xuXG4gICAgaWYgKHRoaXMuI2V4aXN0aW5nSGlnaGxpZ2h0KSB7XG4gICAgICByZW1vdmVIaWdobGlnaHQodGhpcy4jZWwpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLiNlbC5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFJlZ2V4ID0gY3JlYXRlU2VhcmNoUmVnZXgodGhpcy4jc2VhcmNoVGVybXMpO1xuXG4gICAgICAvLyBtYXJrIGFsbCBtYXRjaGVkIHRleHQgaW4gdGhlIERPTVxuICAgICAgaWYgKHNlYXJjaFJlZ2V4KSB7XG4gICAgICAgIG1hcmtUZXh0Tm9kZXMobm9kZSwgc2VhcmNoUmVnZXgpO1xuICAgICAgICB0aGlzLiNleGlzdGluZ0hpZ2hsaWdodCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jb2JzZXJ2ZURvbSgpO1xuICB9XG5cbiAgI29ic2VydmVEb20oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI29ic2VydmVyKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IGZhbHNlLFxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLiNvYnNlcnZlci5vYnNlcnZlKHRoaXMuI2VsLm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,320 +0,0 @@
1
- var _SkyTokensComponent_instances, _SkyTokensComponent__disabled, _SkyTokensComponent__dismissible, _SkyTokensComponent__focusable, _SkyTokensComponent__tokens, _SkyTokensComponent__displayWith, _SkyTokensComponent_messageStreamSub, _SkyTokensComponent_ngUnsubscribe, _SkyTokensComponent_changeDetector, _SkyTokensComponent__activeIndex, _SkyTokensComponent__messageStream, _SkyTokensComponent_focusPreviousToken, _SkyTokensComponent_focusNextToken, _SkyTokensComponent_focusLastToken, _SkyTokensComponent_focusActiveToken, _SkyTokensComponent_removeActiveToken, _SkyTokensComponent_initMessageStream, _SkyTokensComponent_notifyTokenSelected;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { animate, style, transition, trigger } from '@angular/animations';
4
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChildren, inject, } from '@angular/core';
5
- import { Subject } from 'rxjs';
6
- import { takeUntil } from 'rxjs/operators';
7
- import { SkyTokenComponent } from './token.component';
8
- import { SkyTokensMessageType } from './types/tokens-message-type';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common";
11
- import * as i2 from "./token.component";
12
- const DISPLAY_WITH_DEFAULT = 'name';
13
- /**
14
- * Creates a container that enables navigation between tokens using keyboard arrow keys.
15
- * This is useful when combined with other components where the <kbd>Tab</kbd> key is
16
- * reserved for other functions, such as the SKY UX Lookup component.
17
- */
18
- export class SkyTokensComponent {
19
- /**
20
- * Whether to disable the tokens list to prevent users from selecting tokens,
21
- * dismissing tokens, or navigating through the list with the arrow keys. When the tokens list
22
- * is disabled, users can still place focus on items in the list using the `Tab` key.
23
- * @default false
24
- */
25
- set disabled(value) {
26
- __classPrivateFieldSet(this, _SkyTokensComponent__disabled, !!value, "f");
27
- }
28
- get disabled() {
29
- return __classPrivateFieldGet(this, _SkyTokensComponent__disabled, "f");
30
- }
31
- /**
32
- * Whether users can remove a token from the list by selecting a token's close button.
33
- * @default true
34
- */
35
- set dismissible(value) {
36
- __classPrivateFieldSet(this, _SkyTokensComponent__dismissible, value !== false, "f");
37
- }
38
- get dismissible() {
39
- return __classPrivateFieldGet(this, _SkyTokensComponent__dismissible, "f");
40
- }
41
- /**
42
- * The token property to display for each item in the tokens list.
43
- * @default "name"
44
- */
45
- set displayWith(value) {
46
- __classPrivateFieldSet(this, _SkyTokensComponent__displayWith, value || DISPLAY_WITH_DEFAULT, "f");
47
- }
48
- get displayWith() {
49
- return __classPrivateFieldGet(this, _SkyTokensComponent__displayWith, "f");
50
- }
51
- /**
52
- * Whether users can place focus on tokens in the list using the `Tab` key.
53
- * This does not affect the ability of users to select tokens, dismiss tokens,
54
- * or navigate through the list with the arrow keys.
55
- * @default true
56
- */
57
- set focusable(value) {
58
- __classPrivateFieldSet(this, _SkyTokensComponent__focusable, value !== false, "f");
59
- }
60
- get focusable() {
61
- return __classPrivateFieldGet(this, _SkyTokensComponent__focusable, "f");
62
- }
63
- /**
64
- * The array of tokens to include in the list.
65
- */
66
- set tokens(value) {
67
- __classPrivateFieldSet(this, _SkyTokensComponent__tokens, value || [], "f");
68
- // The previous behavior was to set `this._tokens = value`, then emit `this._tokens`,
69
- // which would emit `undefined` instead of a default value of `[]` returned by the
70
- // get accessor when set to `undefined`. Emitting `value` instead of `this.#_tokensOrDefault`
71
- // preserves that behavior.
72
- this.tokensChange.emit(value);
73
- }
74
- get tokens() {
75
- return __classPrivateFieldGet(this, _SkyTokensComponent__tokens, "f");
76
- }
77
- /**
78
- * The observable of `SkyTokensMessage` that can place focus on a
79
- * particular token or remove the active token from the list.
80
- */
81
- set messageStream(value) {
82
- __classPrivateFieldSet(this, _SkyTokensComponent__messageStream, value || new Subject(), "f");
83
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_initMessageStream).call(this);
84
- }
85
- get messageStream() {
86
- return __classPrivateFieldGet(this, _SkyTokensComponent__messageStream, "f");
87
- }
88
- get activeIndex() {
89
- return __classPrivateFieldGet(this, _SkyTokensComponent__activeIndex, "f");
90
- }
91
- set activeIndex(value) {
92
- if (value >= __classPrivateFieldGet(this, _SkyTokensComponent__tokens, "f").length) {
93
- value = __classPrivateFieldGet(this, _SkyTokensComponent__tokens, "f").length - 1;
94
- this.focusIndexOverRange.emit();
95
- }
96
- if (value < 0) {
97
- value = 0;
98
- this.focusIndexUnderRange.emit();
99
- }
100
- __classPrivateFieldSet(this, _SkyTokensComponent__activeIndex, value || 0, "f");
101
- }
102
- constructor() {
103
- _SkyTokensComponent_instances.add(this);
104
- /**
105
- * Fires when users navigate through the tokens list with the `Tab` key
106
- * and attempt to move past the final token in the list.
107
- */
108
- this.focusIndexOverRange = new EventEmitter();
109
- /**
110
- * Fires when users navigate through the tokens list with the `Tab` key
111
- * and attempt to move before the first token in the list.
112
- */
113
- this.focusIndexUnderRange = new EventEmitter();
114
- /**
115
- * Fires when users select a token in the list. This event emits the selected token.
116
- */
117
- this.tokenSelected = new EventEmitter();
118
- /**
119
- * Fires when the tokens in the list change.
120
- * This event emits an array of the tokens in the updated list.
121
- */
122
- this.tokensChange = new EventEmitter();
123
- /**
124
- * Fires when all animations on the tokens are complete.
125
- * @internal
126
- */
127
- this.tokensRendered = new EventEmitter();
128
- _SkyTokensComponent__disabled.set(this, false);
129
- _SkyTokensComponent__dismissible.set(this, true);
130
- _SkyTokensComponent__focusable.set(this, true);
131
- _SkyTokensComponent__tokens.set(this, []);
132
- _SkyTokensComponent__displayWith.set(this, DISPLAY_WITH_DEFAULT);
133
- _SkyTokensComponent_messageStreamSub.set(this, void 0);
134
- _SkyTokensComponent_ngUnsubscribe.set(this, new Subject());
135
- _SkyTokensComponent_changeDetector.set(this, inject(ChangeDetectorRef));
136
- _SkyTokensComponent__activeIndex.set(this, 0);
137
- _SkyTokensComponent__messageStream.set(this, new Subject());
138
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_initMessageStream).call(this);
139
- // Angular calls the trackBy function without applying the component instance's scope.
140
- // Use a fat-arrow function so the current component instance's trackWith property can
141
- // be referenced.
142
- this.trackTokenFn = (_index, item) => {
143
- if (this.trackWith) {
144
- return item.value[this.trackWith];
145
- }
146
- return item;
147
- };
148
- }
149
- ngOnDestroy() {
150
- __classPrivateFieldGet(this, _SkyTokensComponent_ngUnsubscribe, "f").next();
151
- __classPrivateFieldGet(this, _SkyTokensComponent_ngUnsubscribe, "f").complete();
152
- }
153
- onTokenClick(token) {
154
- if (this.disabled) {
155
- return;
156
- }
157
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_notifyTokenSelected).call(this, token);
158
- }
159
- animationDone() {
160
- this.tokensRendered.emit();
161
- }
162
- onTokenKeyDown(event) {
163
- if (!this.disabled) {
164
- switch (event.key) {
165
- case 'Left':
166
- case 'ArrowLeft':
167
- __classPrivateFieldGet(this, _SkyTokensComponent__messageStream, "f").next({
168
- type: SkyTokensMessageType.FocusPreviousToken,
169
- });
170
- event.preventDefault();
171
- break;
172
- case 'Right':
173
- case 'ArrowRight':
174
- __classPrivateFieldGet(this, _SkyTokensComponent__messageStream, "f").next({
175
- type: SkyTokensMessageType.FocusNextToken,
176
- });
177
- event.preventDefault();
178
- break;
179
- }
180
- }
181
- }
182
- selectToken(token) {
183
- if (!this.disabled) {
184
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_notifyTokenSelected).call(this, token);
185
- }
186
- }
187
- removeToken(token) {
188
- this.tokens = this.tokens.filter((t) => t !== token);
189
- __classPrivateFieldGet(this, _SkyTokensComponent_changeDetector, "f").detectChanges();
190
- }
191
- }
192
- _SkyTokensComponent__disabled = new WeakMap(), _SkyTokensComponent__dismissible = new WeakMap(), _SkyTokensComponent__focusable = new WeakMap(), _SkyTokensComponent__tokens = new WeakMap(), _SkyTokensComponent__displayWith = new WeakMap(), _SkyTokensComponent_messageStreamSub = new WeakMap(), _SkyTokensComponent_ngUnsubscribe = new WeakMap(), _SkyTokensComponent_changeDetector = new WeakMap(), _SkyTokensComponent__activeIndex = new WeakMap(), _SkyTokensComponent__messageStream = new WeakMap(), _SkyTokensComponent_instances = new WeakSet(), _SkyTokensComponent_focusPreviousToken = function _SkyTokensComponent_focusPreviousToken() {
193
- this.activeIndex--;
194
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusActiveToken).call(this);
195
- }, _SkyTokensComponent_focusNextToken = function _SkyTokensComponent_focusNextToken() {
196
- this.activeIndex++;
197
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusActiveToken).call(this);
198
- }, _SkyTokensComponent_focusLastToken = function _SkyTokensComponent_focusLastToken() {
199
- if (this.tokenComponents) {
200
- this.activeIndex = this.tokenComponents.length - 1;
201
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusActiveToken).call(this);
202
- }
203
- }, _SkyTokensComponent_focusActiveToken = function _SkyTokensComponent_focusActiveToken() {
204
- if (this.tokenComponents) {
205
- const tokenComponent = this.tokenComponents.find((_comp, i) => {
206
- return this.activeIndex === i;
207
- });
208
- if (tokenComponent) {
209
- tokenComponent.focusElement();
210
- }
211
- }
212
- }, _SkyTokensComponent_removeActiveToken = function _SkyTokensComponent_removeActiveToken() {
213
- const token = this.tokens[this.activeIndex];
214
- if (token) {
215
- this.removeToken(token);
216
- }
217
- }, _SkyTokensComponent_initMessageStream = function _SkyTokensComponent_initMessageStream() {
218
- if (__classPrivateFieldGet(this, _SkyTokensComponent_messageStreamSub, "f")) {
219
- __classPrivateFieldGet(this, _SkyTokensComponent_messageStreamSub, "f").unsubscribe();
220
- }
221
- __classPrivateFieldSet(this, _SkyTokensComponent_messageStreamSub, this.messageStream
222
- .pipe(takeUntil(__classPrivateFieldGet(this, _SkyTokensComponent_ngUnsubscribe, "f")))
223
- .subscribe((message) => {
224
- switch (message.type) {
225
- case SkyTokensMessageType.FocusLastToken:
226
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusLastToken).call(this);
227
- break;
228
- case SkyTokensMessageType.FocusActiveToken:
229
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusActiveToken).call(this);
230
- break;
231
- case SkyTokensMessageType.FocusPreviousToken:
232
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusPreviousToken).call(this);
233
- break;
234
- case SkyTokensMessageType.FocusNextToken:
235
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_focusNextToken).call(this);
236
- break;
237
- case SkyTokensMessageType.RemoveActiveToken:
238
- __classPrivateFieldGet(this, _SkyTokensComponent_instances, "m", _SkyTokensComponent_removeActiveToken).call(this);
239
- break;
240
- }
241
- }), "f");
242
- }, _SkyTokensComponent_notifyTokenSelected = function _SkyTokensComponent_notifyTokenSelected(token) {
243
- this.tokenSelected.emit({
244
- token,
245
- });
246
- };
247
- SkyTokensComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTokensComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
248
- SkyTokensComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SkyTokensComponent, selector: "sky-tokens", inputs: { disabled: "disabled", dismissible: "dismissible", displayWith: "displayWith", trackWith: "trackWith", focusable: "focusable", tokens: "tokens", messageStream: "messageStream" }, outputs: { focusIndexOverRange: "focusIndexOverRange", focusIndexUnderRange: "focusIndexUnderRange", tokenSelected: "tokenSelected", tokensChange: "tokensChange", tokensRendered: "tokensRendered" }, viewQueries: [{ propertyName: "tokenComponents", predicate: SkyTokenComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"sky-tokens\"\n [@blockAnimationOnLoad]\n [attr.role]=\"tokens.length ? 'grid' : null\"\n>\n <!--\n The role must use square brackets otherwise Angular sets the native 'role'\n attribute as well as the input attribute of the token, which fails accessibility rules.\n -->\n <sky-token\n *ngFor=\"let token of tokens; let i = index; trackBy: trackTokenFn\"\n [@.disabled]=\"!trackWith\"\n [@dismiss]\n [disabled]=\"disabled\"\n [dismissible]=\"dismissible\"\n [focusable]=\"focusable\"\n [role]=\"'row'\"\n (@dismiss.done)=\"animationDone()\"\n (dismiss)=\"removeToken(token)\"\n (click)=\"onTokenClick(token)\"\n (keydown)=\"onTokenKeyDown($event)\"\n (keyup.enter)=\"selectToken(token); $event.preventDefault()\"\n (tokenFocus)=\"activeIndex = i\"\n >\n {{ token.value[displayWith] }}\n </sky-token>\n <div class=\"sky-tokens-content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.sky-tokens{display:flex;flex-wrap:wrap;align-items:baseline;margin:-2px}.sky-tokens .sky-tokens-content,.sky-tokens ::ng-deep sky-token{flex:0 0 auto;display:inline-flex;padding:2px}.sky-tokens .sky-tokens-content{flex-grow:1;flex-basis:0px}.sky-tokens .sky-tokens-content:before{content:\"\\200b\"}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.SkyTokenComponent, selector: "sky-token", inputs: ["disabled", "ariaLabel", "dismissible", "focusable", "role"], outputs: ["dismiss", "tokenFocus"] }], animations: [
249
- trigger('blockAnimationOnLoad', [transition(':enter', [])]),
250
- trigger('dismiss', [
251
- transition(':enter', [
252
- style({
253
- opacity: 0,
254
- width: 0,
255
- }),
256
- animate('150ms ease-in', style({
257
- opacity: 1,
258
- width: '*',
259
- })),
260
- ]),
261
- transition(':leave', [
262
- animate('150ms ease-in', style({
263
- opacity: 0,
264
- width: 0,
265
- })),
266
- ]),
267
- ]),
268
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTokensComponent, decorators: [{
270
- type: Component,
271
- args: [{ selector: 'sky-tokens', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
272
- trigger('blockAnimationOnLoad', [transition(':enter', [])]),
273
- trigger('dismiss', [
274
- transition(':enter', [
275
- style({
276
- opacity: 0,
277
- width: 0,
278
- }),
279
- animate('150ms ease-in', style({
280
- opacity: 1,
281
- width: '*',
282
- })),
283
- ]),
284
- transition(':leave', [
285
- animate('150ms ease-in', style({
286
- opacity: 0,
287
- width: 0,
288
- })),
289
- ]),
290
- ]),
291
- ], template: "<div\n class=\"sky-tokens\"\n [@blockAnimationOnLoad]\n [attr.role]=\"tokens.length ? 'grid' : null\"\n>\n <!--\n The role must use square brackets otherwise Angular sets the native 'role'\n attribute as well as the input attribute of the token, which fails accessibility rules.\n -->\n <sky-token\n *ngFor=\"let token of tokens; let i = index; trackBy: trackTokenFn\"\n [@.disabled]=\"!trackWith\"\n [@dismiss]\n [disabled]=\"disabled\"\n [dismissible]=\"dismissible\"\n [focusable]=\"focusable\"\n [role]=\"'row'\"\n (@dismiss.done)=\"animationDone()\"\n (dismiss)=\"removeToken(token)\"\n (click)=\"onTokenClick(token)\"\n (keydown)=\"onTokenKeyDown($event)\"\n (keyup.enter)=\"selectToken(token); $event.preventDefault()\"\n (tokenFocus)=\"activeIndex = i\"\n >\n {{ token.value[displayWith] }}\n </sky-token>\n <div class=\"sky-tokens-content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.sky-tokens{display:flex;flex-wrap:wrap;align-items:baseline;margin:-2px}.sky-tokens .sky-tokens-content,.sky-tokens ::ng-deep sky-token{flex:0 0 auto;display:inline-flex;padding:2px}.sky-tokens .sky-tokens-content{flex-grow:1;flex-basis:0px}.sky-tokens .sky-tokens-content:before{content:\"\\200b\"}\n"] }]
292
- }], ctorParameters: function () { return []; }, propDecorators: { disabled: [{
293
- type: Input
294
- }], dismissible: [{
295
- type: Input
296
- }], displayWith: [{
297
- type: Input
298
- }], trackWith: [{
299
- type: Input
300
- }], focusable: [{
301
- type: Input
302
- }], tokens: [{
303
- type: Input
304
- }], messageStream: [{
305
- type: Input
306
- }], focusIndexOverRange: [{
307
- type: Output
308
- }], focusIndexUnderRange: [{
309
- type: Output
310
- }], tokenSelected: [{
311
- type: Output
312
- }], tokensChange: [{
313
- type: Output
314
- }], tokensRendered: [{
315
- type: Output
316
- }], tokenComponents: [{
317
- type: ViewChildren,
318
- args: [SkyTokenComponent]
319
- }] } });
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9pbmRpY2F0b3JzL3NyYy9saWIvbW9kdWxlcy90b2tlbnMvdG9rZW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9pbmRpY2F0b3JzL3NyYy9saWIvbW9kdWxlcy90b2tlbnMvdG9rZW5zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFHTixZQUFZLEVBQ1osTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUl0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7OztBQUVuRSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUVwQzs7OztHQUlHO0FBa0NILE1BQU0sT0FBTyxrQkFBa0I7SUFDN0I7Ozs7O09BS0c7SUFDSCxJQUNXLFFBQVEsQ0FBQyxLQUEwQjtRQUM1Qyx1QkFBQSxJQUFJLGlDQUFjLENBQUMsQ0FBQyxLQUFLLE1BQUEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sdUJBQUEsSUFBSSxxQ0FBVyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFD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VUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDbkIsS0FBSyxDQUFDO29DQUNKLE9BQU8sRUFBRSxDQUFDO29DQUNWLEtBQUssRUFBRSxDQUFDO2lDQUNULENBQUM7Z0NBQ0YsT0FBTyxDQUNMLGVBQWUsRUFDZixLQUFLLENBQUM7b0NBQ0osT0FBTyxFQUFFLENBQUM7b0NBQ1YsS0FBSyxFQUFFLEdBQUc7aUNBQ1gsQ0FBQyxDQUNIOzZCQUNGLENBQUM7NEJBQ0YsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDbkIsT0FBTyxDQUNMLGVBQWUsRUFDZixLQUFLLENBQUM7b0NBQ0osT0FBTyxFQUFFLENBQUM7b0NBQ1YsS0FBSyxFQUFFLENBQUM7aUNBQ1QsQ0FBQyxDQUNIOzZCQUNGLENBQUM7eUJBQ0gsQ0FBQztxQkFDSDswRUFVVSxRQUFRO3NCQURsQixLQUFLO2dCQWNLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBY0ssV0FBVztzQkFEckIsS0FBSztnQkFjQyxTQUFTO3NCQURmLEtBQUs7Z0JBVUssU0FBUztzQkFEbkIsS0FBSztnQkFhSyxNQUFNO3NCQURoQixLQUFLO2dCQW1CSyxhQUFhO3NCQUR2QixLQUFLO2dCQWVDLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFRQSxvQkFBb0I7c0JBRDFCLE1BQU07Z0JBT0EsYUFBYTtzQkFEbkIsTUFBTTtnQkFRQSxZQUFZO3NCQURsQixNQUFNO2dCQVFBLGNBQWM7c0JBRHBCLE1BQU07Z0JBOEJBLGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUcmFja0J5RnVuY3Rpb24sXG4gIFZpZXdDaGlsZHJlbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreVRva2VuQ29tcG9uZW50IH0gZnJvbSAnLi90b2tlbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5VG9rZW4gfSBmcm9tICcuL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IFNreVRva2VuU2VsZWN0ZWRFdmVudEFyZ3MgfSBmcm9tICcuL3R5cGVzL3Rva2VuLXNlbGVjdGVkLWV2ZW50LWFyZ3MnO1xuaW1wb3J0IHsgU2t5VG9rZW5zTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvdG9rZW5zLW1lc3NhZ2UnO1xuaW1wb3J0IHsgU2t5VG9rZW5zTWVzc2FnZVR5cGUgfSBmcm9tICcuL3R5cGVzL3Rva2Vucy1tZXNzYWdlLXR5cGUnO1xuXG5jb25zdCBESVNQTEFZX1dJVEhfREVGQVVMVCA9ICduYW1lJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29udGFpbmVyIHRoYXQgZW5hYmxlcyBuYXZpZ2F0aW9uIGJldHdlZW4gdG9rZW5zIHVzaW5nIGtleWJvYXJkIGFycm93IGtleXMuXG4gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggb3RoZXIgY29tcG9uZW50cyB3aGVyZSB0aGUgPGtiZD5UYWI8L2tiZD4ga2V5IGlzXG4gKiByZXNlcnZlZCBmb3Igb3RoZXIgZnVuY3Rpb25zLCBzdWNoIGFzIHRoZSBTS1kgVVggTG9va3VwIGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRva2VucycsXG4gIHRlbXBsYXRlVXJsOiAnLi90b2tlbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90b2tlbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdibG9ja0FuaW1hdGlvbk9uTG9hZCcsIFt0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXSldKSxcbiAgICB0cmlnZ2VyKCdkaXNtaXNzJywgW1xuICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgfSksXG4gICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgJzE1MG1zIGVhc2UtaW4nLFxuICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICB3aWR0aDogJyonLFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAnMTUwbXMgZWFzZS1pbicsXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICBdKSxcbiAgICBdKSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5VG9rZW5zQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgdG9rZW5zIGxpc3QgdG8gcHJldmVudCB1c2VycyBmcm9tIHNlbGVjdGluZyB0b2tlbnMsXG4gICAqIGRpc21pc3NpbmcgdG9rZW5zLCBvciBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGxpc3Qgd2l0aCB0aGUgYXJyb3cga2V5cy4gV2hlbiB0aGUgdG9rZW5zIGxpc3RcbiAgICogaXMgZGlzYWJsZWQsIHVzZXJzIGNhbiBzdGlsbCBwbGFjZSBmb2N1cyBvbiBpdGVtcyBpbiB0aGUgbGlzdCB1c2luZyB0aGUgYFRhYmAga2V5LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19kaXNhYmxlZCA9ICEhdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNfZGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB1c2VycyBjYW4gcmVtb3ZlIGEgdG9rZW4gZnJvbSB0aGUgbGlzdCBieSBzZWxlY3RpbmcgYSB0b2tlbidzIGNsb3NlIGJ1dHRvbi5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNtaXNzaWJsZSh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19kaXNtaXNzaWJsZSA9IHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzbWlzc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19kaXNtaXNzaWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gcHJvcGVydHkgdG8gZGlzcGxheSBmb3IgZWFjaCBpdGVtIGluIHRoZSB0b2tlbnMgbGlzdC5cbiAgICogQGRlZmF1bHQgXCJuYW1lXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGlzcGxheVdpdGgodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19kaXNwbGF5V2l0aCA9IHZhbHVlIHx8IERJU1BMQVlfV0lUSF9ERUZBVUxUO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNwbGF5V2l0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfZGlzcGxheVdpdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRva2VuIHByb3BlcnR5IHRoYXQgcmVwcmVzZW50cyB0aGUgdG9rZW4ncyB1bmlxdWUgaWRlbnRpZmllci4gV2hlbiB0aGlzIHByb3BlcnR5XG4gICAqIGlzIHNldCwgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCB3aGVuIGRpc21pc3NpbmcgdG9rZW5zLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRyYWNrV2l0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHVzZXJzIGNhbiBwbGFjZSBmb2N1cyBvbiB0b2tlbnMgaW4gdGhlIGxpc3QgdXNpbmcgdGhlIGBUYWJgIGtleS5cbiAgICogVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGFiaWxpdHkgb2YgdXNlcnMgdG8gc2VsZWN0IHRva2VucywgZGlzbWlzcyB0b2tlbnMsXG4gICAqIG9yIG5hdmlnYXRlIHRocm91Z2ggdGhlIGxpc3Qgd2l0aCB0aGUgYXJyb3cga2V5cy5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmb2N1c2FibGUodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZm9jdXNhYmxlID0gdmFsdWUgIT09IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldCBmb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19mb2N1c2FibGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIHRva2VucyB0byBpbmNsdWRlIGluIHRoZSBsaXN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB0b2tlbnModmFsdWU6IFNreVRva2VuW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfdG9rZW5zID0gdmFsdWUgfHwgW107XG4gICAgLy8gVGhlIHByZXZpb3VzIGJlaGF2aW9yIHdhcyB0byBzZXQgYHRoaXMuX3Rva2VucyA9IHZhbHVlYCwgdGhlbiBlbWl0IGB0aGlzLl90b2tlbnNgLFxuICAgIC8vIHdoaWNoIHdvdWxkIGVtaXQgYHVuZGVmaW5lZGAgaW5zdGVhZCBvZiBhIGRlZmF1bHQgdmFsdWUgb2YgYFtdYCByZXR1cm5lZCBieSB0aGVcbiAgICAvLyBnZXQgYWNjZXNzb3Igd2hlbiBzZXQgdG8gYHVuZGVmaW5lZGAuIEVtaXR0aW5nIGB2YWx1ZWAgaW5zdGVhZCBvZiBgdGhpcy4jX3Rva2Vuc09yRGVmYXVsdGBcbiAgICAvLyBwcmVzZXJ2ZXMgdGhhdCBiZWhhdmlvci5cbiAgICB0aGlzLnRva2Vuc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9rZW5zKCk6IFNreVRva2VuW10ge1xuICAgIHJldHVybiB0aGlzLiNfdG9rZW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhYmxlIG9mIGBTa3lUb2tlbnNNZXNzYWdlYCB0aGF0IGNhbiBwbGFjZSBmb2N1cyBvbiBhXG4gICAqIHBhcnRpY3VsYXIgdG9rZW4gb3IgcmVtb3ZlIHRoZSBhY3RpdmUgdG9rZW4gZnJvbSB0aGUgbGlzdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWVzc2FnZVN0cmVhbSh2YWx1ZTogU3ViamVjdDxTa3lUb2tlbnNNZXNzYWdlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19tZXNzYWdlU3RyZWFtID0gdmFsdWUgfHwgbmV3IFN1YmplY3Q8U2t5VG9rZW5zTWVzc2FnZT4oKTtcbiAgICB0aGlzLiNpbml0TWVzc2FnZVN0cmVhbSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5VG9rZW5zTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLiNfbWVzc2FnZVN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIG5hdmlnYXRlIHRocm91Z2ggdGhlIHRva2VucyBsaXN0IHdpdGggdGhlIGBUYWJgIGtleVxuICAgKiBhbmQgYXR0ZW1wdCB0byBtb3ZlIHBhc3QgdGhlIGZpbmFsIHRva2VuIGluIHRoZSBsaXN0LlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmb2N1c0luZGV4T3ZlclJhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIG5hdmlnYXRlIHRocm91Z2ggdGhlIHRva2VucyBsaXN0IHdpdGggdGhlIGBUYWJgIGtleVxuICAgKiBhbmQgYXR0ZW1wdCB0byBtb3ZlIGJlZm9yZSB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGxpc3QuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGZvY3VzSW5kZXhVbmRlclJhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCBhIHRva2VuIGluIHRoZSBsaXN0LiBUaGlzIGV2ZW50IGVtaXRzIHRoZSBzZWxlY3RlZCB0b2tlbi5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdG9rZW5TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5VG9rZW5TZWxlY3RlZEV2ZW50QXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdG9rZW5zIGluIHRoZSBsaXN0IGNoYW5nZS5cbiAgICogVGhpcyBldmVudCBlbWl0cyBhbiBhcnJheSBvZiB0aGUgdG9rZW5zIGluIHRoZSB1cGRhdGVkIGxpc3QuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHRva2Vuc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5VG9rZW5bXT4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbGwgYW5pbWF0aW9ucyBvbiB0aGUgdG9rZW5zIGFyZSBjb21wbGV0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHRva2Vuc1JlbmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHB1YmxpYyBnZXQgYWN0aXZlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX2FjdGl2ZUluZGV4O1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmVJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlID49IHRoaXMuI190b2tlbnMubGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuI190b2tlbnMubGVuZ3RoIC0gMTtcbiAgICAgIHRoaXMuZm9jdXNJbmRleE92ZXJSYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdmFsdWUgPSAwO1xuICAgICAgdGhpcy5mb2N1c0luZGV4VW5kZXJSYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgdGhpcy4jX2FjdGl2ZUluZGV4ID0gdmFsdWUgfHwgMDtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja1Rva2VuRm46IFRyYWNrQnlGdW5jdGlvbjxTa3lUb2tlbj47XG5cbiAgI19kaXNhYmxlZCA9IGZhbHNlO1xuICAjX2Rpc21pc3NpYmxlID0gdHJ1ZTtcbiAgI19mb2N1c2FibGUgPSB0cnVlO1xuICAjX3Rva2VuczogU2t5VG9rZW5bXSA9IFtdO1xuICAjX2Rpc3BsYXlXaXRoID0gRElTUExBWV9XSVRIX0RFRkFVTFQ7XG5cbiAgQFZpZXdDaGlsZHJlbihTa3lUb2tlbkNvbXBvbmVudClcbiAgcHVibGljIHRva2VuQ29tcG9uZW50czogUXVlcnlMaXN0PFNreVRva2VuQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICAjbWVzc2FnZVN0cmVhbVN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI2NoYW5nZURldGVjdG9yID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAjX2FjdGl2ZUluZGV4ID0gMDtcbiAgI19tZXNzYWdlU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5VG9rZW5zTWVzc2FnZT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNpbml0TWVzc2FnZVN0cmVhbSgpO1xuXG4gICAgLy8gQW5ndWxhciBjYWxscyB0aGUgdHJhY2tCeSBmdW5jdGlvbiB3aXRob3V0IGFwcGx5aW5nIHRoZSBjb21wb25lbnQgaW5zdGFuY2UncyBzY29wZS5cbiAgICAvLyBVc2UgYSBmYXQtYXJyb3cgZnVuY3Rpb24gc28gdGhlIGN1cnJlbnQgY29tcG9uZW50IGluc3RhbmNlJ3MgdHJhY2tXaXRoIHByb3BlcnR5IGNhblxuICAgIC8vIGJlIHJlZmVyZW5jZWQuXG4gICAgdGhpcy50cmFja1Rva2VuRm4gPSAoX2luZGV4LCBpdGVtKTogdW5rbm93biA9PiB7XG4gICAgICBpZiAodGhpcy50cmFja1dpdGgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWVbdGhpcy50cmFja1dpdGhdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRva2VuQ2xpY2sodG9rZW46IFNreVRva2VuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLiNub3RpZnlUb2tlblNlbGVjdGVkKHRva2VuKTtcbiAgfVxuXG4gIHB1YmxpYyBhbmltYXRpb25Eb25lKCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zUmVuZGVyZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uVG9rZW5LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICBjYXNlICdMZWZ0JzpcbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICB0aGlzLiNfbWVzc2FnZVN0cmVhbS5uZXh0KHtcbiAgICAgICAgICAgIHR5cGU6IFNreVRva2Vuc01lc3NhZ2VUeXBlLkZvY3VzUHJldmlvdXNUb2tlbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ1JpZ2h0JzpcbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgdGhpcy4jX21lc3NhZ2VTdHJlYW0ubmV4dCh7XG4gICAgICAgICAgICB0eXBlOiBTa3lUb2tlbnNNZXNzYWdlVHlwZS5Gb2N1c05leHRUb2tlbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUb2tlbih0b2tlbjogU2t5VG9rZW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuI25vdGlmeVRva2VuU2VsZWN0ZWQodG9rZW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUb2tlbih0b2tlbjogU2t5VG9rZW4pOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IHRoaXMudG9rZW5zLmZpbHRlcigodCkgPT4gdCAhPT0gdG9rZW4pO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gICNmb2N1c1ByZXZpb3VzVG9rZW4oKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVJbmRleC0tO1xuICAgIHRoaXMuI2ZvY3VzQWN0aXZlVG9rZW4oKTtcbiAgfVxuXG4gICNmb2N1c05leHRUb2tlbigpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4Kys7XG4gICAgdGhpcy4jZm9jdXNBY3RpdmVUb2tlbigpO1xuICB9XG5cbiAgI2ZvY3VzTGFzdFRva2VuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRva2VuQ29tcG9uZW50cykge1xuICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMudG9rZW5Db21wb25lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLiNmb2N1c0FjdGl2ZVRva2VuKCk7XG4gICAgfVxuICB9XG5cbiAgI2ZvY3VzQWN0aXZlVG9rZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9rZW5Db21wb25lbnRzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbXBvbmVudCA9IHRoaXMudG9rZW5Db21wb25lbnRzLmZpbmQoXG4gICAgICAgIChfY29tcDogU2t5VG9rZW5Db21wb25lbnQsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUluZGV4ID09PSBpO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAodG9rZW5Db21wb25lbnQpIHtcbiAgICAgICAgdG9rZW5Db21wb25lbnQuZm9jdXNFbGVtZW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZUFjdGl2ZVRva2VuKCk6IHZvaWQge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbnNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB0aGlzLnJlbW92ZVRva2VuKHRva2VuKTtcbiAgICB9XG4gIH1cblxuICAjaW5pdE1lc3NhZ2VTdHJlYW0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI21lc3NhZ2VTdHJlYW1TdWIpIHtcbiAgICAgIHRoaXMuI21lc3NhZ2VTdHJlYW1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLiNtZXNzYWdlU3RyZWFtU3ViID0gdGhpcy5tZXNzYWdlU3RyZWFtXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBTa3lUb2tlbnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBTa3lUb2tlbnNNZXNzYWdlVHlwZS5Gb2N1c0xhc3RUb2tlbjpcbiAgICAgICAgICAgIHRoaXMuI2ZvY3VzTGFzdFRva2VuKCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgU2t5VG9rZW5zTWVzc2FnZVR5cGUuRm9jdXNBY3RpdmVUb2tlbjpcbiAgICAgICAgICAgIHRoaXMuI2ZvY3VzQWN0aXZlVG9rZW4oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBTa3lUb2tlbnNNZXNzYWdlVHlwZS5Gb2N1c1ByZXZpb3VzVG9rZW46XG4gICAgICAgICAgICB0aGlzLiNmb2N1c1ByZXZpb3VzVG9rZW4oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBTa3lUb2tlbnNNZXNzYWdlVHlwZS5Gb2N1c05leHRUb2tlbjpcbiAgICAgICAgICAgIHRoaXMuI2ZvY3VzTmV4dFRva2VuKCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgU2t5VG9rZW5zTWVzc2FnZVR5cGUuUmVtb3ZlQWN0aXZlVG9rZW46XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVBY3RpdmVUb2tlbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgI25vdGlmeVRva2VuU2VsZWN0ZWQodG9rZW46IFNreVRva2VuKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblNlbGVjdGVkLmVtaXQoe1xuICAgICAgdG9rZW4sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktdG9rZW5zXCJcbiAgW0BibG9ja0FuaW1hdGlvbk9uTG9hZF1cbiAgW2F0dHIucm9sZV09XCJ0b2tlbnMubGVuZ3RoID8gJ2dyaWQnIDogbnVsbFwiXG4+XG4gIDwhLS1cbiAgICAgIFRoZSByb2xlIG11c3QgdXNlIHNxdWFyZSBicmFja2V0cyBvdGhlcndpc2UgQW5ndWxhciBzZXRzIHRoZSBuYXRpdmUgJ3JvbGUnXG4gICAgICBhdHRyaWJ1dGUgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYXR0cmlidXRlIG9mIHRoZSB0b2tlbiwgd2hpY2ggZmFpbHMgYWNjZXNzaWJpbGl0eSBydWxlcy5cbiAgICAtLT5cbiAgPHNreS10b2tlblxuICAgICpuZ0Zvcj1cImxldCB0b2tlbiBvZiB0b2tlbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrVG9rZW5GblwiXG4gICAgW0AuZGlzYWJsZWRdPVwiIXRyYWNrV2l0aFwiXG4gICAgW0BkaXNtaXNzXVxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2Rpc21pc3NpYmxlXT1cImRpc21pc3NpYmxlXCJcbiAgICBbZm9jdXNhYmxlXT1cImZvY3VzYWJsZVwiXG4gICAgW3JvbGVdPVwiJ3JvdydcIlxuICAgIChAZGlzbWlzcy5kb25lKT1cImFuaW1hdGlvbkRvbmUoKVwiXG4gICAgKGRpc21pc3MpPVwicmVtb3ZlVG9rZW4odG9rZW4pXCJcbiAgICAoY2xpY2spPVwib25Ub2tlbkNsaWNrKHRva2VuKVwiXG4gICAgKGtleWRvd24pPVwib25Ub2tlbktleURvd24oJGV2ZW50KVwiXG4gICAgKGtleXVwLmVudGVyKT1cInNlbGVjdFRva2VuKHRva2VuKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICh0b2tlbkZvY3VzKT1cImFjdGl2ZUluZGV4ID0gaVwiXG4gID5cbiAgICB7eyB0b2tlbi52YWx1ZVtkaXNwbGF5V2l0aF0gfX1cbiAgPC9za3ktdG9rZW4+XG4gIDxkaXYgY2xhc3M9XCJza3ktdG9rZW5zLWNvbnRlbnRcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=