@ctrl/ngx-emoji-mart 5.1.2 → 6.1.1
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.
- package/README.md +11 -19
- package/anchors.component.d.ts +3 -0
- package/category.component.d.ts +7 -2
- package/ctrl-ngx-emoji-mart.d.ts +1 -0
- package/emoji-frequently.service.d.ts +3 -0
- package/emoji-search.service.d.ts +3 -0
- package/esm2020/anchors.component.mjs +83 -0
- package/esm2020/category.component.mjs +386 -0
- package/{esm2015/ctrl-ngx-emoji-mart.js → esm2020/ctrl-ngx-emoji-mart.mjs} +0 -0
- package/{esm2015/emoji-frequently.service.js → esm2020/emoji-frequently.service.mjs} +10 -8
- package/esm2020/emoji-search.service.mjs +177 -0
- package/{esm2015/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.js → esm2020/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs} +0 -0
- package/{esm2015/ngx-emoji/data/categories.js → esm2020/ngx-emoji/data/categories.mjs} +4 -4
- package/{esm2015/ngx-emoji/data/data.interfaces.js → esm2020/ngx-emoji/data/data.interfaces.mjs} +0 -0
- package/esm2020/ngx-emoji/data/emojis.mjs +29543 -0
- package/{esm2015/ngx-emoji/data/skins.js → esm2020/ngx-emoji/data/skins.mjs} +0 -0
- package/esm2020/ngx-emoji/emoji.component.mjs +236 -0
- package/esm2020/ngx-emoji/emoji.module.mjs +18 -0
- package/esm2020/ngx-emoji/emoji.service.mjs +144 -0
- package/{esm2015/ngx-emoji/index.js → esm2020/ngx-emoji/index.mjs} +0 -0
- package/esm2020/picker.component.mjs +505 -0
- package/esm2020/picker.module.mjs +49 -0
- package/esm2020/preview.component.mjs +187 -0
- package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
- package/esm2020/search.component.mjs +165 -0
- package/esm2020/skins.component.mjs +108 -0
- package/esm2020/svgs/index.mjs +18 -0
- package/{esm2015/utils/index.js → esm2020/utils/index.mjs} +0 -0
- package/fesm2015/{ctrl-ngx-emoji-mart-ngx-emoji.js → ctrl-ngx-emoji-mart-ngx-emoji.mjs} +24809 -18497
- package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
- package/fesm2015/{ctrl-ngx-emoji-mart.js → ctrl-ngx-emoji-mart.mjs} +676 -329
- package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +1 -0
- package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs +31829 -0
- package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
- package/fesm2020/ctrl-ngx-emoji-mart.mjs +1757 -0
- package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +1 -0
- package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts +1 -0
- package/ngx-emoji/emoji.component.d.ts +3 -0
- package/ngx-emoji/emoji.module.d.ts +6 -0
- package/ngx-emoji/emoji.service.d.ts +3 -0
- package/ngx-emoji/package.json +6 -7
- package/package.json +29 -10
- package/picker.component.d.ts +3 -0
- package/picker.css +0 -1
- package/picker.module.d.ts +13 -0
- package/preview.component.d.ts +4 -1
- package/search.component.d.ts +3 -0
- package/skins.component.d.ts +6 -3
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js +0 -25822
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js.map +0 -1
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js +0 -2
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js.map +0 -1
- package/bundles/ctrl-ngx-emoji-mart.umd.js +0 -1695
- package/bundles/ctrl-ngx-emoji-mart.umd.js.map +0 -1
- package/bundles/ctrl-ngx-emoji-mart.umd.min.js +0 -2
- package/bundles/ctrl-ngx-emoji-mart.umd.min.js.map +0 -1
- package/ctrl-ngx-emoji-mart.metadata.json +0 -1
- package/esm2015/anchors.component.js +0 -54
- package/esm2015/category.component.js +0 -276
- package/esm2015/emoji-search.service.js +0 -179
- package/esm2015/ngx-emoji/data/emojis.js +0 -23289
- package/esm2015/ngx-emoji/emoji.component.js +0 -174
- package/esm2015/ngx-emoji/emoji.module.js +0 -13
- package/esm2015/ngx-emoji/emoji.service.js +0 -143
- package/esm2015/picker.component.js +0 -459
- package/esm2015/picker.module.js +0 -34
- package/esm2015/preview.component.js +0 -113
- package/esm2015/search.component.js +0 -115
- package/esm2015/skins.component.js +0 -76
- package/esm2015/svgs/index.js +0 -18
- package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js.map +0 -1
- package/fesm2015/ctrl-ngx-emoji-mart.js.map +0 -1
- package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.metadata.json +0 -1
package/README.md
CHANGED
@@ -8,16 +8,7 @@
|
|
8
8
|
|
9
9
|
**DEMO**: https://ngx-emoji-mart.vercel.app
|
10
10
|
|
11
|
-
This project is a port of [emoji-mart](https://github.com/missive/emoji-mart) by missive
|
12
|
-
|
13
|
-
- [Installation](#installation)
|
14
|
-
- [Components](#components)
|
15
|
-
- [Picker](#picker)
|
16
|
-
- [Emoji](#emoji)
|
17
|
-
- [Custom emojis](#custom-emojis)
|
18
|
-
- [Headless search](#headless-search)
|
19
|
-
- [Storage](#storage)
|
20
|
-
- [Features](#features)
|
11
|
+
This project is a port of [emoji-mart](https://github.com/missive/emoji-mart) by missive.
|
21
12
|
|
22
13
|
## Installation
|
23
14
|
|
@@ -29,12 +20,13 @@ npm install @ctrl/ngx-emoji-mart
|
|
29
20
|
|
30
21
|
Latest version available for each version of Angular
|
31
22
|
|
32
|
-
| @ctrl/ngx-emoji-mart | Angular
|
33
|
-
| -------------------- |
|
34
|
-
| 0.17.0 | 6.x 7.x
|
35
|
-
| 1.0.6 | 8.x
|
36
|
-
| 3.1.0 | 9.x
|
37
|
-
|
|
23
|
+
| @ctrl/ngx-emoji-mart | Angular |
|
24
|
+
| -------------------- | --------- |
|
25
|
+
| 0.17.0 | 6.x 7.x |
|
26
|
+
| 1.0.6 | 8.x |
|
27
|
+
| 3.1.0 | 9.x |
|
28
|
+
| 5.1.2 | 10.x 11.x |
|
29
|
+
| current | >= 12.x |
|
38
30
|
|
39
31
|
## Components
|
40
32
|
|
@@ -109,7 +101,7 @@ use component
|
|
109
101
|
| **useButton** | `false` | Uses button elements for emoji instead of spans |
|
110
102
|
| **enableFrequentEmojiSort** | `false` | Enables re-sorting of emoji on click |
|
111
103
|
| **virtualize** | `false` | Enables experimental virtualized rendering to render only emoji categories in view |
|
112
|
-
| **virtualizeOffset** | `0` | use with virtualize option to add or subtract the amount of pixels used to determine whether or not render the category
|
104
|
+
| **virtualizeOffset** | `0` | use with virtualize option to add or subtract the amount of pixels used to determine whether or not render the category |
|
113
105
|
|
114
106
|
#### I18n
|
115
107
|
|
@@ -214,7 +206,7 @@ import { EmojiModule } from '@ctrl/ngx-emoji-mart/ngx-emoji';
|
|
214
206
|
```
|
215
207
|
|
216
208
|
| Prop | Required | Default | Description |
|
217
|
-
| -------------------------------------------- | :------: | ------------------------- |
|
209
|
+
| -------------------------------------------- | :------: | ------------------------- | ------------------------------------------------------------------------------ |
|
218
210
|
| **emoji** | ✓ | | Either a string or an `emoji` object |
|
219
211
|
| **size** | ✓ | | The emoji width and height. |
|
220
212
|
| **isNative** | | `false` | Renders the native unicode emoji |
|
@@ -264,7 +256,7 @@ const customEmojis = [
|
|
264
256
|
text: '',
|
265
257
|
emoticons: [],
|
266
258
|
keywords: ['test', 'flag'],
|
267
|
-
spriteUrl: 'https://unpkg.com/emoji-datasource-twitter@6.0.
|
259
|
+
spriteUrl: 'https://unpkg.com/emoji-datasource-twitter@6.0.1/img/twitter/sheets-256/64.png',
|
268
260
|
sheet_x: 1,
|
269
261
|
sheet_y: 1,
|
270
262
|
size: 64,
|
package/anchors.component.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import { EventEmitter } from '@angular/core';
|
2
2
|
import { EmojiCategory } from '@ctrl/ngx-emoji-mart/ngx-emoji';
|
3
|
+
import * as i0 from "@angular/core";
|
3
4
|
export declare class AnchorsComponent {
|
4
5
|
categories: EmojiCategory[];
|
5
6
|
color?: string;
|
@@ -14,4 +15,6 @@ export declare class AnchorsComponent {
|
|
14
15
|
}>;
|
15
16
|
trackByFn(idx: number, cat: EmojiCategory): string;
|
16
17
|
handleClick($event: Event, index: number): void;
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AnchorsComponent, never>;
|
19
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AnchorsComponent, "emoji-mart-anchors", never, { "categories": "categories"; "color": "color"; "selected": "selected"; "i18n": "i18n"; "icons": "icons"; }, { "anchorClick": "anchorClick"; }, never, never>;
|
17
20
|
}
|
package/category.component.d.ts
CHANGED
@@ -2,11 +2,12 @@ import { Emoji, EmojiService } from '@ctrl/ngx-emoji-mart/ngx-emoji';
|
|
2
2
|
import { AfterViewInit, ChangeDetectorRef, ElementRef, OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
3
3
|
import { Observable } from 'rxjs';
|
4
4
|
import { EmojiFrequentlyService } from './emoji-frequently.service';
|
5
|
+
import * as i0 from "@angular/core";
|
5
6
|
export declare class CategoryComponent implements OnChanges, OnInit, AfterViewInit {
|
6
7
|
ref: ChangeDetectorRef;
|
7
8
|
private emojiService;
|
8
9
|
private frequently;
|
9
|
-
emojis
|
10
|
+
emojis: any[] | null;
|
10
11
|
hasStickyPosition: boolean;
|
11
12
|
name: string;
|
12
13
|
perLine: number;
|
@@ -35,6 +36,7 @@ export declare class CategoryComponent implements OnChanges, OnInit, AfterViewIn
|
|
35
36
|
container: ElementRef;
|
36
37
|
label: ElementRef;
|
37
38
|
containerStyles: any;
|
39
|
+
emojisToDisplay: any[];
|
38
40
|
private filteredEmojisSubject;
|
39
41
|
filteredEmojis$: Observable<any[] | null | undefined>;
|
40
42
|
labelStyles: any;
|
@@ -48,10 +50,13 @@ export declare class CategoryComponent implements OnChanges, OnInit, AfterViewIn
|
|
48
50
|
ngOnInit(): void;
|
49
51
|
ngOnChanges(changes: SimpleChanges): void;
|
50
52
|
ngAfterViewInit(): void;
|
53
|
+
get noEmojiToDisplay(): boolean;
|
51
54
|
memoizeSize(): void;
|
52
55
|
handleScroll(scrollTop: number): boolean;
|
53
|
-
|
56
|
+
updateRecentEmojis(): void;
|
54
57
|
updateDisplay(display: 'none' | 'block'): void;
|
55
58
|
trackById(index: number, item: any): any;
|
56
59
|
private filterEmojis;
|
60
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CategoryComponent, never>;
|
61
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CategoryComponent, "emoji-category", never, { "emojis": "emojis"; "hasStickyPosition": "hasStickyPosition"; "name": "name"; "perLine": "perLine"; "totalFrequentLines": "totalFrequentLines"; "recent": "recent"; "custom": "custom"; "i18n": "i18n"; "id": "id"; "hideObsolete": "hideObsolete"; "notFoundEmoji": "notFoundEmoji"; "virtualize": "virtualize"; "virtualizeOffset": "virtualizeOffset"; "emojiIsNative": "emojiIsNative"; "emojiSkin": "emojiSkin"; "emojiSize": "emojiSize"; "emojiSet": "emojiSet"; "emojiSheetSize": "emojiSheetSize"; "emojiForceSize": "emojiForceSize"; "emojiTooltip": "emojiTooltip"; "emojiBackgroundImageFn": "emojiBackgroundImageFn"; "emojiImageUrlFn": "emojiImageUrlFn"; "emojiUseButton": "emojiUseButton"; }, { "emojiOver": "emojiOver"; "emojiLeave": "emojiLeave"; "emojiClick": "emojiClick"; }, never, never>;
|
57
62
|
}
|
package/ctrl-ngx-emoji-mart.d.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import { EmojiData } from '@ctrl/ngx-emoji-mart/ngx-emoji';
|
2
|
+
import * as i0 from "@angular/core";
|
2
3
|
export declare class EmojiFrequentlyService {
|
3
4
|
private platformId;
|
4
5
|
NAMESPACE: string;
|
@@ -14,4 +15,6 @@ export declare class EmojiFrequentlyService {
|
|
14
15
|
init(): void;
|
15
16
|
add(emoji: EmojiData): void;
|
16
17
|
get(perLine: number, totalLines: number): any[];
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EmojiFrequentlyService, never>;
|
19
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<EmojiFrequentlyService>;
|
17
20
|
}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { EmojiData, EmojiService } from '@ctrl/ngx-emoji-mart/ngx-emoji';
|
2
|
+
import * as i0 from "@angular/core";
|
2
3
|
export declare class EmojiSearch {
|
3
4
|
private emojiService;
|
4
5
|
originalPool: any;
|
@@ -20,4 +21,6 @@ export declare class EmojiSearch {
|
|
20
21
|
addCustomToPool(custom: any, pool: any): void;
|
21
22
|
search(value: string, emojisToShowFilter?: (x: any) => boolean, maxResults?: number, include?: any[], exclude?: any[], custom?: any[]): EmojiData[] | null;
|
22
23
|
buildSearch(shortNames: string[], name: string, id: string, keywords: string[], emoticons: string[]): string;
|
24
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EmojiSearch, never>;
|
25
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<EmojiSearch>;
|
23
26
|
}
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
2
|
+
import * as i0 from "@angular/core";
|
3
|
+
import * as i1 from "@angular/common";
|
4
|
+
export class AnchorsComponent {
|
5
|
+
constructor() {
|
6
|
+
this.categories = [];
|
7
|
+
this.icons = {};
|
8
|
+
this.anchorClick = new EventEmitter();
|
9
|
+
}
|
10
|
+
trackByFn(idx, cat) {
|
11
|
+
return cat.id;
|
12
|
+
}
|
13
|
+
handleClick($event, index) {
|
14
|
+
this.anchorClick.emit({
|
15
|
+
category: this.categories[index],
|
16
|
+
index,
|
17
|
+
});
|
18
|
+
}
|
19
|
+
}
|
20
|
+
AnchorsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: AnchorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
21
|
+
AnchorsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: AnchorsComponent, selector: "emoji-mart-anchors", inputs: { categories: "categories", color: "color", selected: "selected", i18n: "i18n", icons: "icons" }, outputs: { anchorClick: "anchorClick" }, ngImport: i0, template: `
|
22
|
+
<div class="emoji-mart-anchors">
|
23
|
+
<ng-template ngFor let-category [ngForOf]="categories" let-idx="index" [ngForTrackBy]="trackByFn">
|
24
|
+
<span
|
25
|
+
*ngIf="category.anchor !== false"
|
26
|
+
[attr.title]="i18n.categories[category.id]"
|
27
|
+
(click)="this.handleClick($event, idx)"
|
28
|
+
class="emoji-mart-anchor"
|
29
|
+
[class.emoji-mart-anchor-selected]="category.name === selected"
|
30
|
+
[style.color]="category.name === selected ? color : null"
|
31
|
+
>
|
32
|
+
<div>
|
33
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
|
34
|
+
<path [attr.d]="icons[category.id]" />
|
35
|
+
</svg>
|
36
|
+
</div>
|
37
|
+
<span class="emoji-mart-anchor-bar" [style.background-color]="color"></span>
|
38
|
+
</span>
|
39
|
+
</ng-template>
|
40
|
+
</div>
|
41
|
+
`, isInline: true, directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: AnchorsComponent, decorators: [{
|
43
|
+
type: Component,
|
44
|
+
args: [{
|
45
|
+
selector: 'emoji-mart-anchors',
|
46
|
+
template: `
|
47
|
+
<div class="emoji-mart-anchors">
|
48
|
+
<ng-template ngFor let-category [ngForOf]="categories" let-idx="index" [ngForTrackBy]="trackByFn">
|
49
|
+
<span
|
50
|
+
*ngIf="category.anchor !== false"
|
51
|
+
[attr.title]="i18n.categories[category.id]"
|
52
|
+
(click)="this.handleClick($event, idx)"
|
53
|
+
class="emoji-mart-anchor"
|
54
|
+
[class.emoji-mart-anchor-selected]="category.name === selected"
|
55
|
+
[style.color]="category.name === selected ? color : null"
|
56
|
+
>
|
57
|
+
<div>
|
58
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
|
59
|
+
<path [attr.d]="icons[category.id]" />
|
60
|
+
</svg>
|
61
|
+
</div>
|
62
|
+
<span class="emoji-mart-anchor-bar" [style.background-color]="color"></span>
|
63
|
+
</span>
|
64
|
+
</ng-template>
|
65
|
+
</div>
|
66
|
+
`,
|
67
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
68
|
+
preserveWhitespaces: false,
|
69
|
+
}]
|
70
|
+
}], propDecorators: { categories: [{
|
71
|
+
type: Input
|
72
|
+
}], color: [{
|
73
|
+
type: Input
|
74
|
+
}], selected: [{
|
75
|
+
type: Input
|
76
|
+
}], i18n: [{
|
77
|
+
type: Input
|
78
|
+
}], icons: [{
|
79
|
+
type: Input
|
80
|
+
}], anchorClick: [{
|
81
|
+
type: Output
|
82
|
+
}] } });
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9ycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3BpY2tlci9hbmNob3JzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQzs7O0FBOEJ2QixNQUFNLE9BQU8sZ0JBQWdCO0lBMUI3QjtRQTJCVyxlQUFVLEdBQW9CLEVBQUUsQ0FBQztRQUlqQyxVQUFLLEdBQThCLEVBQUUsQ0FBQztRQUNyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE4QyxDQUFDO0tBV3hGO0lBVEMsU0FBUyxDQUFDLEdBQVcsRUFBRSxHQUFrQjtRQUN2QyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFhLEVBQUUsS0FBYTtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7OzZHQWhCVSxnQkFBZ0I7aUdBQWhCLGdCQUFnQiw2TUF4QmpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVDsyRkFJVSxnQkFBZ0I7a0JBMUI1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQlQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLG1CQUFtQixFQUFFLEtBQUs7aUJBQzNCOzhCQUVVLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW1vamlDYXRlZ29yeSB9IGZyb20gJ0BjdHJsL25neC1lbW9qaS1tYXJ0L25neC1lbW9qaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Vtb2ppLW1hcnQtYW5jaG9ycycsXG4gIHRlbXBsYXRlOiBgXG4gIDxkaXYgY2xhc3M9XCJlbW9qaS1tYXJ0LWFuY2hvcnNcIj5cbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNhdGVnb3J5IFtuZ0Zvck9mXT1cImNhdGVnb3JpZXNcIiBsZXQtaWR4PVwiaW5kZXhcIiBbbmdGb3JUcmFja0J5XT1cInRyYWNrQnlGblwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJjYXRlZ29yeS5hbmNob3IgIT09IGZhbHNlXCJcbiAgICAgICAgW2F0dHIudGl0bGVdPVwiaTE4bi5jYXRlZ29yaWVzW2NhdGVnb3J5LmlkXVwiXG4gICAgICAgIChjbGljayk9XCJ0aGlzLmhhbmRsZUNsaWNrKCRldmVudCwgaWR4KVwiXG4gICAgICAgIGNsYXNzPVwiZW1vamktbWFydC1hbmNob3JcIlxuICAgICAgICBbY2xhc3MuZW1vamktbWFydC1hbmNob3Itc2VsZWN0ZWRdPVwiY2F0ZWdvcnkubmFtZSA9PT0gc2VsZWN0ZWRcIlxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiY2F0ZWdvcnkubmFtZSA9PT0gc2VsZWN0ZWQgPyBjb2xvciA6IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj5cbiAgICAgICAgICAgIDxwYXRoIFthdHRyLmRdPVwiaWNvbnNbY2F0ZWdvcnkuaWRdXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZW1vamktbWFydC1hbmNob3ItYmFyXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29sb3JcIj48L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgQW5jaG9yc0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNhdGVnb3JpZXM6IEVtb2ppQ2F0ZWdvcnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2xvcj86IHN0cmluZztcbiAgQElucHV0KCkgc2VsZWN0ZWQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGkxOG46IGFueTtcbiAgQElucHV0KCkgaWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgQE91dHB1dCgpIGFuY2hvckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNhdGVnb3J5OiBFbW9qaUNhdGVnb3J5LCBpbmRleDogbnVtYmVyIH0+KCk7XG5cbiAgdHJhY2tCeUZuKGlkeDogbnVtYmVyLCBjYXQ6IEVtb2ppQ2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gY2F0LmlkO1xuICB9XG4gIGhhbmRsZUNsaWNrKCRldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmFuY2hvckNsaWNrLmVtaXQoe1xuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcmllc1tpbmRleF0sXG4gICAgICBpbmRleCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|