@datagrok-libraries/bio 0.0.5 → 0.0.9

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/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ src/**/*.d.ts*
package/.eslintrc.json CHANGED
@@ -6,10 +6,14 @@
6
6
  "extends": [
7
7
  "google"
8
8
  ],
9
+ "parser": "@typescript-eslint/parser",
9
10
  "parserOptions": {
10
11
  "ecmaVersion": 12,
11
12
  "sourceType": "module"
12
13
  },
14
+ "plugins": [
15
+ "@typescript-eslint"
16
+ ],
13
17
  "rules": {
14
18
  "indent": [
15
19
  "error",
@@ -19,11 +23,29 @@
19
23
  "error",
20
24
  120
21
25
  ],
26
+ "no-unused-vars": "warn",
22
27
  "require-jsdoc": "off",
23
- "spaced-comment": "off"
24
- },
25
- "parser": "@typescript-eslint/parser",
26
- "plugins": [
27
- "@typescript-eslint"
28
- ]
29
- }
28
+ "spaced-comment": "off",
29
+ "linebreak-style": "off",
30
+ "curly": [
31
+ "error",
32
+ "multi-or-nest",
33
+ "consistent"
34
+ ],
35
+ "brace-style": [
36
+ "error",
37
+ "1tbs",
38
+ {
39
+ "allowSingleLine": true
40
+ }
41
+ ],
42
+ "block-spacing": [2, "always"],
43
+ "comma-dangle": ["error", {
44
+ "arrays": "only-multiline",
45
+ "functions": "never",
46
+ "objects": "only-multiline",
47
+ "imports": "only-multiline"
48
+ }],
49
+ "guard-for-in": "off"
50
+ }
51
+ }
package/detectors.js CHANGED
@@ -1,3 +1,9 @@
1
+ import * as grok from 'datagrok-api/grok';
2
+ import * as ui from 'datagrok-api/ui';
3
+ import * as DG from 'datagrok-api/dg';
4
+ import {Aminoacids} from './src/aminoacids';
5
+ import {Nucleotides} from './src/nucleotides';
6
+
1
7
  /**
2
8
  * The class contains semantic type detectors.
3
9
  * Detectors are functions tagged with `DG.FUNC_TYPES.SEM_TYPE_DETECTOR`.
@@ -6,4 +12,45 @@
6
12
  * Follow this naming convention to ensure that your detectors are properly loaded.
7
13
  */
8
14
  class BioPackageDetectors extends DG.Package {
15
+ //tags: semTypeDetector
16
+ //input: column col
17
+ //output: string semType
18
+ detectNucleotidesSeq(col) {
19
+ const alphabet = Nucleotides.Names + {'-': 'gap'};
20
+ return DG.Detector.sampleCategories(col, (s) => {
21
+ return s.split('').every((n) => n in alphabet);
22
+ }) ? Nucleotides.SemType : null;
23
+ }
24
+
25
+ //tags: semTypeDetector
26
+ //input: column col
27
+ //output: string semType
28
+ detectAminoacidsSeq(col) {
29
+ const alphabet = Aminoacids.Names + {'-': 'gap'};
30
+ return DG.Detector.sampleCategories(col, (s) => {
31
+ return s.split('').every((aa) => aa in alphabet);
32
+ }) ? Aminoacids.SemType : null;
33
+ }
34
+
35
+ //tags: semTypeDetector
36
+ //input: column col
37
+ //output: string semType
38
+ detectMultipleAlignmentNucleotidesSeq(col) {
39
+ const alphabet = Nucleotides.Names + {'-': 'gap'};
40
+ const len = col.get(0).length;
41
+ return DG.Detector.sampleCategories(col, (s) => {
42
+ return s.length == len && s.split('').every((n) => n in alphabet);
43
+ }) ? Nucleotides.SemTypeMultipleAlignment : null;
44
+ }
45
+
46
+ //tags: semTypeDetector
47
+ //input: column col
48
+ //output: string semType
49
+ detectMultipleAlignmentAminoacidsSeq(col) {
50
+ const alphabet = Aminoacids.Names + {'-': 'gap'};
51
+ const len = col.get(0).length;
52
+ return DG.Detector.sampleCategories(col, (s) => {
53
+ return s.length == len && s.split('').every((aa) => aa in alphabet);
54
+ }) ? Aminoacids.SemTypeMultipleAlignment : null;
55
+ }
9
56
  }
package/package.json CHANGED
@@ -5,23 +5,23 @@
5
5
  },
6
6
  "beta": true,
7
7
  "friendlyName": "Datagrok bio library",
8
- "version": "0.0.5",
8
+ "version": "0.0.9",
9
9
  "description": "",
10
+ "main": "src/index.ts",
10
11
  "dependencies": {
11
- "datagrok-api": ">=0.108.0",
12
12
  "@datagrok-libraries/utils": ">=0.0.22",
13
13
  "cash-dom": "latest",
14
- "dayjs": "latest"
14
+ "datagrok-api": ">=0.108.0",
15
+ "dayjs": "latest",
16
+ "rxjs": "^6.5.5"
15
17
  },
16
18
  "devDependencies": {
17
- "typescript": "^4.2.3",
18
- "ts-loader": "^9.2.6",
19
- "webpack": "latest",
20
- "webpack-cli": "latest",
21
19
  "@typescript-eslint/eslint-plugin": "^4.29.1",
22
20
  "@typescript-eslint/parser": "^4.29.1",
23
- "eslint": "^7.32.0",
24
- "eslint-config-google": "^0.14.0"
21
+ "eslint": "latest",
22
+ "eslint-config-google": "latest",
23
+ "ts-loader": "^9.2.6",
24
+ "typescript": "^4.2.3"
25
25
  },
26
26
  "scripts": {
27
27
  "link": "npm link",
@@ -36,7 +36,7 @@
36
36
  "release-bio-public": "grok publish public --rebuild --release",
37
37
  "debug-bio-local": "grok publish local --rebuild",
38
38
  "release-bio-local": "grok publish local --rebuild --release",
39
- "lint": "eslint src --ext .ts",
40
- "lint-fix": "eslint src --ext .ts --fix"
39
+ "lint": "eslint \"./src/**/*.ts\"",
40
+ "lint-fix": "eslint \"./src/**/*.ts\" --fix"
41
41
  }
42
42
  }
@@ -0,0 +1,31 @@
1
+ import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
2
+ import { SeqPalette, SeqPaletteBase } from './seq-palettes';
3
+ export declare class AminoacidsPalettes extends SeqPaletteBase {
4
+ private static lesk;
5
+ static get Lesk(): SeqPalette;
6
+ private static grokGroups;
7
+ static get GrokGroups(): SeqPalette;
8
+ private static rasMol;
9
+ static get RasMol(): SeqPalette;
10
+ }
11
+ export declare class Aminoacids {
12
+ static readonly SemType: string;
13
+ static readonly SemTypeMultipleAlignment: string;
14
+ static undefinedColor: string;
15
+ static Names: StringDictionary;
16
+ static AASmiles: StringDictionary;
17
+ static AASmilesTruncated: StringDictionary;
18
+ /** TODO: Full?
19
+ */
20
+ static AAFullNames: StringDictionary;
21
+ static getPalette(scheme?: string): SeqPalette;
22
+ /**
23
+ * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
24
+ *
25
+ * @param {string} c raw amino
26
+ * @return {[string, string]} outer and inner content
27
+ */
28
+ static getInnerOuter(c: string): [string, string];
29
+ static getColorAAPivot(monomer?: string, scheme?: 'grok'): [string, string, string, number];
30
+ }
31
+ //# sourceMappingURL=aminoacids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aminoacids.d.ts","sourceRoot":"","sources":["aminoacids.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAa;IAEhC,WAAkB,IAAI,IAAI,UAAU,CAWnC;IAED,OAAO,CAAC,MAAM,CAAC,UAAU,CAAa;IAEtC,WAAkB,UAAU,IAAI,UAAU,CAYzC;IAED,OAAO,CAAC,MAAM,CAAC,MAAM,CAAa;IAElC,WAAkB,MAAM,IAAI,UAAU,CA4BrC;CACF;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAgB;IAE/C,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAiC;IAEjF,MAAM,CAAC,cAAc,SAAsB;IAE3C,OAAc,KAAK,EAAE,gBAAgB,CAqBnC;IAEF,OAAc,QAAQ,EAAE,gBAAgB,CAqBtC;IAEF,OAAc,iBAAiB,EAAE,gBAAgB,CAqB/C;IAEF;OACG;IACH,OAAc,WAAW,EAAE,gBAAgB,CAqBzC;WAEY,UAAU,CAAC,MAAM,GAAE,MAAe,GAAG,UAAU;IAW7D;;;;;OAKG;WACW,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;WAmB1C,eAAe,CAAC,OAAO,GAAE,MAAW,EAAE,MAAM,GAAE,MAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;CA6C/G"}
@@ -0,0 +1,226 @@
1
+ import { SeqPaletteBase } from './seq-palettes';
2
+ export class AminoacidsPalettes extends SeqPaletteBase {
3
+ static get Lesk() {
4
+ if (this.lesk === void 0) {
5
+ this.lesk = this.makePalette([
6
+ [['G', 'A', 'S', 'T'], 'orange'],
7
+ [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],
8
+ [['N', 'Q', 'H'], 'magenta'],
9
+ [['D', 'E'], 'red'],
10
+ [['K', 'R'], 'all_blue'],
11
+ ]);
12
+ }
13
+ return this.lesk;
14
+ }
15
+ static get GrokGroups() {
16
+ if (this.grokGroups === void 0) {
17
+ this.grokGroups = this.makePalette([
18
+ [['C', 'U'], 'yellow'],
19
+ [['G', 'P'], 'red'],
20
+ [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],
21
+ [['R', 'H', 'K'], 'light_blue'],
22
+ [['D', 'E'], 'dark_blue'],
23
+ [['S', 'T', 'N', 'Q'], 'orange'],
24
+ ]);
25
+ }
26
+ return this.grokGroups;
27
+ }
28
+ static get RasMol() {
29
+ if (this.rasMol === void 0) {
30
+ this.rasMol = {
31
+ // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm
32
+ 'D': '#E60A0A',
33
+ 'E': '#E60A0A',
34
+ 'C': '#E6E600',
35
+ 'M': '#E6E600',
36
+ 'K': '#145AFF',
37
+ 'R': '#145AFF',
38
+ 'S': '#FA9600',
39
+ 'T': '#FA9600',
40
+ 'F': '#3232AA',
41
+ 'Y': '#3232AA',
42
+ 'N': '#00DCDC',
43
+ 'Q': '#00DCDC',
44
+ 'G': '#EBEBEB',
45
+ 'L': '#0F820F',
46
+ 'V': '#0F820F',
47
+ 'I': '#0F820F',
48
+ 'A': '#C8C8C8',
49
+ 'W': '#B45AB4',
50
+ 'H': '#8282D2',
51
+ 'P': '#DC9682',
52
+ 'others': '#BEA06E',
53
+ };
54
+ }
55
+ return this.rasMol;
56
+ }
57
+ }
58
+ export class Aminoacids {
59
+ static getPalette(scheme = 'grok') {
60
+ switch (scheme) {
61
+ case 'grok':
62
+ return AminoacidsPalettes.GrokGroups;
63
+ case 'lesk':
64
+ return AminoacidsPalettes.Lesk;
65
+ default:
66
+ throw new Error(`ChemPalette: scheme \`${scheme}\` does not exist`);
67
+ }
68
+ }
69
+ /**
70
+ * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
71
+ *
72
+ * @param {string} c raw amino
73
+ * @return {[string, string]} outer and inner content
74
+ */
75
+ static getInnerOuter(c) {
76
+ let isInner = 0;
77
+ let inner = '';
78
+ let outer = '';
79
+ for (const char of c) {
80
+ if (char == '(')
81
+ isInner++;
82
+ else if (char == ')')
83
+ isInner--;
84
+ else if (isInner)
85
+ inner += char;
86
+ else
87
+ outer += char;
88
+ }
89
+ return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];
90
+ }
91
+ static getColorAAPivot(monomer = '', scheme = 'grok') {
92
+ var _a, _b, _c;
93
+ //const chemPaletteInstance = AAPalettes.GrokGroups();
94
+ const chemPaletteInstance = this.getPalette(scheme);
95
+ let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);
96
+ outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);
97
+ innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);
98
+ if (monomer.length == 1 || monomer[1] == '(') {
99
+ const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
100
+ return amino in chemPaletteInstance ?
101
+ [chemPaletteInstance[amino], amino, innerMonomer, 1] :
102
+ [this.undefinedColor, outerMonomer, innerMonomer, 1];
103
+ }
104
+ if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {
105
+ if (monomer.length == 2 || monomer[2] == '(') {
106
+ const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();
107
+ return amino in chemPaletteInstance ?
108
+ [chemPaletteInstance[amino], amino, innerMonomer, 2] :
109
+ [this.undefinedColor, outerMonomer, innerMonomer, 2];
110
+ }
111
+ }
112
+ if (monomer.substring(0, 3) in this.AAFullNames) {
113
+ if (monomer.length == 3 || monomer[3] == '(') {
114
+ const amino = this.AAFullNames[monomer.substring(0, 3)];
115
+ return amino in chemPaletteInstance ?
116
+ [chemPaletteInstance[amino], amino, innerMonomer, 3] :
117
+ [this.undefinedColor, outerMonomer, innerMonomer, 3];
118
+ }
119
+ }
120
+ if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {
121
+ if (monomer.substring(1, 3) in this.AAFullNames) {
122
+ if (monomer.length == 4 || monomer[4] == '(') {
123
+ const amino = this.AAFullNames[monomer.substring(1, 3)];
124
+ return amino in chemPaletteInstance ?
125
+ [chemPaletteInstance[amino], amino, innerMonomer, 4] :
126
+ [this.undefinedColor, outerMonomer, innerMonomer, 4];
127
+ }
128
+ }
129
+ }
130
+ return [this.undefinedColor, outerMonomer, innerMonomer, 0];
131
+ }
132
+ }
133
+ Aminoacids.SemType = 'Aminoacids';
134
+ Aminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';
135
+ Aminoacids.undefinedColor = 'rgb(100,100,100)';
136
+ Aminoacids.Names = {
137
+ 'G': 'Glycine',
138
+ 'L': 'Leucine',
139
+ 'Y': 'Tyrosine',
140
+ 'S': 'Serine',
141
+ 'E': 'Glutamic acid',
142
+ 'Q': 'Glutamine',
143
+ 'D': 'Aspartic acid',
144
+ 'N': 'Asparagine',
145
+ 'F': 'Phenylalanine',
146
+ 'A': 'Alanine',
147
+ 'K': 'Lysine',
148
+ 'R': 'Arginine',
149
+ 'H': 'Histidine',
150
+ 'C': 'Cysteine',
151
+ 'V': 'Valine',
152
+ 'P': 'Proline',
153
+ 'W': 'Tryptophan',
154
+ 'I': 'Isoleucine',
155
+ 'M': 'Methionine',
156
+ 'T': 'Threonine',
157
+ };
158
+ Aminoacids.AASmiles = {
159
+ 'G': 'NCC(=O)O',
160
+ 'L': 'N[C@H](CC(C)C)C(=O)O',
161
+ 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',
162
+ 'S': 'NC(CO)C(=O)O',
163
+ 'E': 'N[C@@H](CCC(O)=O)C(=O)O',
164
+ 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',
165
+ 'D': 'N[C@@H](CC(O)=O)C(=O)O',
166
+ 'N': 'N[C@@H](CC(N)=O)C(=O)O',
167
+ 'F': 'NC(CC1=CC=CC=C1)C(=O)O',
168
+ 'A': 'N[C@H](C)C(=O)O',
169
+ 'K': 'NC(CCCCN)C(=O)O',
170
+ 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',
171
+ 'H': 'NC(CC1=CN=C[N]1)C(=O)O',
172
+ 'C': 'N[C@@H](CS)C(=O)O',
173
+ 'V': 'NC(C(C)C)C(=O)O',
174
+ 'P': 'N(CCC1)C1C(=O)O',
175
+ 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',
176
+ 'I': 'N[C@H]([C@H](C)CC)C(=O)O',
177
+ 'M': 'NC(CCSC)C(=O)O',
178
+ 'T': 'NC(C(O)C)C(=O)O',
179
+ };
180
+ Aminoacids.AASmilesTruncated = {
181
+ 'G': '*C*',
182
+ 'L': 'CC(C)C[C@H](*)*',
183
+ 'Y': 'C1=CC(=CC=C1CC(*)*)O',
184
+ 'S': 'OCC(*)C*',
185
+ 'E': '*[C@@H](CCC(O)=O)*',
186
+ 'Q': '*N[C@@H](CCC(N)=O)*',
187
+ 'D': '*[C@@H](CC(O)=O)*',
188
+ 'N': '*[C@@H](CC(N)=O)*',
189
+ 'F': 'C1=CC=C(C=C1)CC(*)*',
190
+ 'A': 'C[C@H](*)*',
191
+ 'K': 'C(CCN)CC(*)*',
192
+ 'R': '*[C@H](CCCNC(=N)C)*',
193
+ 'H': 'C1=C(NC=N1)CC(*)*',
194
+ 'C': 'C([C@@H](*)*)S',
195
+ 'V': 'CC(C)C(*)*',
196
+ 'P': 'C1CCN(*)C1*',
197
+ 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',
198
+ 'I': 'CC[C@H](C)[C@H](*)*',
199
+ 'M': 'CSCCC(*)*',
200
+ 'T': 'CC(O)C(*)*',
201
+ };
202
+ /** TODO: Full?
203
+ */
204
+ Aminoacids.AAFullNames = {
205
+ 'Ala': 'A',
206
+ 'Arg': 'R',
207
+ 'Asn': 'N',
208
+ 'Asp': 'D',
209
+ 'Cys': 'C',
210
+ 'Gln': 'Q',
211
+ 'Glu': 'E',
212
+ 'Gly': 'G',
213
+ 'His': 'H',
214
+ 'Ile': 'I',
215
+ 'Leu': 'L',
216
+ 'Lys': 'K',
217
+ 'Met': 'M',
218
+ 'Phe': 'F',
219
+ 'Pro': 'P',
220
+ 'Ser': 'S',
221
+ 'Thr': 'T',
222
+ 'Trp': 'W',
223
+ 'Tyr': 'Y',
224
+ 'Val': 'V',
225
+ };
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUlNLE1BQU0sS0FBSyxVQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDO2dCQUN0QixDQUFDLENBQUMsR0FBRyxF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QUFFLGFBQWE7SUFDbEIsR0FBRyxFQUFFLCtCQUErQjtJQUNwQyxHQUFHLEVBQUUscUJBQXFCO0lBQzFCLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxZQUFZO0NBQ2xCLENBQUM7QUFFRjtHQUNHO0FBQ1csc0JBQVcsR0FBcUI7SUFDNUMsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IHtcbiAgICAgICAgLy8gaHR0cDovL2FjY2VzLmVucy1seW9uLmZyL2Jpb3RpYy9yYXN0b3AvaGVscC9jb2xvdXIuaHRtXG4gICAgICAgICdEJzogJyNFNjBBMEEnLCAvLyBhc3AsIGFzcGFydGljIGFjaWQsIGFzcFxuICAgICAgICAnRSc6ICcjRTYwQTBBJywgLy8gZ2x1LCBnbHV0YW1pYyBhY2lkXG4gICAgICAgICdDJzogJyNFNkU2MDAnLCAvLyBjeXMsIGN5c3RlaW5lXG4gICAgICAgICdNJzogJyNFNkU2MDAnLCAvLyBtZXQsIG1ldGhpb25pbmVcbiAgICAgICAgJ0snOiAnIzE0NUFGRicsIC8vIGx5cywgbHlzaW5lXG4gICAgICAgICdSJzogJyMxNDVBRkYnLCAvLyBhcmcsIGFyZ2luaW5lXG4gICAgICAgICdTJzogJyNGQTk2MDAnLCAvLyBzZXIsIHNlcmluZVxuICAgICAgICAnVCc6ICcjRkE5NjAwJywgLy8gdGhyLCB0aHJlb25pbmVcbiAgICAgICAgJ0YnOiAnIzMyMzJBQScsIC8vIHBoZSwgcGhlbnlsYWxhbmluZVxuICAgICAgICAnWSc6ICcjMzIzMkFBJywgLy8gdHlyLCB0eXJvc2luZVxuICAgICAgICAnTic6ICcjMDBEQ0RDJywgLy8gYXNuLCBhc3BhcmFnaW5lXG4gICAgICAgICdRJzogJyMwMERDREMnLCAvLyBnbG4sIGdsdXRhbWluZVxuICAgICAgICAnRyc6ICcjRUJFQkVCJywgLy8gZ2x5LCBnbHljaW5lXG4gICAgICAgICdMJzogJyMwRjgyMEYnLCAvLyBsZXUsIGxldWNpbmVcbiAgICAgICAgJ1YnOiAnIzBGODIwRicsIC8vIHZhbCwgdmFsaW5lXG4gICAgICAgICdJJzogJyMwRjgyMEYnLCAvLyBpbGUsIGlzb2xldWNpbmVcbiAgICAgICAgJ0EnOiAnI0M4QzhDOCcsIC8vIGFsYSwgYWxhbmluZVxuICAgICAgICAnVyc6ICcjQjQ1QUI0JywgLy8gdHJwLCB0cnlwdG9waGFuXG4gICAgICAgICdIJzogJyM4MjgyRDInLCAvLyBoaXMsIGhpc3RpZGluZVxuICAgICAgICAnUCc6ICcjREM5NjgyJywgLy8gcHJvLCBwcm9saW5lXG4gICAgICAgICdvdGhlcnMnOiAnI0JFQTA2RScsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHMge1xuICBzdGF0aWMgcmVhZG9ubHkgU2VtVHlwZTogc3RyaW5nID0gJ0FtaW5vYWNpZHMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdBbWlub2FjaWRzTXVsdGlwbGVBbGlnbm1lbnQnO1xuXG4gIHN0YXRpYyB1bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdHJzogJ0dseWNpbmUnLFxuICAgICdMJzogJ0xldWNpbmUnLFxuICAgICdZJzogJ1R5cm9zaW5lJyxcbiAgICAnUyc6ICdTZXJpbmUnLFxuICAgICdFJzogJ0dsdXRhbWljIGFjaWQnLFxuICAgICdRJzogJ0dsdXRhbWluZScsXG4gICAgJ0QnOiAnQXNwYXJ0aWMgYWNpZCcsXG4gICAgJ04nOiAnQXNwYXJhZ2luZScsXG4gICAgJ0YnOiAnUGhlbnlsYWxhbmluZScsXG4gICAgJ0EnOiAnQWxhbmluZScsXG4gICAgJ0snOiAnTHlzaW5lJyxcbiAgICAnUic6ICdBcmdpbmluZScsXG4gICAgJ0gnOiAnSGlzdGlkaW5lJyxcbiAgICAnQyc6ICdDeXN0ZWluZScsXG4gICAgJ1YnOiAnVmFsaW5lJyxcbiAgICAnUCc6ICdQcm9saW5lJyxcbiAgICAnVyc6ICdUcnlwdG9waGFuJyxcbiAgICAnSSc6ICdJc29sZXVjaW5lJyxcbiAgICAnTSc6ICdNZXRoaW9uaW5lJyxcbiAgICAnVCc6ICdUaHJlb25pbmUnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgQUFTbWlsZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnTkNDKD1PKU8nLFxuICAgICdMJzogJ05bQ0BIXShDQyhDKUMpQyg9TylPJyxcbiAgICAnWSc6ICdOQyhDQzE9Q0M9QyhPKUM9QzEpQyg9TylPJyxcbiAgICAnUyc6ICdOQyhDTylDKD1PKU8nLFxuICAgICdFJzogJ05bQ0BASF0oQ0NDKE8pPU8pQyg9TylPJyxcbiAgICAnUSc6ICdOW0NAQEhdKENDQyhOKT1PKUMoPU8pTycsXG4gICAgJ0QnOiAnTltDQEBIXShDQyhPKT1PKUMoPU8pTycsXG4gICAgJ04nOiAnTltDQEBIXShDQyhOKT1PKUMoPU8pTycsXG4gICAgJ0YnOiAnTkMoQ0MxPUNDPUNDPUMxKUMoPU8pTycsXG4gICAgJ0EnOiAnTltDQEhdKEMpQyg9TylPJyxcbiAgICAnSyc6ICdOQyhDQ0NDTilDKD1PKU8nLFxuICAgICdSJzogJ05bQ0BIXShDQ0NOQyg9TilDKUMoPU8pTycsXG4gICAgJ0gnOiAnTkMoQ0MxPUNOPUNbTl0xKUMoPU8pTycsXG4gICAgJ0MnOiAnTltDQEBIXShDUylDKD1PKU8nLFxuICAgICdWJzogJ05DKEMoQylDKUMoPU8pTycsXG4gICAgJ1AnOiAnTihDQ0MxKUMxQyg9TylPJyxcbiAgICAnVyc6ICdOW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpQyg9TylPJyxcbiAgICAnSSc6ICdOW0NASF0oW0NASF0oQylDQylDKD1PKU8nLFxuICAgICdNJzogJ05DKENDU0MpQyg9TylPJyxcbiAgICAnVCc6ICdOQyhDKE8pQylDKD1PKU8nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgQUFTbWlsZXNUcnVuY2F0ZWQ6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnKkMqJyxcbiAgICAnTCc6ICdDQyhDKUNbQ0BIXSgqKSonLFxuICAgICdZJzogJ0MxPUNDKD1DQz1DMUNDKCopKilPJyxcbiAgICAnUyc6ICdPQ0MoKilDKicsXG4gICAgJ0UnOiAnKltDQEBIXShDQ0MoTyk9TykqJyxcbiAgICAnUSc6ICcqTltDQEBIXShDQ0MoTik9TykqJyxcbiAgICAnRCc6ICcqW0NAQEhdKENDKE8pPU8pKicsXG4gICAgJ04nOiAnKltDQEBIXShDQyhOKT1PKSonLFxuICAgICdGJzogJ0MxPUNDPUMoQz1DMSlDQygqKSonLFxuICAgICdBJzogJ0NbQ0BIXSgqKSonLFxuICAgICdLJzogJ0MoQ0NOKUNDKCopKicsXG4gICAgJ1InOiAnKltDQEhdKENDQ05DKD1OKUMpKicsXG4gICAgJ0gnOiAnQzE9QyhOQz1OMSlDQygqKSonLFxuICAgICdDJzogJ0MoW0NAQEhdKCopKilTJyxcbiAgICAnVic6ICdDQyhDKUMoKikqJyxcbiAgICAnUCc6ICdDMUNDTigqKUMxKicsXG4gICAgJ1cnOiAnKltDQEBIXShDYzFjMmNjY2NjMm4oW0hdKWMxKSonLFxuICAgICdJJzogJ0NDW0NASF0oQylbQ0BIXSgqKSonLFxuICAgICdNJzogJ0NTQ0NDKCopKicsXG4gICAgJ1QnOiAnQ0MoTylDKCopKicsXG4gIH07XG5cbiAgLyoqIFRPRE86IEZ1bGw/XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIEFBRnVsbE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBbGEnOiAnQScsXG4gICAgJ0FyZyc6ICdSJyxcbiAgICAnQXNuJzogJ04nLFxuICAgICdBc3AnOiAnRCcsXG4gICAgJ0N5cyc6ICdDJyxcbiAgICAnR2xuJzogJ1EnLFxuICAgICdHbHUnOiAnRScsXG4gICAgJ0dseSc6ICdHJyxcbiAgICAnSGlzJzogJ0gnLFxuICAgICdJbGUnOiAnSScsXG4gICAgJ0xldSc6ICdMJyxcbiAgICAnTHlzJzogJ0snLFxuICAgICdNZXQnOiAnTScsXG4gICAgJ1BoZSc6ICdGJyxcbiAgICAnUHJvJzogJ1AnLFxuICAgICdTZXInOiAnUycsXG4gICAgJ1Rocic6ICdUJyxcbiAgICAnVHJwJzogJ1cnLFxuICAgICdUeXInOiAnWScsXG4gICAgJ1ZhbCc6ICdWJyxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldFBhbGV0dGUoc2NoZW1lOiBzdHJpbmcgPSAnZ3JvaycpOiBTZXFQYWxldHRlIHtcbiAgICBzd2l0Y2ggKHNjaGVtZSkge1xuICAgIGNhc2UgJ2dyb2snOlxuICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgIGNhc2UgJ2xlc2snOlxuICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5MZXNrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZW1QYWxldHRlOiBzY2hlbWUgXFxgJHtzY2hlbWV9XFxgIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGl2aWRlZCBhbWlubyBhY2lkIHdpdGggaXRzIGNvbnRlbnQgaW4gdGhlIGJyYWNrZXQsIGlmIHRoZSBjb250ZW50IGlzIG51bWJlciwgdGhlbiBpdHMgb21pdHRlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYyByYXcgYW1pbm9cbiAgICogQHJldHVybiB7W3N0cmluZywgc3RyaW5nXX0gb3V0ZXIgYW5kIGlubmVyIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJPdXRlcihjOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBsZXQgaXNJbm5lciA9IDA7XG4gICAgbGV0IGlubmVyID0gJyc7XG4gICAgbGV0IG91dGVyID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYykge1xuICAgICAgaWYgKGNoYXIgPT0gJygnKVxuICAgICAgICBpc0lubmVyKys7XG4gICAgICBlbHNlIGlmIChjaGFyID09ICcpJylcbiAgICAgICAgaXNJbm5lci0tO1xuICAgICAgZWxzZSBpZiAoaXNJbm5lcilcbiAgICAgICAgaW5uZXIgKz0gY2hhcjtcbiAgICAgIGVsc2VcbiAgICAgICAgb3V0ZXIgKz0gY2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KGlubmVyKSkgPyBbb3V0ZXIsICcnXSA6IFtvdXRlciwgaW5uZXJdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRDb2xvckFBUGl2b3QobW9ub21lcjogc3RyaW5nID0gJycsIHNjaGVtZTogJ2dyb2snID0gJ2dyb2snKTogW3N0cmluZywgc3RyaW5nLCBzdHJpbmcsIG51bWJlcl0ge1xuICAgIC8vY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IEFBUGFsZXR0ZXMuR3Jva0dyb3VwcygpO1xuICAgIGNvbnN0IGNoZW1QYWxldHRlSW5zdGFuY2UgPSB0aGlzLmdldFBhbGV0dGUoc2NoZW1lKTtcbiAgICBsZXQgW291dGVyTW9ub21lciwgaW5uZXJNb25vbWVyXSA9IHRoaXMuZ2V0SW5uZXJPdXRlcihtb25vbWVyKTtcbiAgICBvdXRlck1vbm9tZXIgPSAob3V0ZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtvdXRlck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IG91dGVyTW9ub21lcik7XG4gICAgaW5uZXJNb25vbWVyID0gKGlubmVyTW9ub21lci5sZW5ndGggPiA2ID8gYCR7aW5uZXJNb25vbWVyLnNsaWNlKDAsIDMpfS4uLmAgOiBpbm5lck1vbm9tZXIpO1xuXG4gICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDEgfHwgbW9ub21lclsxXSA9PSAnKCcpIHtcbiAgICAgIGNvbnN0IGFtaW5vID0gbW9ub21lclswXT8udG9VcHBlckNhc2UoKSE7XG4gICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2VbYW1pbm9dLCBhbWlubywgaW5uZXJNb25vbWVyLCAyXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMCwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDMgfHwgbW9ub21lclszXSA9PSAnKCcpIHtcbiAgICAgICAgY29uc3QgYW1pbm8gPSB0aGlzLkFBRnVsbE5hbWVzW21vbm9tZXIuc3Vic3RyaW5nKDAsIDMpXTtcbiAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgM10gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgM107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXJbMF0/LnRvTG93ZXJDYXNlKCkgPT0gbW9ub21lclswXSkge1xuICAgICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDEsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDQgfHwgbW9ub21lcls0XSA9PSAnKCcpIHtcbiAgICAgICAgICBjb25zdCBhbWlubyA9IHRoaXMuQUFGdWxsTmFtZXNbbW9ub21lci5zdWJzdHJpbmcoMSwgMyldO1xuICAgICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=
package/src/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { SeqPalette } from './seq-palettes';
2
+ import { Aminoacids, AminoacidsPalettes } from './aminoacids';
3
+ import { Nucleotides, NucleotidesPalettes } from './nucleotides';
4
+ import { WebLogo, PositionInfo, PositionMonomerInfo } from './viewers/web-logo';
5
+ export { SeqPalette, AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides };
6
+ export { WebLogo, PositionInfo, PositionMonomerInfo };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAC,CAAC;AACtF,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAC,CAAC"}
package/src/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import { Aminoacids, AminoacidsPalettes } from './aminoacids';
2
+ import { Nucleotides, NucleotidesPalettes } from './nucleotides';
3
+ import { WebLogo, PositionInfo, PositionMonomerInfo } from './viewers/web-logo';
4
+ export { AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides };
5
+ export { WebLogo, PositionInfo, PositionMonomerInfo };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sRUFBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RSxPQUFPLEVBQWEsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBQyxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcbmltcG9ydCB7QW1pbm9hY2lkcywgQW1pbm9hY2lkc1BhbGV0dGVzfSBmcm9tICcuL2FtaW5vYWNpZHMnO1xuaW1wb3J0IHtOdWNsZW90aWRlcywgTnVjbGVvdGlkZXNQYWxldHRlc30gZnJvbSAnLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1dlYkxvZ28sIFBvc2l0aW9uSW5mbywgUG9zaXRpb25Nb25vbWVySW5mb30gZnJvbSAnLi92aWV3ZXJzL3dlYi1sb2dvJztcblxuZXhwb3J0IHtTZXFQYWxldHRlLCBBbWlub2FjaWRzUGFsZXR0ZXMsIEFtaW5vYWNpZHMsIE51Y2xlb3RpZGVzUGFsZXR0ZXMsIE51Y2xlb3RpZGVzfTtcbmV4cG9ydCB7V2ViTG9nbywgUG9zaXRpb25JbmZvLCBQb3NpdGlvbk1vbm9tZXJJbmZvfTtcblxuIl19
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ import {SeqPalette} from './seq-palettes';
2
+ import {Aminoacids, AminoacidsPalettes} from './aminoacids';
3
+ import {Nucleotides, NucleotidesPalettes} from './nucleotides';
4
+ import {WebLogo, PositionInfo, PositionMonomerInfo} from './viewers/web-logo';
5
+
6
+ export {SeqPalette, AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides};
7
+ export {WebLogo, PositionInfo, PositionMonomerInfo};
8
+
@@ -0,0 +1,12 @@
1
+ import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
2
+ import { SeqPalette, SeqPaletteBase } from './seq-palettes';
3
+ export declare class NucleotidesPalettes extends SeqPaletteBase {
4
+ private static chromatogram;
5
+ static get Chromatogram(): SeqPalette;
6
+ }
7
+ export declare class Nucleotides {
8
+ static readonly SemType: string;
9
+ static readonly SemTypeMultipleAlignment: string;
10
+ static Names: StringDictionary;
11
+ }
12
+ //# sourceMappingURL=nucleotides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nucleotides.d.ts","sourceRoot":"","sources":["nucleotides.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IAExC,WAAkB,YAAY,IAAI,UAAU,CAW3C;CACF;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAuB;IAEtD,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAkC;IAElF,OAAc,KAAK,EAAE,gBAAgB,CAMnC;CACH"}
@@ -0,0 +1,27 @@
1
+ import { SeqPaletteBase } from './seq-palettes';
2
+ export class NucleotidesPalettes extends SeqPaletteBase {
3
+ static get Chromatogram() {
4
+ if (this.chromatogram === void 0) {
5
+ this.chromatogram = {
6
+ 'A': 'green',
7
+ 'C': 'blue',
8
+ 'G': 'black',
9
+ 'T': 'red', 'U': 'red',
10
+ 'others': 'gray',
11
+ };
12
+ }
13
+ return this.chromatogram;
14
+ }
15
+ }
16
+ export class Nucleotides {
17
+ }
18
+ Nucleotides.SemType = 'MultipleAlignment';
19
+ Nucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';
20
+ Nucleotides.Names = {
21
+ 'A': 'Adenine',
22
+ 'C': 'Cytosine',
23
+ 'G': 'Guanine',
24
+ 'T': 'Thymine',
25
+ 'U': 'Uracil',
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUc7Z0JBQ2xCLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUs7Z0JBQ3RCLFFBQVEsRUFBRSxNQUFNO2FBQ2pCLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sV0FBVzs7QUFDTixtQkFBTyxHQUFXLG1CQUFtQixDQUFDO0FBRXRDLG9DQUF3QixHQUFXLDhCQUE4QixDQUFDO0FBRXBFLGlCQUFLLEdBQXFCO0lBQ3RDLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFFBQVE7Q0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHtTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGUsIFNlcVBhbGV0dGVCYXNlfSBmcm9tICcuL3NlcS1wYWxldHRlcyc7XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlc1BhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBjaHJvbWF0b2dyYW06IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgQ2hyb21hdG9ncmFtKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNocm9tYXRvZ3JhbSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNocm9tYXRvZ3JhbSA9IHtcbiAgICAgICAgJ0EnOiAnZ3JlZW4nLFxuICAgICAgICAnQyc6ICdibHVlJyxcbiAgICAgICAgJ0cnOiAnYmxhY2snLCAvLyBvcmFuZ2UgP1xuICAgICAgICAnVCc6ICdyZWQnLCAnVSc6ICdyZWQnLFxuICAgICAgICAnb3RoZXJzJzogJ2dyYXknLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTXVsdGlwbGVBbGlnbm1lbnQnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["package.ts"],"names":[],"mappings":""}
package/src/package.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ==
@@ -0,0 +1,16 @@
1
+ export interface SeqPalette {
2
+ /**
3
+ * @param {string} m Monomer character
4
+ * @return {string} Color
5
+ */
6
+ [m: string]: string;
7
+ }
8
+ export declare class SeqPaletteBase {
9
+ /** Palette with shades of primary colors
10
+ */
11
+ private static colourPalette;
12
+ protected static makePalette(dt: [string[], string][], simplified?: boolean): {
13
+ [key: string]: string;
14
+ };
15
+ }
16
+ //# sourceMappingURL=seq-palettes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seq-palettes.d.ts","sourceRoot":"","sources":["seq-palettes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB;OACG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa,CAqB1B;IAEF,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,UAAQ;;;CAW1E"}
@@ -0,0 +1,38 @@
1
+ export class SeqPaletteBase {
2
+ static makePalette(dt, simplified = false) {
3
+ const palette = {};
4
+ dt.forEach((cp) => {
5
+ const objList = cp[0];
6
+ const colour = cp[1];
7
+ objList.forEach((obj, ind) => {
8
+ palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];
9
+ });
10
+ });
11
+ return palette;
12
+ }
13
+ }
14
+ /** Palette with shades of primary colors
15
+ */
16
+ SeqPaletteBase.colourPalette = {
17
+ 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],
18
+ 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',
19
+ 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
20
+ 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',
21
+ 'rgb(31, 120, 150)'],
22
+ 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],
23
+ 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],
24
+ 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],
25
+ 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],
26
+ 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],
27
+ 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],
28
+ 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],
29
+ 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],
30
+ 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
31
+ 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],
32
+ 'pink': ['rgb(247,182,210)'],
33
+ 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],
34
+ 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],
35
+ 'yellow': ['rgb(188,189,34)'],
36
+ 'white': ['rgb(230,230,230)'],
37
+ };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE1BQU0sT0FBTyxjQUFjO0lBMEJmLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBd0IsRUFBRSxVQUFVLEdBQUcsS0FBSztRQUN2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7QUFuQ0Q7R0FDRztBQUNZLDRCQUFhLEdBQWdDO0lBQzFELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbSBNb25vbWVyIGNoYXJhY3RlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbG9yXG4gICAqL1xuICBbbTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2VxUGFsZXR0ZUJhc2Uge1xuICAvKiogUGFsZXR0ZSB3aXRoIHNoYWRlcyBvZiBwcmltYXJ5IGNvbG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY29sb3VyUGFsZXR0ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge1xuICAgICdvcmFuZ2UnOiBbJ3JnYigyNTUsMTg3LDEyMCknLCAncmdiKDI0NSwxNjcsMTAwKScsICdyZ2IoMjM1LDEzNyw3MCknLCAncmdiKDIwNSwgMTExLCA3MSknXSxcbiAgICAnYWxsX2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KScsICdyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsXG4gICAgICAncmdiKDI0LDExMCw3OSknLCAncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMTgyLCAyMjMsIDEzOCknLCAncmdiKDE1MiwgMTkzLCAxMzgpJ10sXG4gICAgJ2FsbF9ibHVlJzogWydyZ2IoMzEsMTE5LDE4MCknLCAncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxMjIsIDEwMiwgMTg5KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxNDEsIDEyNCwgMjE3KScsXG4gICAgICAncmdiKDMxLCAxMjAsIDE1MCknXSxcbiAgICAnbWFnZW50YSc6IFsncmdiKDE2MiwxMDYsMTkyKScsICdyZ2IoMTk3LDE2NSwyMjQpJywgJ3JnYigyMDgsMTEzLDIxOCknXSxcbiAgICAncmVkJzogWydyZ2IoMjE0LDM5LDQwKScsICdyZ2IoMjU1LDE1MiwxNTApJ10sXG4gICAgJ3N0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigzMSwxMTksMTgwKSddLFxuICAgICdkYXJrX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdsaWdodF9ibHVlJzogWydyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDE1OCwyMTgsMjI5KScsICdyZ2IoMTA4LCAyMTgsIDIyOSknLCAncmdiKDIzLDE5MCwyMjcpJ10sXG4gICAgJ2xpbGFjX2JsdWUnOiBbJ3JnYigxMjQsMTAyLDIxMSknLCAncmdiKDE0OSwxMzQsMjE3KScsICdyZ2IoOTcsIDgxLCAxNTApJ10sXG4gICAgJ2RhcmtfZ3JlZW4nOiBbJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJywgJ3JnYigyNCwxMTAsNzkpJ10sXG4gICAgJ2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdsaWdodF9ncmVlbic6IFsncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMTgyLCAyMjMsIDEzOCknLCAncmdiKDE1MiwgMTkzLCAxMzgpJ10sXG4gICAgJ3N0X2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigzOSwgMTc0LCA5NiknLCAncmdiKDc0LDE2MCw3NCknXSxcbiAgICAncGluayc6IFsncmdiKDI0NywxODIsMjEwKSddLFxuICAgICdicm93bic6IFsncmdiKDE0MCw4Niw3NSknLCAncmdiKDEwMiwgNjIsIDU0KSddLFxuICAgICdncmF5JzogWydyZ2IoMTI3LDEyNywxMjcpJywgJ3JnYigxOTksMTk5LDE5OSknLCAncmdiKDE5NiwxNTYsMTQ4KScsICdyZ2IoMjIyLCAyMjIsIDE4MCknXSxcbiAgICAneWVsbG93JzogWydyZ2IoMTg4LDE4OSwzNCknXSxcbiAgICAnd2hpdGUnOiBbJ3JnYigyMzAsMjMwLDIzMCknXSxcbiAgfTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIG1ha2VQYWxldHRlKGR0OiBbc3RyaW5nW10sIHN0cmluZ11bXSwgc2ltcGxpZmllZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcGFsZXR0ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGR0LmZvckVhY2goKGNwKSA9PiB7XG4gICAgICBjb25zdCBvYmpMaXN0ID0gY3BbMF07XG4gICAgICBjb25zdCBjb2xvdXIgPSBjcFsxXTtcbiAgICAgIG9iakxpc3QuZm9yRWFjaCgob2JqLCBpbmQpID0+IHtcbiAgICAgICAgcGFsZXR0ZVtvYmpdID0gdGhpcy5jb2xvdXJQYWxldHRlW2NvbG91cl1bc2ltcGxpZmllZCA/IDAgOiBpbmRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhbGV0dGU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,69 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
3
+ declare module 'datagrok-api/src/grid' {
4
+ interface Rect {
5
+ contains(x: number, y: number): boolean;
6
+ }
7
+ }
8
+ declare global {
9
+ interface HTMLCanvasElement {
10
+ getCursorPosition(event: MouseEvent): DG.Point;
11
+ }
12
+ }
13
+ export declare class PositionMonomerInfo {
14
+ /** Sequences count with monomer in position
15
+ */
16
+ count: number;
17
+ /** Remember screen coords rect
18
+ */
19
+ bounds: DG.Rect;
20
+ constructor();
21
+ }
22
+ export declare class PositionInfo {
23
+ readonly name: string;
24
+ freq: {
25
+ [m: string]: PositionMonomerInfo;
26
+ };
27
+ rowCount: number;
28
+ /** freq = {}, rowCount = 0
29
+ * @param {string} name Name of position ('111A', '111.1', etc)
30
+ */
31
+ constructor(name: string);
32
+ }
33
+ export declare class WebLogo extends DG.JsViewer {
34
+ static residuesSet: string;
35
+ protected cp: StringDictionary | null;
36
+ private msgHost?;
37
+ private canvas?;
38
+ private slider?;
39
+ private textBaseline;
40
+ private axisHeight;
41
+ private seqCol;
42
+ private positions;
43
+ private rowsMasked;
44
+ private rowsNull;
45
+ positionWidth: number;
46
+ minHeight: number;
47
+ maxHeight: number;
48
+ considerNullSequences: boolean;
49
+ sequenceColumnName: string;
50
+ startPositionName: string;
51
+ endPositionName: string;
52
+ private positionNames;
53
+ private startPosition;
54
+ private endPosition;
55
+ /** For startPosition equals to endPosition Length is 1 */
56
+ private get Length();
57
+ constructor();
58
+ init(): Promise<void>;
59
+ rootOnSizeChanged(args: any): void;
60
+ /** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
61
+ */
62
+ updateSeqCol(): void;
63
+ onPropertyChanged(property: DG.Property): void;
64
+ onTableAttached(): void;
65
+ protected _nullSequence(fillerResidue?: string): string;
66
+ protected _calculate(): void;
67
+ render(recalc?: boolean): void;
68
+ }
69
+ //# sourceMappingURL=web-logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-logo.d.ts","sourceRoot":"","sources":["web-logo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AAOjF,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,IAAI;QACZ,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACzC;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,iBAAiB;QACzB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC;KAChD;CACF;AAWD,qBAAa,mBAAmB;IAC9B;OACG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;OACG;IACH,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;;CAMjB;AAED,qBAAa,YAAY;IACvB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;gBACS,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,OAAQ,SAAQ,EAAE,CAAC,QAAQ;IACtC,OAAc,WAAW,SAAiB;IAG1C,SAAS,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAG7C,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAqB;IAEzC,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO,CAAC,MAAM,CAA0B;IAExC,OAAO,CAAC,SAAS,CAAsB;IAEvC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAa;IAGtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,WAAW,CAAc;IAEjC,0DAA0D;IAC1D,OAAO,KAAK,MAAM,GAEjB;;IAkBK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4E3B,iBAAiB,CAAC,IAAI,EAAE,GAAG;IAmB3B;OACG;IACH,YAAY,IAAI,IAAI;IAuCpB,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,IAAI;IA4B9C,eAAe;IAiBf,SAAS,CAAC,aAAa,CAAC,aAAa,SAAM,GAAG,MAAM;IAOpD,SAAS,CAAC,UAAU;IAoFpB,MAAM,CAAC,MAAM,UAAO;CA+ErB"}
@@ -0,0 +1,360 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as ui from 'datagrok-api/ui';
11
+ import * as DG from 'datagrok-api/dg';
12
+ import * as rxjs from 'rxjs';
13
+ import { Aminoacids, AminoacidsPalettes } from '../aminoacids';
14
+ import { Nucleotides, NucleotidesPalettes } from '../nucleotides';
15
+ HTMLCanvasElement.prototype.getCursorPosition = function (event) {
16
+ const rect = this.getBoundingClientRect();
17
+ return new DG.Point(event.clientX - rect.left, event.clientY - rect.top);
18
+ };
19
+ DG.Rect.prototype.contains = function (x, y) {
20
+ return this.left <= x && x <= this.right && this.top <= y && y <= this.bottom;
21
+ };
22
+ export class PositionMonomerInfo {
23
+ constructor() {
24
+ this.count = 0;
25
+ this.bounds = new DG.Rect(0, 0, 0, 0);
26
+ }
27
+ }
28
+ export class PositionInfo {
29
+ /** freq = {}, rowCount = 0
30
+ * @param {string} name Name of position ('111A', '111.1', etc)
31
+ */
32
+ constructor(name) {
33
+ this.name = name;
34
+ this.freq = {};
35
+ this.rowCount = 0;
36
+ }
37
+ }
38
+ export class WebLogo extends DG.JsViewer {
39
+ constructor() {
40
+ super();
41
+ // private readonly colorScheme: ColorScheme = ColorSchemes[NucleotidesWebLogo.residuesSet];
42
+ this.cp = null;
43
+ this.axisHeight = 12;
44
+ this.seqCol = null;
45
+ // private maxLength: number = 100;
46
+ this.positions = [];
47
+ this.rowsMasked = 0;
48
+ this.rowsNull = 0;
49
+ this.positionNames = [];
50
+ this.startPosition = -1;
51
+ this.endPosition = -1;
52
+ this.textBaseline = 'top';
53
+ this.positionWidth = this.float('positionWidth', 16);
54
+ this.minHeight = this.float('minHeight', 50);
55
+ this.maxHeight = this.float('maxHeight', 100);
56
+ this.considerNullSequences = this.bool('considerNullSequences', false);
57
+ this.sequenceColumnName = this.string('sequenceColumnName', null);
58
+ this.startPositionName = this.string('startPositionName', null);
59
+ this.endPositionName = this.string('endPositionName', null);
60
+ }
61
+ /** For startPosition equals to endPosition Length is 1 */
62
+ get Length() {
63
+ return this.startPosition <= this.endPosition ? this.endPosition - this.startPosition + 1 : 0;
64
+ }
65
+ init() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ this.msgHost = ui.div('No message');
68
+ this.msgHost.style.display = 'none';
69
+ this.canvas = ui.canvas();
70
+ this.canvas.style.width = '100%';
71
+ // this.slider = ui.rangeSlider(0, 20, 2, 5);
72
+ // this.slider.root.style.width = '100%';
73
+ // this.slider.root.style.height = '12px';
74
+ // this.host = ui.divV([/*this.slider,*/this.canvas]);
75
+ const getMonomer = (p) => {
76
+ const jPos = Math.floor(p.x / this.positionWidth);
77
+ const position = this.positions[jPos];
78
+ if (position === void 0)
79
+ return [jPos, null, null];
80
+ const monomer = Object.keys(position.freq)
81
+ .find((m) => position.freq[m].bounds.contains(p.x, p.y));
82
+ if (monomer === undefined)
83
+ return [jPos, null, null];
84
+ return [jPos, monomer, position.freq[monomer]];
85
+ };
86
+ this.canvas.onmouseover = (e) => {
87
+ };
88
+ rxjs.fromEvent(this.canvas, 'mousemove').subscribe((e) => {
89
+ if (!this.canvas)
90
+ return;
91
+ const args = e;
92
+ const [jPos, monomer] = getMonomer(this.canvas.getCursorPosition(args));
93
+ if (this.dataFrame && this.seqCol && monomer) {
94
+ ui.tooltip.showRowGroup(this.dataFrame, (iRow) => {
95
+ const seq = this.seqCol.get(iRow);
96
+ const mSeq = seq ? seq[this.startPosition + jPos] : null;
97
+ return mSeq === monomer;
98
+ }, args.x + 16, args.y + 16);
99
+ }
100
+ else {
101
+ ui.tooltip.hide();
102
+ }
103
+ });
104
+ rxjs.fromEvent(this.canvas, 'mousedown').subscribe((e) => {
105
+ if (!this.canvas || e.button != 0)
106
+ return;
107
+ const args = e;
108
+ const [jPos, monomer] = getMonomer(this.canvas.getCursorPosition(args));
109
+ // prevents deselect all rows if we miss monomer bounds
110
+ if (this.dataFrame && this.seqCol && monomer) {
111
+ this.dataFrame.selection.init((iRow) => {
112
+ const seq = this.seqCol.get(iRow);
113
+ const mSeq = seq ? seq[this.startPosition + jPos] : null;
114
+ return mSeq === monomer;
115
+ });
116
+ }
117
+ });
118
+ this.root.append(this.msgHost);
119
+ this.root.append(this.canvas);
120
+ // this.root.appendChild(this.slider.root);
121
+ ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this));
122
+ this.render(true);
123
+ });
124
+ }
125
+ rootOnSizeChanged(args) {
126
+ if (!this.canvas)
127
+ return;
128
+ // this.canvas.width calculate in this._calculate() method
129
+ const height = Math.min(this.maxHeight, Math.max(this.minHeight, this.root.clientHeight));
130
+ // if (this.canvas.width > this.root.clientWidth) /* horizontal scroller is enabled */
131
+ // height -= 6; /* free some space for horizontal scroller */
132
+ this.canvas.height = height;
133
+ this.canvas.style.height = `${height}px`;
134
+ // console.debug(`WebLogo.onRootSizeChanged() ` +
135
+ // `root.width=${this.root.clientWidth}, root.height=${this.root.clientHeight}, ` +
136
+ // `canvas.width=${this.canvas.width}, canvas.height=${this.canvas.height} .`);
137
+ this.render(true);
138
+ }
139
+ /** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
140
+ */
141
+ updateSeqCol() {
142
+ if (this.dataFrame) {
143
+ this.seqCol = this.dataFrame.col(this.sequenceColumnName);
144
+ if (this.seqCol) {
145
+ let maxLength = 0;
146
+ for (const category of this.seqCol.categories)
147
+ maxLength = Math.max(maxLength, category.length);
148
+ // Get position names from data column tag 'positionNames'
149
+ const positionNamesTxt = this.seqCol.getTag('positionNames');
150
+ // Fallback if 'positionNames' tag is not provided
151
+ this.positionNames = positionNamesTxt ? positionNamesTxt.split(', ').map((n) => n.trim()) :
152
+ [...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);
153
+ this.startPosition = this.startPositionName && this.positionNames ?
154
+ this.positionNames.indexOf(this.startPositionName) : 0;
155
+ this.endPosition = this.endPositionName && this.positionNames ?
156
+ this.positionNames.indexOf(this.endPositionName) : (maxLength - 1);
157
+ //#region -- palette --
158
+ switch (this.seqCol.semType) {
159
+ case Aminoacids.SemTypeMultipleAlignment:
160
+ this.cp = AminoacidsPalettes.GrokGroups;
161
+ break;
162
+ case Nucleotides.SemTypeMultipleAlignment:
163
+ this.cp = NucleotidesPalettes.Chromatogram;
164
+ break;
165
+ }
166
+ //#endregion -- palette --
167
+ }
168
+ else {
169
+ this.cp = null;
170
+ this.positionNames = [];
171
+ this.startPosition = -1;
172
+ this.endPosition = -1;
173
+ }
174
+ }
175
+ this.render();
176
+ }
177
+ onPropertyChanged(property) {
178
+ super.onPropertyChanged(property);
179
+ switch (property.name) {
180
+ case 'considerNullSequences':
181
+ this.render();
182
+ break;
183
+ case 'sequenceColumnName':
184
+ this.updateSeqCol();
185
+ break;
186
+ case 'startPositionName':
187
+ this.updateSeqCol();
188
+ break;
189
+ case 'endPositionName':
190
+ this.updateSeqCol();
191
+ break;
192
+ case 'positionWidth':
193
+ this.render(true);
194
+ break;
195
+ case 'minHeight':
196
+ this.rootOnSizeChanged(null);
197
+ break;
198
+ case 'maxHeight':
199
+ this.rootOnSizeChanged(null);
200
+ break;
201
+ }
202
+ }
203
+ onTableAttached() {
204
+ this.updateSeqCol();
205
+ if (this.dataFrame !== void 0) {
206
+ // There are two approaches:
207
+ // first - look in the dataFrame for the first matching column by semType of the
208
+ // corresponding viewer (but we want only one class of a more universal viewer),
209
+ // second - draw column data if the passed column is of suitable semType
210
+ // We decided that we will not search, but we will display asked data if we can
211
+ // const semType = (<typeof NucleotidesWebLogo>(this.constructor)).residuesSet;
212
+ // this.seqCol = (this.dataFrame.columns as DG.ColumnList).bySemType(semType);
213
+ this.dataFrame.selection.onChanged.subscribe((_) => this.render());
214
+ this.dataFrame.filter.onChanged.subscribe((_) => this.render());
215
+ }
216
+ }
217
+ _nullSequence(fillerResidue = 'X') {
218
+ if (this.considerNullSequences)
219
+ return new Array(this.Length).fill(fillerResidue).join('');
220
+ return '';
221
+ }
222
+ _calculate() {
223
+ if (!this.canvas || !this.seqCol || !this.dataFrame || this.startPosition === -1 || this.endPosition === -1)
224
+ return;
225
+ const width = this.Length * this.positionWidth;
226
+ this.canvas.width = width;
227
+ this.canvas.style.width = `${width}px`;
228
+ this.root.style.width = `${this.canvas.width}px`;
229
+ this.positions = new Array(this.Length);
230
+ for (let jPos = 0; jPos < this.Length; jPos++) {
231
+ const posName = this.positionNames[this.startPosition + jPos];
232
+ this.positions[jPos] = new PositionInfo(posName);
233
+ }
234
+ // 2022-05-05 askalkin instructed to show WebLogo based on filter (not selection)
235
+ const indices = this.dataFrame.filter.getSelectedIndexes();
236
+ // const indices = this.dataFrame.selection.trueCount > 0 ? this.dataFrame.selection.getSelectedIndexes() :
237
+ // this.dataFrame.filter.getSelectedIndexes();
238
+ this.rowsMasked = indices.length;
239
+ this.rowsNull = 0;
240
+ for (const i of indices) {
241
+ let s = (this.seqCol.get(i));
242
+ if (!s) {
243
+ s = this._nullSequence();
244
+ ++this.rowsNull;
245
+ }
246
+ else {
247
+ for (let jPos = 0; jPos < this.Length; jPos++) {
248
+ const pmInfo = this.positions[jPos].freq;
249
+ const m = s[this.startPosition + jPos];
250
+ if (!(m in pmInfo))
251
+ pmInfo[m] = new PositionMonomerInfo();
252
+ pmInfo[m].count++;
253
+ }
254
+ }
255
+ }
256
+ //#region Polish freq counts
257
+ for (let jPos = 0; jPos < this.Length; jPos++) {
258
+ // delete this.positions[jPos].freq['-'];
259
+ this.positions[jPos].rowCount = 0;
260
+ for (const m in this.positions[jPos].freq)
261
+ this.positions[jPos].rowCount += this.positions[jPos].freq[m].count;
262
+ }
263
+ //#endregion
264
+ const maxHeight = this.canvas.height - this.axisHeight;
265
+ // console.debug(`WebLogo._calculate() maxHeight=${maxHeight}.`);
266
+ //#region Calculate screen
267
+ for (let jPos = 0; jPos < this.Length; jPos++) {
268
+ const freq = this.positions[jPos].freq;
269
+ const rowCount = this.positions[jPos].rowCount;
270
+ let y = this.axisHeight;
271
+ const entries = Object.entries(freq).sort((a, b) => {
272
+ if (a[0] !== '-' && b[0] !== '-')
273
+ return b[1].count - a[1].count;
274
+ else if (a[0] === '-' && b[0] === '-')
275
+ return 0;
276
+ else if (a[0] === '-')
277
+ return -1;
278
+ else /* (b[0] === '-') */
279
+ return +1;
280
+ });
281
+ for (const entry of entries) {
282
+ const pmInfo = entry[1];
283
+ // const m: string = entry[0];
284
+ const h = maxHeight * pmInfo.count / rowCount;
285
+ pmInfo.bounds = new DG.Rect(jPos * this.positionWidth, y, this.positionWidth, h);
286
+ y += h;
287
+ }
288
+ }
289
+ //#endregion
290
+ }
291
+ // reflect changes made to filter/selection
292
+ render(recalc = true) {
293
+ var _a;
294
+ if (this.msgHost) {
295
+ if (this.seqCol && !this.cp) {
296
+ this.msgHost.innerText = `Unknown palette (column semType: '${this.seqCol.semType}').`;
297
+ this.msgHost.style.display = '';
298
+ }
299
+ else {
300
+ this.msgHost.style.display = 'none';
301
+ }
302
+ }
303
+ if (!this.canvas || !this.seqCol || !this.dataFrame || !this.cp ||
304
+ this.startPosition === -1 || this.endPosition === -1)
305
+ return;
306
+ const g = this.canvas.getContext('2d');
307
+ if (!g)
308
+ return;
309
+ if (recalc)
310
+ this._calculate();
311
+ // let rowCount = this.rowsMasked;
312
+ // if (!this.considerNullSequences)
313
+ // rowCount -= this.rowsNull;
314
+ g.resetTransform();
315
+ //g.clearRect(0, 0, this.canvas.width, this.canvas.height);
316
+ g.fillStyle = 'white';
317
+ g.fillRect(0, 0, this.canvas.width, this.canvas.height);
318
+ g.textBaseline = this.textBaseline;
319
+ //#region Plot positionNames
320
+ g.resetTransform();
321
+ g.fillStyle = 'black';
322
+ g.textAlign = 'center';
323
+ g.font = '10px Roboto, Roboto Local, sans-serif';
324
+ const posNameMaxWidth = Math.max(...this.positions.map((pos) => g.measureText(pos.name).width));
325
+ const hScale = posNameMaxWidth < (this.positionWidth - 2) ? 1 : (this.positionWidth - 2) / posNameMaxWidth;
326
+ for (let jPos = 0; jPos < this.Length; jPos++) {
327
+ const pos = this.positions[jPos];
328
+ g.resetTransform();
329
+ g.setTransform(hScale, 0, 0, 1, jPos * this.positionWidth + this.positionWidth / 2, 0);
330
+ g.fillText(pos.name, 0, 0);
331
+ }
332
+ //#endregion Plot positionNames
333
+ for (let jPos = 0; jPos < this.Length; jPos++) {
334
+ for (const [monomer, pmInfo] of Object.entries(this.positions[jPos].freq)) {
335
+ if (monomer !== '-') {
336
+ const b = pmInfo.bounds;
337
+ const fontStyle = '16px Roboto, Roboto Local, sans-serif';
338
+ // Hacks to scale uppercase characters to target rectangle
339
+ const uppercaseLetterAscent = 0.25;
340
+ const uppercaseLetterHeight = 12.2;
341
+ g.resetTransform();
342
+ g.strokeStyle = 'lightgray';
343
+ g.lineWidth = 1;
344
+ g.rect(b.left, b.top, b.width, b.height);
345
+ g.fillStyle = (_a = this.cp[monomer]) !== null && _a !== void 0 ? _a : this.cp['other'];
346
+ g.textAlign = 'left';
347
+ g.font = fontStyle;
348
+ //g.fillRect(b.left, b.top, b.width, b.height);
349
+ const mTm = g.measureText(monomer);
350
+ // if (mM.actualBoundingBoxAscent != 0)
351
+ // console.debug(`m: ${m}, mM.actualBoundingBoxAscent: ${mM.actualBoundingBoxAscent}`);
352
+ g.setTransform(b.width / mTm.width, 0, 0, b.height / uppercaseLetterHeight, b.left, b.top);
353
+ g.fillText(monomer, 0, -uppercaseLetterAscent);
354
+ }
355
+ }
356
+ }
357
+ }
358
+ }
359
+ WebLogo.residuesSet = 'nucleotides';
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFJN0IsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFnQmhFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFTLEtBQWlCO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzFDLE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBUyxDQUFTLEVBQUUsQ0FBUztJQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ2hGLENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxD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SSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDekMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFBLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLG1DQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ25ELENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO29CQUNyQixDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztvQkFDbkIsK0NBQStDO29CQUMvQyxNQUFNLEdBQUcsR0FBZ0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFaEQsdUNBQXVDO29CQUN2Qyx5RkFBeUY7b0JBRXpGLENBQUMsQ0FBQyxZQUFZLENBQ1osQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsRUFDM0QsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7U0FDRjtJQUNILENBQUM7O0FBdFphLG1CQUFXLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5cbmltcG9ydCB7QW1pbm9hY2lkcywgQW1pbm9hY2lkc1BhbGV0dGVzfSBmcm9tICcuLi9hbWlub2FjaWRzJztcbmltcG9ydCB7TnVjbGVvdGlkZXMsIE51Y2xlb3RpZGVzUGFsZXR0ZXN9IGZyb20gJy4uL251Y2xlb3RpZGVzJztcblxuLy8gVXNpbmcgY29sb3Igc2NoZW1lcyBmcm9tIGNoZW0tcGFsZXR0ZVxuXG5kZWNsYXJlIG1vZHVsZSAnZGF0YWdyb2stYXBpL3NyYy9ncmlkJyB7XG4gIGludGVyZmFjZSBSZWN0IHtcbiAgICBjb250YWlucyh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW47XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTENhbnZhc0VsZW1lbnQge1xuICAgIGdldEN1cnNvclBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogREcuUG9pbnQ7XG4gIH1cbn1cblxuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLmdldEN1cnNvclBvc2l0aW9uID0gZnVuY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBERy5Qb2ludCB7XG4gIGNvbnN0IHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gbmV3IERHLlBvaW50KGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCk7XG59O1xuXG5ERy5SZWN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB0aGlzLmxlZnQgPD0geCAmJiB4IDw9IHRoaXMucmlnaHQgJiYgdGhpcy50b3AgPD0geSAmJiB5IDw9IHRoaXMuYm90dG9tO1xufTtcblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uTW9ub21lckluZm8ge1xuICAvKiogU2VxdWVuY2VzIGNvdW50IHdpdGggbW9ub21lciBpbiBwb3NpdGlvblxuICAgKi9cbiAgY291bnQ6IG51bWJlcjtcblxuICAvKiogUmVtZW1iZXIgc2NyZWVuIGNvb3JkcyByZWN0XG4gICAqL1xuICBib3VuZHM6IERHLlJlY3Q7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb3VudCA9IDA7XG4gICAgdGhpcy5ib3VuZHMgPSBuZXcgREcuUmVjdCgwLCAwLCAwLCAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25JbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgZnJlcTogeyBbbTogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9O1xuICByb3dDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBmcmVxID0ge30sIHJvd0NvdW50ID0gMFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHBvc2l0aW9uICgnMTExQScsICcxMTEuMScsIGV0YylcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5mcmVxID0ge307XG4gICAgdGhpcy5yb3dDb3VudCA9IDA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYkxvZ28gZXh0ZW5kcyBERy5Kc1ZpZXdlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVzaWR1ZXNTZXQgPSAnbnVjbGVvdGlkZXMnO1xuXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgY29sb3JTY2hlbWU6IENvbG9yU2NoZW1lID0gQ29sb3JTY2hlbWVzW051Y2xlb3RpZGVzV2ViTG9nby5yZXNpZHVlc1NldF07XG4gIHByb3RlY3RlZCBjcDogU3RyaW5nRGljdGlvbmFyeSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgbXNnSG9zdD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIHNsaWRlcj86IERHLlJhbmdlU2xpZGVyO1xuICBwcml2YXRlIHRleHRCYXNlbGluZTogQ2FudmFzVGV4dEJhc2VsaW5lO1xuXG4gIHByaXZhdGUgYXhpc0hlaWdodDogbnVtYmVyID0gMTI7XG5cbiAgcHJpdmF0ZSBzZXFDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBudWxsO1xuICAvLyBwcml2YXRlIG1heExlbmd0aDogbnVtYmVyID0gMTAwO1xuICBwcml2YXRlIHBvc2l0aW9uczogUG9zaXRpb25JbmZvW10gPSBbXTtcblxuICBwcml2YXRlIHJvd3NNYXNrZWQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcm93c051bGw6IG51bWJlciA9IDA7XG5cbiAgLy8gVmlld2VyJ3MgcHJvcGVydGllcyAobGlrZWx5IHRoZXkgc2hvdWxkIGJlIHB1YmxpYyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNldCBvdXRzaWRlKVxuICBwdWJsaWMgcG9zaXRpb25XaWR0aDogbnVtYmVyO1xuICBwdWJsaWMgbWluSGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBtYXhIZWlnaHQ6IG51bWJlcjtcbiAgcHVibGljIGNvbnNpZGVyTnVsbFNlcXVlbmNlczogYm9vbGVhbjtcbiAgcHVibGljIHNlcXVlbmNlQ29sdW1uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc3RhcnRQb3NpdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGVuZFBvc2l0aW9uTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcG9zaXRpb25OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICBwcml2YXRlIHN0YXJ0UG9zaXRpb246IG51bWJlciA9IC0xO1xuXG4gIHByaXZhdGUgZW5kUG9zaXRpb246IG51bWJlciA9IC0xO1xuXG4gIC8qKiBGb3Igc3RhcnRQb3NpdGlvbiBlcXVhbHMgdG8gZW5kUG9zaXRpb24gTGVuZ3RoIGlzIDEgKi9cbiAgcHJpdmF0ZSBnZXQgTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmVuZFBvc2l0aW9uID8gdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDEgOiAwO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cbiAgICB0aGlzLnBvc2l0aW9uV2lkdGggPSB0aGlzLmZsb2F0KCdwb3NpdGlvbldpZHRoJywgMTYpO1xuICAgIHRoaXMubWluSGVpZ2h0ID0gdGhpcy5mbG9hdCgnbWluSGVpZ2h0JywgNTApO1xuICAgIHRoaXMubWF4SGVpZ2h0ID0gdGhpcy5mbG9hdCgnbWF4SGVpZ2h0JywgMTAwKTtcblxuICAgIHRoaXMuY29uc2lkZXJOdWxsU2VxdWVuY2VzID0gdGhpcy5ib29sKCdjb25zaWRlck51bGxTZXF1ZW5jZXMnLCBmYWxzZSk7XG4gICAgdGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUgPSB0aGlzLnN0cmluZygnc2VxdWVuY2VDb2x1bW5OYW1lJywgbnVsbCk7XG5cbiAgICB0aGlzLnN0YXJ0UG9zaXRpb25OYW1lID0gdGhpcy5zdHJpbmcoJ3N0YXJ0UG9zaXRpb25OYW1lJywgbnVsbCk7XG4gICAgdGhpcy5lbmRQb3NpdGlvbk5hbWUgPSB0aGlzLnN0cmluZygnZW5kUG9zaXRpb25OYW1lJywgbnVsbCk7XG4gIH1cblxuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubXNnSG9zdCA9IHVpLmRpdignTm8gbWVzc2FnZScpO1xuICAgIHRoaXMubXNnSG9zdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgdGhpcy5jYW52YXMgPSB1aS5jYW52YXMoKTtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcblxuICAgIC8vIHRoaXMuc2xpZGVyID0gdWkucmFuZ2VTbGlkZXIoMCwgMjAsIDIsIDUpO1xuICAgIC8vIHRoaXMuc2xpZGVyLnJvb3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgLy8gdGhpcy5zbGlkZXIucm9vdC5zdHlsZS5oZWlnaHQgPSAnMTJweCc7XG5cbiAgICAvLyB0aGlzLmhvc3QgPSB1aS5kaXZWKFsvKnRoaXMuc2xpZGVyLCovdGhpcy5jYW52YXNdKTtcblxuICAgIGNvbnN0IGdldE1vbm9tZXIgPSAocDogREcuUG9pbnQpOiBbbnVtYmVyLCBzdHJpbmcgfCBudWxsLCBQb3NpdGlvbk1vbm9tZXJJbmZvIHwgbnVsbF0gPT4ge1xuICAgICAgY29uc3QgalBvcyA9IE1hdGguZmxvb3IocC54IC8gdGhpcy5wb3NpdGlvbldpZHRoKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbnNbalBvc107XG5cbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gW2pQb3MsIG51bGwsIG51bGxdO1xuXG4gICAgICBjb25zdCBtb25vbWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbi5mcmVxKVxuICAgICAgICAuZmluZCgobSkgPT4gcG9zaXRpb24uZnJlcVttXS5ib3VuZHMuY29udGFpbnMocC54LCBwLnkpKTtcbiAgICAgIGlmIChtb25vbWVyID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBbalBvcywgbnVsbCwgbnVsbF07XG5cbiAgICAgIHJldHVybiBbalBvcywgbW9ub21lciwgcG9zaXRpb24uZnJlcVttb25vbWVyXV07XG4gICAgfTtcblxuICAgIHRoaXMuY2FudmFzLm9ubW91c2VvdmVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcblxuICAgIH07XG5cbiAgICByeGpzLmZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmNhbnZhcywgJ21vdXNlbW92ZScpLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNhbnZhcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHVpLnRvb2x0aXAuc2hvd1Jvd0dyb3VwKHRoaXMuZGF0YUZyYW1lLCAoaVJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcSA9IHRoaXMuc2VxQ29sIS5nZXQoaVJvdyk7XG4gICAgICAgICAgY29uc3QgbVNlcSA9IHNlcSA/IHNlcVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG1TZXEgPT09IG1vbm9tZXI7XG4gICAgICAgIH0sIGFyZ3MueCArIDE2LCBhcmdzLnkgKyAxNik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1aS50b29sdGlwLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJ4anMuZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuY2FudmFzLCAnbW91c2Vkb3duJykuc3Vic2NyaWJlKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2FudmFzIHx8IGUuYnV0dG9uICE9IDApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3QgYXJncyA9IGUgYXMgTW91c2VFdmVudDtcbiAgICAgIGNvbnN0IFtqUG9zLCBtb25vbWVyXSA9IGdldE1vbm9tZXIodGhpcy5jYW52YXMuZ2V0Q3Vyc29yUG9zaXRpb24oYXJncykpO1xuXG4gICAgICAvLyBwcmV2ZW50cyBkZXNlbGVjdCBhbGwgcm93cyBpZiB3ZSBtaXNzIG1vbm9tZXIgYm91bmRzXG4gICAgICBpZiAodGhpcy5kYXRhRnJhbWUgJiYgdGhpcy5zZXFDb2wgJiYgbW9ub21lcikge1xuICAgICAgICB0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24uaW5pdCgoaVJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcSA9IHRoaXMuc2VxQ29sIS5nZXQoaVJvdyk7XG4gICAgICAgICAgY29uc3QgbVNlcSA9IHNlcSA/IHNlcVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG1TZXEgPT09IG1vbm9tZXI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yb290LmFwcGVuZCh0aGlzLm1zZ0hvc3QpO1xuICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5jYW52YXMpO1xuICAgIC8vIHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLnNsaWRlci5yb290KTtcblxuICAgIHVpLm9uU2l6ZUNoYW5nZWQodGhpcy5yb290KS5zdWJzY3JpYmUodGhpcy5yb290T25TaXplQ2hhbmdlZC5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICB9XG5cbiAgcm9vdE9uU2l6ZUNoYW5nZWQoYXJnczogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcylcbiAgICAgIHJldHVybjtcblxuICAgIC8vIHRoaXMuY2FudmFzLndpZHRoIGNhbGN1bGF0ZSBpbiB0aGlzLl9jYWxjdWxhdGUoKSBtZXRob2RcblxuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKHRoaXMubWF4SGVpZ2h0LCBNYXRoLm1heCh0aGlzLm1pbkhlaWdodCwgdGhpcy5yb290LmNsaWVudEhlaWdodCkpO1xuICAgIC8vIGlmICh0aGlzLmNhbnZhcy53aWR0aCA+IHRoaXMucm9vdC5jbGllbnRXaWR0aCkgLyogaG9yaXpvbnRhbCBzY3JvbGxlciBpcyBlbmFibGVkICovXG4gICAgLy8gICBoZWlnaHQgLT0gNjsgLyogZnJlZSBzb21lIHNwYWNlIGZvciBob3Jpem9udGFsIHNjcm9sbGVyICovXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG5cbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLm9uUm9vdFNpemVDaGFuZ2VkKCkgYCArXG4gICAgLy8gICBgcm9vdC53aWR0aD0ke3RoaXMucm9vdC5jbGllbnRXaWR0aH0sIHJvb3QuaGVpZ2h0PSR7dGhpcy5yb290LmNsaWVudEhlaWdodH0sIGAgK1xuICAgIC8vICAgYGNhbnZhcy53aWR0aD0ke3RoaXMuY2FudmFzLndpZHRofSwgY2FudmFzLmhlaWdodD0ke3RoaXMuY2FudmFzLmhlaWdodH0gLmApO1xuXG4gICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gIH1cblxuICAvKiogQXNzaWducyB7QGxpbmsgc2VxQ29sfSBhbmQge0BsaW5rIGNwfSBiYXNlZCBvbiB7QGxpbmsgc2VxdWVuY2VDb2x1bW5OYW1lfSBhbmQgY2FsbHMge0BsaW5rIHJlbmRlcn0oKS5cbiAgICovXG4gIHVwZGF0ZVNlcUNvbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIHRoaXMuc2VxQ29sID0gdGhpcy5kYXRhRnJhbWUuY29sKHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lKTtcbiAgICAgIGlmICh0aGlzLnNlcUNvbCkge1xuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLnNlcUNvbC5jYXRlZ29yaWVzKVxuICAgICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCwgY2F0ZWdvcnkubGVuZ3RoKTtcblxuICAgICAgICAvLyBHZXQgcG9zaXRpb24gbmFtZXMgZnJvbSBkYXRhIGNvbHVtbiB0YWcgJ3Bvc2l0aW9uTmFtZXMnXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uTmFtZXNUeHQgPSB0aGlzLnNlcUNvbC5nZXRUYWcoJ3Bvc2l0aW9uTmFtZXMnKTtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgJ3Bvc2l0aW9uTmFtZXMnIHRhZyBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzID0gcG9zaXRpb25OYW1lc1R4dCA/IHBvc2l0aW9uTmFtZXNUeHQuc3BsaXQoJywgJykubWFwKChuKSA9PiBuLnRyaW0oKSkgOlxuICAgICAgICAgIFsuLi5BcnJheShtYXhMZW5ndGgpLmtleXMoKV0ubWFwKChqUG9zKSA9PiBgJHtqUG9zICsgMX1gKTtcblxuICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb25OYW1lICYmIHRoaXMucG9zaXRpb25OYW1lcyA/XG4gICAgICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzLmluZGV4T2YodGhpcy5zdGFydFBvc2l0aW9uTmFtZSkgOiAwO1xuICAgICAgICB0aGlzLmVuZFBvc2l0aW9uID0gdGhpcy5lbmRQb3NpdGlvbk5hbWUgJiYgdGhpcy5wb3NpdGlvbk5hbWVzID9cbiAgICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5kZXhPZih0aGlzLmVuZFBvc2l0aW9uTmFtZSkgOiAobWF4TGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgLy8jcmVnaW9uIC0tIHBhbGV0dGUgLS1cbiAgICAgICAgc3dpdGNoICh0aGlzLnNlcUNvbC5zZW1UeXBlKSB7XG4gICAgICAgIGNhc2UgQW1pbm9hY2lkcy5TZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6XG4gICAgICAgICAgdGhpcy5jcCA9IEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE51Y2xlb3RpZGVzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDpcbiAgICAgICAgICB0aGlzLmNwID0gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8jZW5kcmVnaW9uIC0tIHBhbGV0dGUgLS1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3AgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gLTE7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIG9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5OiBERy5Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5KTtcblxuICAgIHN3aXRjaCAocHJvcGVydHkubmFtZSkge1xuICAgIGNhc2UgJ2NvbnNpZGVyTnVsbFNlcXVlbmNlcyc6XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VxdWVuY2VDb2x1bW5OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdGFydFBvc2l0aW9uTmFtZSc6XG4gICAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kUG9zaXRpb25OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwb3NpdGlvbldpZHRoJzpcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWluSGVpZ2h0JzpcbiAgICAgIHRoaXMucm9vdE9uU2l6ZUNoYW5nZWQobnVsbCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXhIZWlnaHQnOlxuICAgICAgdGhpcy5yb290T25TaXplQ2hhbmdlZChudWxsKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFibGVBdHRhY2hlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuXG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lICE9PSB2b2lkIDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSB0d28gYXBwcm9hY2hlczpcbiAgICAgIC8vIGZpcnN0ICAtIGxvb2sgaW4gdGhlIGRhdGFGcmFtZSBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGNvbHVtbiBieSBzZW1UeXBlIG9mIHRoZVxuICAgICAgLy8gICAgICAgICAgY29ycmVzcG9uZGluZyB2aWV3ZXIgKGJ1dCB3ZSB3YW50IG9ubHkgb25lIGNsYXNzIG9mIGEgbW9yZSB1bml2ZXJzYWwgdmlld2VyKSxcbiAgICAgIC8vIHNlY29uZCAtIGRyYXcgY29sdW1uIGRhdGEgaWYgdGhlIHBhc3NlZCBjb2x1bW4gaXMgb2Ygc3VpdGFibGUgc2VtVHlwZVxuICAgICAgLy8gV2UgZGVjaWRlZCB0aGF0IHdlIHdpbGwgbm90IHNlYXJjaCwgYnV0IHdlIHdpbGwgZGlzcGxheSBhc2tlZCBkYXRhIGlmIHdlIGNhblxuICAgICAgLy8gY29uc3Qgc2VtVHlwZSA9ICg8dHlwZW9mIE51Y2xlb3RpZGVzV2ViTG9nbz4odGhpcy5jb25zdHJ1Y3RvcikpLnJlc2lkdWVzU2V0O1xuICAgICAgLy8gdGhpcy5zZXFDb2wgPSAodGhpcy5kYXRhRnJhbWUuY29sdW1ucyBhcyBERy5Db2x1bW5MaXN0KS5ieVNlbVR5cGUoc2VtVHlwZSk7XG5cbiAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKTtcbiAgICAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX251bGxTZXF1ZW5jZShmaWxsZXJSZXNpZHVlID0gJ1gnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25zaWRlck51bGxTZXF1ZW5jZXMpXG4gICAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuTGVuZ3RoKS5maWxsKGZpbGxlclJlc2lkdWUpLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYWxjdWxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8IHRoaXMuc3RhcnRQb3NpdGlvbiA9PT0gLTEgfHwgdGhpcy5lbmRQb3NpdGlvbiA9PT0gLTEpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgdGhpcy5yb290LnN0eWxlLndpZHRoID0gYCR7dGhpcy5jYW52YXMud2lkdGh9cHhgO1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5MZW5ndGgpO1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zTmFtZTogc3RyaW5nID0gdGhpcy5wb3NpdGlvbk5hbWVzW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdO1xuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10gPSBuZXcgUG9zaXRpb25JbmZvKHBvc05hbWUpO1xuICAgIH1cblxuICAgIC8vIDIwMjItMDUtMDUgYXNrYWxraW4gaW5zdHJ1Y3RlZCB0byBzaG93IFdlYkxvZ28gYmFzZWQgb24gZmlsdGVyIChub3Qgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XG4gICAgLy8gY29uc3QgaW5kaWNlcyA9IHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi50cnVlQ291bnQgPiAwID8gdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLmdldFNlbGVjdGVkSW5kZXhlcygpIDpcbiAgICAvLyAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcblxuICAgIHRoaXMucm93c01hc2tlZCA9IGluZGljZXMubGVuZ3RoO1xuICAgIHRoaXMucm93c051bGwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGxldCBzOiBzdHJpbmcgPSA8c3RyaW5nPih0aGlzLnNlcUNvbC5nZXQoaSkpO1xuXG4gICAgICBpZiAoIXMpIHtcbiAgICAgICAgcyA9IHRoaXMuX251bGxTZXF1ZW5jZSgpO1xuICAgICAgICArK3RoaXMucm93c051bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgICAgICBjb25zdCBwbUluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxO1xuICAgICAgICAgIGNvbnN0IG06IHN0cmluZyA9IHNbdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc107XG4gICAgICAgICAgaWYgKCEobSBpbiBwbUluZm8pKVxuICAgICAgICAgICAgcG1JbmZvW21dID0gbmV3IFBvc2l0aW9uTW9ub21lckluZm8oKTtcblxuICAgICAgICAgIHBtSW5mb1ttXS5jb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8jcmVnaW9uIFBvbGlzaCBmcmVxIGNvdW50c1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgLy8gZGVsZXRlIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbJy0nXTtcblxuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXEpXG4gICAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50ICs9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbbV0uY291bnQ7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0IC0gdGhpcy5heGlzSGVpZ2h0O1xuICAgIC8vIGNvbnNvbGUuZGVidWcoYFdlYkxvZ28uX2NhbGN1bGF0ZSgpIG1heEhlaWdodD0ke21heEhlaWdodH0uYCk7XG5cbiAgICAvLyNyZWdpb24gQ2FsY3VsYXRlIHNjcmVlblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgZnJlcTogeyBbYzogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9ID0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcTtcbiAgICAgIGNvbnN0IHJvd0NvdW50ID0gdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQ7XG5cbiAgICAgIGxldCB5OiBudW1iZXIgPSB0aGlzLmF4aXNIZWlnaHQ7XG5cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhmcmVxKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhWzBdICE9PSAnLScgJiYgYlswXSAhPT0gJy0nKVxuICAgICAgICAgIHJldHVybiBiWzFdLmNvdW50IC0gYVsxXS5jb3VudDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nICYmIGJbMF0gPT09ICctJylcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nKVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgZWxzZSAvKiAoYlswXSA9PT0gJy0nKSAqL1xuICAgICAgICAgIHJldHVybiArMTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHBtSW5mbzogUG9zaXRpb25Nb25vbWVySW5mbyA9IGVudHJ5WzFdO1xuICAgICAgICAvLyBjb25zdCBtOiBzdHJpbmcgPSBlbnRyeVswXTtcbiAgICAgICAgY29uc3QgaDogbnVtYmVyID0gbWF4SGVpZ2h0ICogcG1JbmZvLmNvdW50IC8gcm93Q291bnQ7XG5cbiAgICAgICAgcG1JbmZvLmJvdW5kcyA9IG5ldyBERy5SZWN0KGpQb3MgKiB0aGlzLnBvc2l0aW9uV2lkdGgsIHksIHRoaXMucG9zaXRpb25XaWR0aCwgaCk7XG4gICAgICAgIHkgKz0gaDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG4gIH1cblxuICAvLyByZWZsZWN0IGNoYW5nZXMgbWFkZSB0byBmaWx0ZXIvc2VsZWN0aW9uXG4gIHJlbmRlcihyZWNhbGMgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMubXNnSG9zdCkge1xuICAgICAgaWYgKHRoaXMuc2VxQ29sICYmICF0aGlzLmNwKSB7XG4gICAgICAgIHRoaXMubXNnSG9zdCEuaW5uZXJUZXh0ID0gYFVua25vd24gcGFsZXR0ZSAoY29sdW1uIHNlbVR5cGU6ICcke3RoaXMuc2VxQ29sLnNlbVR5cGV9JykuYDtcbiAgICAgICAgdGhpcy5tc2dIb3N0IS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1zZ0hvc3QhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8ICF0aGlzLmNwIHx8XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IHRoaXMuZW5kUG9zaXRpb24gPT09IC0xKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZyA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFnKSByZXR1cm47XG5cbiAgICBpZiAocmVjYWxjKVxuICAgICAgdGhpcy5fY2FsY3VsYXRlKCk7XG5cbiAgICAvLyBsZXQgcm93Q291bnQgPSB0aGlzLnJvd3NNYXNrZWQ7XG4gICAgLy8gaWYgKCF0aGlzLmNvbnNpZGVyTnVsbFNlcXVlbmNlcylcbiAgICAvLyAgIHJvd0NvdW50IC09IHRoaXMucm93c051bGw7XG5cbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgLy9nLmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICBnLmZpbGxTdHlsZSA9ICd3aGl0ZSc7XG4gICAgZy5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICBnLnRleHRCYXNlbGluZSA9IHRoaXMudGV4dEJhc2VsaW5lO1xuXG4gICAgLy8jcmVnaW9uIFBsb3QgcG9zaXRpb25OYW1lc1xuICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICBnLmZpbGxTdHlsZSA9ICdibGFjayc7XG4gICAgZy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBnLmZvbnQgPSAnMTBweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgY29uc3QgcG9zTmFtZU1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5wb3NpdGlvbnMubWFwKChwb3MpID0+IGcubWVhc3VyZVRleHQocG9zLm5hbWUpLndpZHRoKSk7XG4gICAgY29uc3QgaFNjYWxlID0gcG9zTmFtZU1heFdpZHRoIDwgKHRoaXMucG9zaXRpb25XaWR0aCAtIDIpID8gMSA6ICh0aGlzLnBvc2l0aW9uV2lkdGggLSAyKSAvIHBvc05hbWVNYXhXaWR0aDtcblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zOiBQb3NpdGlvbkluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcbiAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgIGcuc2V0VHJhbnNmb3JtKFxuICAgICAgICBoU2NhbGUsIDAsIDAsIDEsXG4gICAgICAgIGpQb3MgKiB0aGlzLnBvc2l0aW9uV2lkdGggKyB0aGlzLnBvc2l0aW9uV2lkdGggLyAyLCAwKTtcbiAgICAgIGcuZmlsbFRleHQocG9zLm5hbWUsIDAsIDApO1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb24gUGxvdCBwb3NpdGlvbk5hbWVzXG5cbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIGZvciAoY29uc3QgW21vbm9tZXIsIHBtSW5mb10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcSkpIHtcbiAgICAgICAgaWYgKG1vbm9tZXIgIT09ICctJykge1xuICAgICAgICAgIGNvbnN0IGIgPSBwbUluZm8uYm91bmRzO1xuXG4gICAgICAgICAgY29uc3QgZm9udFN0eWxlID0gJzE2cHggUm9ib3RvLCBSb2JvdG8gTG9jYWwsIHNhbnMtc2VyaWYnO1xuICAgICAgICAgIC8vIEhhY2tzIHRvIHNjYWxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIHRvIHRhcmdldCByZWN0YW5nbGVcbiAgICAgICAgICBjb25zdCB1cHBlcmNhc2VMZXR0ZXJBc2NlbnQgPSAwLjI1O1xuICAgICAgICAgIGNvbnN0IHVwcGVyY2FzZUxldHRlckhlaWdodCA9IDEyLjI7XG5cbiAgICAgICAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdsaWdodGdyYXknO1xuICAgICAgICAgIGcubGluZVdpZHRoID0gMTtcbiAgICAgICAgICBnLnJlY3QoYi5sZWZ0LCBiLnRvcCwgYi53aWR0aCwgYi5oZWlnaHQpO1xuICAgICAgICAgIGcuZmlsbFN0eWxlID0gdGhpcy5jcFttb25vbWVyXSA/PyB0aGlzLmNwWydvdGhlciddO1xuICAgICAgICAgIGcudGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgIGcuZm9udCA9IGZvbnRTdHlsZTtcbiAgICAgICAgICAvL2cuZmlsbFJlY3QoYi5sZWZ0LCBiLnRvcCwgYi53aWR0aCwgYi5oZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IG1UbTogVGV4dE1ldHJpY3MgPSBnLm1lYXN1cmVUZXh0KG1vbm9tZXIpO1xuXG4gICAgICAgICAgLy8gaWYgKG1NLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50ICE9IDApXG4gICAgICAgICAgLy8gICBjb25zb2xlLmRlYnVnKGBtOiAke219LCBtTS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDogJHttTS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudH1gKTtcblxuICAgICAgICAgIGcuc2V0VHJhbnNmb3JtKFxuICAgICAgICAgICAgYi53aWR0aCAvIG1UbS53aWR0aCwgMCwgMCwgYi5oZWlnaHQgLyB1cHBlcmNhc2VMZXR0ZXJIZWlnaHQsXG4gICAgICAgICAgICBiLmxlZnQsIGIudG9wKTtcbiAgICAgICAgICBnLmZpbGxUZXh0KG1vbm9tZXIsIDAsIC11cHBlcmNhc2VMZXR0ZXJBc2NlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=