@ctrl/ngx-emoji-mart 8.1.0 → 9.0.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 (54) hide show
  1. package/README.md +39 -14
  2. package/anchors.component.d.ts +1 -1
  3. package/category.component.d.ts +3 -3
  4. package/esm2022/anchors.component.mjs +100 -0
  5. package/esm2022/category.component.mjs +409 -0
  6. package/esm2022/emoji-frequently.service.mjs +90 -0
  7. package/esm2022/emoji-search.service.mjs +178 -0
  8. package/esm2022/ngx-emoji/emoji.component.mjs +299 -0
  9. package/esm2022/ngx-emoji/emoji.module.mjs +17 -0
  10. package/esm2022/ngx-emoji/emoji.service.mjs +145 -0
  11. package/esm2022/picker.component.mjs +522 -0
  12. package/esm2022/picker.module.mjs +40 -0
  13. package/esm2022/preview.component.mjs +206 -0
  14. package/esm2022/search.component.mjs +175 -0
  15. package/esm2022/skins.component.mjs +107 -0
  16. package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart-ngx-emoji.mjs +81 -68
  17. package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -1
  18. package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart.mjs +327 -261
  19. package/fesm2022/ctrl-ngx-emoji-mart.mjs.map +1 -0
  20. package/ngx-emoji/emoji.component.d.ts +10 -9
  21. package/ngx-emoji/emoji.module.d.ts +1 -2
  22. package/package.json +8 -16
  23. package/picker.component.d.ts +2 -2
  24. package/picker.module.d.ts +1 -4
  25. package/preview.component.d.ts +2 -2
  26. package/search.component.d.ts +1 -1
  27. package/skins.component.d.ts +2 -2
  28. package/esm2020/anchors.component.mjs +0 -83
  29. package/esm2020/category.component.mjs +0 -386
  30. package/esm2020/emoji-frequently.service.mjs +0 -88
  31. package/esm2020/emoji-search.service.mjs +0 -177
  32. package/esm2020/ngx-emoji/emoji.component.mjs +0 -283
  33. package/esm2020/ngx-emoji/emoji.module.mjs +0 -18
  34. package/esm2020/ngx-emoji/emoji.service.mjs +0 -144
  35. package/esm2020/picker.component.mjs +0 -508
  36. package/esm2020/picker.module.mjs +0 -49
  37. package/esm2020/preview.component.mjs +0 -187
  38. package/esm2020/search.component.mjs +0 -165
  39. package/esm2020/skins.component.mjs +0 -108
  40. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs +0 -34325
  41. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +0 -1
  42. package/fesm2015/ctrl-ngx-emoji-mart.mjs +0 -1763
  43. package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +0 -1
  44. package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +0 -1
  45. /package/{esm2020 → esm2022}/ctrl-ngx-emoji-mart.mjs +0 -0
  46. /package/{esm2020 → esm2022}/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs +0 -0
  47. /package/{esm2020 → esm2022}/ngx-emoji/data/categories.mjs +0 -0
  48. /package/{esm2020 → esm2022}/ngx-emoji/data/data.interfaces.mjs +0 -0
  49. /package/{esm2020 → esm2022}/ngx-emoji/data/emojis.mjs +0 -0
  50. /package/{esm2020 → esm2022}/ngx-emoji/data/skins.mjs +0 -0
  51. /package/{esm2020 → esm2022}/ngx-emoji/index.mjs +0 -0
  52. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  53. /package/{esm2020 → esm2022}/svgs/index.mjs +0 -0
  54. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
@@ -1,144 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { emojis } from './data/emojis';
3
- import * as i0 from "@angular/core";
4
- const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
5
- const SKINS = ['1F3FA', '1F3FB', '1F3FC', '1F3FD', '1F3FE', '1F3FF'];
6
- export const DEFAULT_BACKGROUNDFN = (set, sheetSize) => `https://unpkg.com/emoji-datasource-${set}@6.0.1/img/${set}/sheets-256/${sheetSize}.png`;
7
- export class EmojiService {
8
- constructor() {
9
- this.uncompressed = false;
10
- this.names = {};
11
- this.emojis = [];
12
- if (!this.uncompressed) {
13
- this.uncompress(emojis);
14
- this.uncompressed = true;
15
- }
16
- }
17
- uncompress(list) {
18
- this.emojis = list.map(emoji => {
19
- const data = { ...emoji };
20
- if (!data.shortNames) {
21
- data.shortNames = [];
22
- }
23
- data.shortNames.unshift(data.shortName);
24
- data.id = data.shortName;
25
- data.native = this.unifiedToNative(data.unified);
26
- if (!data.skinVariations) {
27
- data.skinVariations = [];
28
- }
29
- if (!data.keywords) {
30
- data.keywords = [];
31
- }
32
- if (!data.emoticons) {
33
- data.emoticons = [];
34
- }
35
- if (!data.hidden) {
36
- data.hidden = [];
37
- }
38
- if (!data.text) {
39
- data.text = '';
40
- }
41
- if (data.obsoletes) {
42
- // get keywords from emoji that it obsoletes since that is shared
43
- const f = list.find(x => x.unified === data.obsoletes);
44
- if (f) {
45
- if (f.keywords) {
46
- data.keywords = [...data.keywords, ...f.keywords, f.shortName];
47
- }
48
- else {
49
- data.keywords = [...data.keywords, f.shortName];
50
- }
51
- }
52
- }
53
- this.names[data.unified] = data;
54
- for (const n of data.shortNames) {
55
- this.names[n] = data;
56
- }
57
- return data;
58
- });
59
- }
60
- getData(emoji, skin, set) {
61
- let emojiData;
62
- if (typeof emoji === 'string') {
63
- const matches = emoji.match(COLONS_REGEX);
64
- if (matches) {
65
- emoji = matches[1];
66
- if (matches[2]) {
67
- skin = parseInt(matches[2], 10);
68
- }
69
- }
70
- if (this.names.hasOwnProperty(emoji)) {
71
- emojiData = this.names[emoji];
72
- }
73
- else {
74
- return null;
75
- }
76
- }
77
- else if (emoji.id) {
78
- emojiData = this.names[emoji.id];
79
- }
80
- else if (emoji.unified) {
81
- emojiData = this.names[emoji.unified.toUpperCase()];
82
- }
83
- if (!emojiData) {
84
- emojiData = emoji;
85
- emojiData.custom = true;
86
- }
87
- const hasSkinVariations = emojiData.skinVariations && emojiData.skinVariations.length;
88
- if (hasSkinVariations && skin && skin > 1 && set) {
89
- emojiData = { ...emojiData };
90
- const skinKey = SKINS[skin - 1];
91
- const variationData = emojiData.skinVariations.find((n) => n.unified.includes(skinKey));
92
- if (!variationData.hidden || !variationData.hidden.includes(set)) {
93
- emojiData.skinTone = skin;
94
- emojiData = { ...emojiData, ...variationData };
95
- }
96
- emojiData.native = this.unifiedToNative(emojiData.unified);
97
- }
98
- emojiData.set = set || '';
99
- return emojiData;
100
- }
101
- unifiedToNative(unified) {
102
- const codePoints = unified.split('-').map(u => parseInt(`0x${u}`, 16));
103
- return String.fromCodePoint(...codePoints);
104
- }
105
- emojiSpriteStyles(sheet, set = 'apple', size = 24, sheetSize = 64, sheetRows = 57, backgroundImageFn = DEFAULT_BACKGROUNDFN, sheetColumns = 58, url) {
106
- const hasImageUrl = !!url;
107
- url = url || backgroundImageFn(set, sheetSize);
108
- return {
109
- width: `${size}px`,
110
- height: `${size}px`,
111
- display: 'inline-block',
112
- 'background-image': `url(${url})`,
113
- 'background-size': hasImageUrl ? '100% 100%' : `${100 * sheetColumns}% ${100 * sheetRows}%`,
114
- 'background-position': hasImageUrl ? undefined : this.getSpritePosition(sheet, sheetColumns),
115
- };
116
- }
117
- getSpritePosition(sheet, sheetColumns) {
118
- const [sheetX, sheetY] = sheet;
119
- const multiply = 100 / (sheetColumns - 1);
120
- return `${multiply * sheetX}% ${multiply * sheetY}%`;
121
- }
122
- sanitize(emoji) {
123
- if (emoji === null) {
124
- return null;
125
- }
126
- const id = emoji.id || emoji.shortNames[0];
127
- let colons = `:${id}:`;
128
- if (emoji.skinTone) {
129
- colons += `:skin-tone-${emoji.skinTone}:`;
130
- }
131
- emoji.colons = colons;
132
- return { ...emoji };
133
- }
134
- getSanitizedData(emoji, skin, set) {
135
- return this.sanitize(this.getData(emoji, skin, set));
136
- }
137
- }
138
- EmojiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: EmojiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
139
- EmojiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: EmojiService, providedIn: 'root' });
140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: EmojiService, decorators: [{
141
- type: Injectable,
142
- args: [{ providedIn: 'root' }]
143
- }], ctorParameters: function () { return []; } });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcGlja2VyL25neC1lbW9qaS9lbW9qaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHdkMsTUFBTSxZQUFZLEdBQUcsMkNBQTJDLENBQUM7QUFDakUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQUUsRUFBRSxDQUNyRSxzQ0FBc0MsR0FBRyxjQUFjLEdBQUcsZUFBZSxTQUFTLE1BQU0sQ0FBQztBQUczRixNQUFNLE9BQU8sWUFBWTtJQUt2QjtRQUpBLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFVBQUssR0FBaUMsRUFBRSxDQUFDO1FBQ3pDLFdBQU0sR0FBZ0IsRUFBRSxDQUFDO1FBR3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQTJCO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksR0FBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FB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TSxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsTUFBTSxLQUFLLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQXVCO1FBQzlCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBTSxHQUFHLElBQUksRUFBRSxHQUFHLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxjQUFjLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQztTQUMzQztRQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUF5QixFQUFFLElBQW9CLEVBQUUsR0FBa0I7UUFDbEYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7O3lHQS9KVSxZQUFZOzZHQUFaLFlBQVksY0FEQyxNQUFNOzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcHJlc3NlZEVtb2ppRGF0YSwgRW1vamlEYXRhLCBFbW9qaVZhcmlhdGlvbiB9IGZyb20gJy4vZGF0YS9kYXRhLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgZW1vamlzIH0gZnJvbSAnLi9kYXRhL2Vtb2ppcyc7XG5pbXBvcnQgeyBFbW9qaSB9IGZyb20gJy4vZW1vamkuY29tcG9uZW50JztcblxuY29uc3QgQ09MT05TX1JFR0VYID0gL14oPzpcXDooW15cXDpdKylcXDopKD86XFw6c2tpbi10b25lLShcXGQpXFw6KT8kLztcbmNvbnN0IFNLSU5TID0gWycxRjNGQScsICcxRjNGQicsICcxRjNGQycsICcxRjNGRCcsICcxRjNGRScsICcxRjNGRiddO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFDS0dST1VOREZOID0gKHNldDogc3RyaW5nLCBzaGVldFNpemU6IG51bWJlcikgPT5cbiAgYGh0dHBzOi8vdW5wa2cuY29tL2Vtb2ppLWRhdGFzb3VyY2UtJHtzZXR9QDYuMC4xL2ltZy8ke3NldH0vc2hlZXRzLTI1Ni8ke3NoZWV0U2l6ZX0ucG5nYDtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBFbW9qaVNlcnZpY2Uge1xuICB1bmNvbXByZXNzZWQgPSBmYWxzZTtcbiAgbmFtZXM6IHsgW2tleTogc3RyaW5nXTogRW1vamlEYXRhIH0gPSB7fTtcbiAgZW1vamlzOiBFbW9qaURhdGFbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy51bmNvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMudW5jb21wcmVzcyhlbW9qaXMpO1xuICAgICAgdGhpcy51bmNvbXByZXNzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVuY29tcHJlc3MobGlzdDogQ29tcHJlc3NlZEVtb2ppRGF0YVtdKSB7XG4gICAgdGhpcy5lbW9qaXMgPSBsaXN0Lm1hcChlbW9qaSA9PiB7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSB7IC4uLmVtb2ppIH07XG4gICAgICBpZiAoIWRhdGEuc2hvcnROYW1lcykge1xuICAgICAgICBkYXRhLnNob3J0TmFtZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc2hvcnROYW1lcy51bnNoaWZ0KGRhdGEuc2hvcnROYW1lKTtcbiAgICAgIGRhdGEuaWQgPSBkYXRhLnNob3J0TmFtZTtcbiAgICAgIGRhdGEubmF0aXZlID0gdGhpcy51bmlmaWVkVG9OYXRpdmUoZGF0YS51bmlmaWVkKTtcblxuICAgICAgaWYgKCFkYXRhLnNraW5WYXJpYXRpb25zKSB7XG4gICAgICAgIGRhdGEuc2tpblZhcmlhdGlvbnMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLmtleXdvcmRzKSB7XG4gICAgICAgIGRhdGEua2V5d29yZHMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLmVtb3RpY29ucykge1xuICAgICAgICBkYXRhLmVtb3RpY29ucyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGEuaGlkZGVuKSB7XG4gICAgICAgIGRhdGEuaGlkZGVuID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS50ZXh0KSB7XG4gICAgICAgIGRhdGEudGV4dCA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5vYnNvbGV0ZXMpIHtcbiAgICAgICAgLy8gZ2V0IGtleXdvcmRzIGZyb20gZW1vamkgdGhhdCBpdCBvYnNvbGV0ZXMgc2luY2UgdGhhdCBpcyBzaGFyZWRcbiAgICAgICAgY29uc3QgZiA9IGxpc3QuZmluZCh4ID0+IHgudW5pZmllZCA9PT0gZGF0YS5vYnNvbGV0ZXMpO1xuICAgICAgICBpZiAoZikge1xuICAgICAgICAgIGlmIChmLmtleXdvcmRzKSB7XG4gICAgICAgICAgICBkYXRhLmtleXdvcmRzID0gWy4uLmRhdGEua2V5d29yZHMsIC4uLmYua2V5d29yZHMsIGYuc2hvcnROYW1lXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YS5rZXl3b3JkcyA9IFsuLi5kYXRhLmtleXdvcmRzLCBmLnNob3J0TmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFtZXNbZGF0YS51bmlmaWVkXSA9IGRhdGE7XG4gICAgICBmb3IgKGNvbnN0IG4gb2YgZGF0YS5zaG9ydE5hbWVzKSB7XG4gICAgICAgIHRoaXMubmFtZXNbbl0gPSBkYXRhO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhKGVtb2ppOiBFbW9qaURhdGEgfCBzdHJpbmcsIHNraW4/OiBFbW9qaVsnc2tpbiddLCBzZXQ/OiBFbW9qaVsnc2V0J10pOiBFbW9qaURhdGEgfCBudWxsIHtcbiAgICBsZXQgZW1vamlEYXRhOiBhbnk7XG5cbiAgICBpZiAodHlwZW9mIGVtb2ppID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGVtb2ppLm1hdGNoKENPTE9OU19SRUdFWCk7XG5cbiAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIGVtb2ppID0gbWF0Y2hlc1sxXTtcblxuICAgICAgICBpZiAobWF0Y2hlc1syXSkge1xuICAgICAgICAgIHNraW4gPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCkgYXMgRW1vamlbJ3NraW4nXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmFtZXMuaGFzT3duUHJvcGVydHkoZW1vamkpKSB7XG4gICAgICAgIGVtb2ppRGF0YSA9IHRoaXMubmFtZXNbZW1vamldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbW9qaS5pZCkge1xuICAgICAgZW1vamlEYXRhID0gdGhpcy5uYW1lc1tlbW9qaS5pZF07XG4gICAgfSBlbHNlIGlmIChlbW9qaS51bmlmaWVkKSB7XG4gICAgICBlbW9qaURhdGEgPSB0aGlzLm5hbWVzW2Vtb2ppLnVuaWZpZWQudG9VcHBlckNhc2UoKV07XG4gICAgfVxuXG4gICAgaWYgKCFlbW9qaURhdGEpIHtcbiAgICAgIGVtb2ppRGF0YSA9IGVtb2ppO1xuICAgICAgZW1vamlEYXRhLmN1c3RvbSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU2tpblZhcmlhdGlvbnMgPSBlbW9qaURhdGEuc2tpblZhcmlhdGlvbnMgJiYgZW1vamlEYXRhLnNraW5WYXJpYXRpb25zLmxlbmd0aDtcbiAgICBpZiAoaGFzU2tpblZhcmlhdGlvbnMgJiYgc2tpbiAmJiBza2luID4gMSAmJiBzZXQpIHtcbiAgICAgIGVtb2ppRGF0YSA9IHsgLi4uZW1vamlEYXRhIH07XG5cbiAgICAgIGNvbnN0IHNraW5LZXkgPSBTS0lOU1tza2luIC0gMV07XG4gICAgICBjb25zdCB2YXJpYXRpb25EYXRhID0gZW1vamlEYXRhLnNraW5WYXJpYXRpb25zLmZpbmQoKG46IEVtb2ppVmFyaWF0aW9uKSA9PlxuICAgICAgICBuLnVuaWZpZWQuaW5jbHVkZXMoc2tpbktleSksXG4gICAgICApO1xuXG4gICAgICBpZiAoIXZhcmlhdGlvbkRhdGEuaGlkZGVuIHx8ICF2YXJpYXRpb25EYXRhLmhpZGRlbi5pbmNsdWRlcyhzZXQpKSB7XG4gICAgICAgIGVtb2ppRGF0YS5za2luVG9uZSA9IHNraW47XG4gICAgICAgIGVtb2ppRGF0YSA9IHsgLi4uZW1vamlEYXRhLCAuLi52YXJpYXRpb25EYXRhIH07XG4gICAgICB9XG4gICAgICBlbW9qaURhdGEubmF0aXZlID0gdGhpcy51bmlmaWVkVG9OYXRpdmUoZW1vamlEYXRhLnVuaWZpZWQpO1xuICAgIH1cblxuICAgIGVtb2ppRGF0YS5zZXQgPSBzZXQgfHwgJyc7XG4gICAgcmV0dXJuIGVtb2ppRGF0YSBhcyBFbW9qaURhdGE7XG4gIH1cblxuICB1bmlmaWVkVG9OYXRpdmUodW5pZmllZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29kZVBvaW50cyA9IHVuaWZpZWQuc3BsaXQoJy0nKS5tYXAodSA9PiBwYXJzZUludChgMHgke3V9YCwgMTYpKTtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cyk7XG4gIH1cblxuICBlbW9qaVNwcml0ZVN0eWxlcyhcbiAgICBzaGVldDogRW1vamlEYXRhWydzaGVldCddLFxuICAgIHNldDogRW1vamlbJ3NldCddID0gJ2FwcGxlJyxcbiAgICBzaXplOiBFbW9qaVsnc2l6ZSddID0gMjQsXG4gICAgc2hlZXRTaXplOiBFbW9qaVsnc2hlZXRTaXplJ10gPSA2NCxcbiAgICBzaGVldFJvd3M6IEVtb2ppWydzaGVldFJvd3MnXSA9IDU3LFxuICAgIGJhY2tncm91bmRJbWFnZUZuOiBFbW9qaVsnYmFja2dyb3VuZEltYWdlRm4nXSA9IERFRkFVTFRfQkFDS0dST1VOREZOLFxuICAgIHNoZWV0Q29sdW1ucyA9IDU4LFxuICAgIHVybD86IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgaGFzSW1hZ2VVcmwgPSAhIXVybDtcbiAgICB1cmwgPSB1cmwgfHwgYmFja2dyb3VuZEltYWdlRm4oc2V0LCBzaGVldFNpemUpO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogYCR7c2l6ZX1weGAsXG4gICAgICBoZWlnaHQ6IGAke3NpemV9cHhgLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAnYmFja2dyb3VuZC1pbWFnZSc6IGB1cmwoJHt1cmx9KWAsXG4gICAgICAnYmFja2dyb3VuZC1zaXplJzogaGFzSW1hZ2VVcmwgPyAnMTAwJSAxMDAlJyA6IGAkezEwMCAqIHNoZWV0Q29sdW1uc30lICR7MTAwICogc2hlZXRSb3dzfSVgLFxuICAgICAgJ2JhY2tncm91bmQtcG9zaXRpb24nOiBoYXNJbWFnZVVybCA/IHVuZGVmaW5lZCA6IHRoaXMuZ2V0U3ByaXRlUG9zaXRpb24oc2hlZXQsIHNoZWV0Q29sdW1ucyksXG4gICAgfTtcbiAgfVxuXG4gIGdldFNwcml0ZVBvc2l0aW9uKHNoZWV0OiBFbW9qaURhdGFbJ3NoZWV0J10sIHNoZWV0Q29sdW1uczogbnVtYmVyKSB7XG4gICAgY29uc3QgW3NoZWV0WCwgc2hlZXRZXSA9IHNoZWV0O1xuICAgIGNvbnN0IG11bHRpcGx5ID0gMTAwIC8gKHNoZWV0Q29sdW1ucyAtIDEpO1xuICAgIHJldHVybiBgJHttdWx0aXBseSAqIHNoZWV0WH0lICR7bXVsdGlwbHkgKiBzaGVldFl9JWA7XG4gIH1cblxuICBzYW5pdGl6ZShlbW9qaTogRW1vamlEYXRhIHwgbnVsbCk6IEVtb2ppRGF0YSB8IG51bGwge1xuICAgIGlmIChlbW9qaSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gZW1vamkuaWQgfHwgZW1vamkuc2hvcnROYW1lc1swXTtcbiAgICBsZXQgY29sb25zID0gYDoke2lkfTpgO1xuICAgIGlmIChlbW9qaS5za2luVG9uZSkge1xuICAgICAgY29sb25zICs9IGA6c2tpbi10b25lLSR7ZW1vamkuc2tpblRvbmV9OmA7XG4gICAgfVxuICAgIGVtb2ppLmNvbG9ucyA9IGNvbG9ucztcbiAgICByZXR1cm4geyAuLi5lbW9qaSB9O1xuICB9XG5cbiAgZ2V0U2FuaXRpemVkRGF0YShlbW9qaTogc3RyaW5nIHwgRW1vamlEYXRhLCBza2luPzogRW1vamlbJ3NraW4nXSwgc2V0PzogRW1vamlbJ3NldCddKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemUodGhpcy5nZXREYXRhKGVtb2ppLCBza2luLCBzZXQpKTtcbiAgfVxufVxuIl19