@auscope/angular2parse 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.editorconfig +13 -0
  2. package/angular.json +27 -0
  3. package/package.json +38 -41
  4. package/projects/angular2parse/README.md +49 -0
  5. package/projects/angular2parse/ng-package.json +7 -0
  6. package/projects/angular2parse/package.json +18 -0
  7. package/projects/angular2parse/src/lib/angular/compiler/assertions.ts +49 -0
  8. package/projects/angular2parse/src/lib/angular/compiler/ast.ts +393 -0
  9. package/projects/angular2parse/src/lib/angular/compiler/chars.ts +89 -0
  10. package/projects/angular2parse/src/lib/angular/compiler/interpolation-config.ts +25 -0
  11. package/projects/angular2parse/src/lib/angular/compiler/lexer.ts +383 -0
  12. package/projects/angular2parse/src/lib/angular/compiler/parser.ts +811 -0
  13. package/{lib/angular/compiler.d.ts → projects/angular2parse/src/lib/angular/compiler.ts} +1 -1
  14. package/projects/angular2parse/src/lib/angular/facade/lang.ts +124 -0
  15. package/projects/angular2parse/src/lib/angular/facade.ts +1 -0
  16. package/{lib/angular.d.ts → projects/angular2parse/src/lib/angular.ts} +1 -1
  17. package/projects/angular2parse/src/lib/module.ts +12 -0
  18. package/projects/angular2parse/src/lib/parse.ts +78 -0
  19. package/projects/angular2parse/src/lib/util/binary-operations.ts +17 -0
  20. package/projects/angular2parse/src/lib/util/lang.ts +15 -0
  21. package/{lib/util.d.ts → projects/angular2parse/src/lib/util.ts} +1 -1
  22. package/projects/angular2parse/src/lib/visitors/parse-visitor-compiler.ts +149 -0
  23. package/projects/angular2parse/src/lib/visitors/parse-visitor-resolver.ts +208 -0
  24. package/projects/angular2parse/src/lib/visitors.ts +2 -0
  25. package/projects/angular2parse/src/public-api.ts +5 -0
  26. package/projects/angular2parse/tsconfig.lib.json +20 -0
  27. package/projects/angular2parse/tsconfig.lib.prod.json +9 -0
  28. package/target/npmlist.json +1 -0
  29. package/tsconfig.json +32 -0
  30. package/auscope-angular2parse.d.ts +0 -5
  31. package/esm2020/auscope-angular2parse.mjs +0 -5
  32. package/esm2020/lib/angular/compiler/assertions.mjs +0 -45
  33. package/esm2020/lib/angular/compiler/ast.mjs +0 -393
  34. package/esm2020/lib/angular/compiler/chars.mjs +0 -78
  35. package/esm2020/lib/angular/compiler/interpolation-config.mjs +0 -24
  36. package/esm2020/lib/angular/compiler/lexer.mjs +0 -344
  37. package/esm2020/lib/angular/compiler/parser.mjs +0 -721
  38. package/esm2020/lib/angular/compiler.mjs +0 -7
  39. package/esm2020/lib/angular/facade/lang.mjs +0 -85
  40. package/esm2020/lib/angular/facade.mjs +0 -2
  41. package/esm2020/lib/angular.mjs +0 -3
  42. package/esm2020/lib/module.mjs +0 -18
  43. package/esm2020/lib/parse.mjs +0 -66
  44. package/esm2020/lib/util/binary-operations.mjs +0 -18
  45. package/esm2020/lib/util/lang.mjs +0 -13
  46. package/esm2020/lib/util.mjs +0 -3
  47. package/esm2020/lib/visitors/parse-visitor-compiler.mjs +0 -96
  48. package/esm2020/lib/visitors/parse-visitor-resolver.mjs +0 -141
  49. package/esm2020/lib/visitors.mjs +0 -3
  50. package/esm2020/public-api.mjs +0 -6
  51. package/fesm2015/auscope-angular2parse.mjs +0 -2035
  52. package/fesm2015/auscope-angular2parse.mjs.map +0 -1
  53. package/fesm2020/auscope-angular2parse.mjs +0 -2033
  54. package/fesm2020/auscope-angular2parse.mjs.map +0 -1
  55. package/lib/angular/compiler/assertions.d.ts +0 -9
  56. package/lib/angular/compiler/ast.d.ts +0 -242
  57. package/lib/angular/compiler/chars.d.ts +0 -69
  58. package/lib/angular/compiler/interpolation-config.d.ts +0 -14
  59. package/lib/angular/compiler/lexer.d.ts +0 -44
  60. package/lib/angular/compiler/parser.d.ts +0 -92
  61. package/lib/angular/facade/lang.d.ts +0 -44
  62. package/lib/angular/facade.d.ts +0 -1
  63. package/lib/module.d.ts +0 -9
  64. package/lib/parse.d.ts +0 -21
  65. package/lib/util/binary-operations.d.ts +0 -1
  66. package/lib/util/lang.d.ts +0 -4
  67. package/lib/visitors/parse-visitor-compiler.d.ts +0 -23
  68. package/lib/visitors/parse-visitor-resolver.d.ts +0 -25
  69. package/lib/visitors.d.ts +0 -2
  70. package/public-api.d.ts +0 -2
@@ -1,24 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google Inc. All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { assertInterpolationSymbols } from './assertions';
9
- export class InterpolationConfig {
10
- constructor(start, end) {
11
- this.start = start;
12
- this.end = end;
13
- }
14
- static fromArray(markers) {
15
- if (!markers) {
16
- return DEFAULT_INTERPOLATION_CONFIG;
17
- }
18
- assertInterpolationSymbols('interpolation', markers);
19
- return new InterpolationConfig(markers[0], markers[1]);
20
- }
21
- ;
22
- }
23
- export const DEFAULT_INTERPOLATION_CONFIG = new InterpolationConfig('{{', '}}');
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJwb2xhdGlvbi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyMnBhcnNlL3NyYy9saWIvYW5ndWxhci9jb21waWxlci9pbnRlcnBvbGF0aW9uLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFeEQsTUFBTSxPQUFPLG1CQUFtQjtJQVU1QixZQUFtQixLQUFhLEVBQVMsR0FBVztRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBUTtJQUFFLENBQUM7SUFUdkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUF5QjtRQUN0QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTyw0QkFBNEIsQ0FBQztTQUN2QztRQUVELDBCQUEwQixDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFc0QsQ0FBQztDQUMzRDtBQUVELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUNyQyxJQUFJLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICpcclxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcclxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7YXNzZXJ0SW50ZXJwb2xhdGlvblN5bWJvbHN9IGZyb20gJy4vYXNzZXJ0aW9ucyc7XHJcblxyXG5leHBvcnQgY2xhc3MgSW50ZXJwb2xhdGlvbkNvbmZpZyB7XHJcbiAgICBzdGF0aWMgZnJvbUFycmF5KG1hcmtlcnM6IFtzdHJpbmcsIHN0cmluZ10pOiBJbnRlcnBvbGF0aW9uQ29uZmlnIHtcclxuICAgICAgICBpZiAoIW1hcmtlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnRJbnRlcnBvbGF0aW9uU3ltYm9scygnaW50ZXJwb2xhdGlvbicsIG1hcmtlcnMpO1xyXG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGlvbkNvbmZpZyhtYXJrZXJzWzBdLCBtYXJrZXJzWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgc3RhcnQ6IHN0cmluZywgcHVibGljIGVuZDogc3RyaW5nKXt9O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRzogSW50ZXJwb2xhdGlvbkNvbmZpZyA9XHJcbiAgICBuZXcgSW50ZXJwb2xhdGlvbkNvbmZpZygne3snLCAnfX0nKTsiXX0=
@@ -1,344 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google Inc. All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import * as chars from './chars';
9
- import { NumberWrapper } from '../facade/lang';
10
- export var TokenType;
11
- (function (TokenType) {
12
- TokenType[TokenType["Character"] = 0] = "Character";
13
- TokenType[TokenType["Identifier"] = 1] = "Identifier";
14
- TokenType[TokenType["Keyword"] = 2] = "Keyword";
15
- TokenType[TokenType["String"] = 3] = "String";
16
- TokenType[TokenType["Operator"] = 4] = "Operator";
17
- TokenType[TokenType["Number"] = 5] = "Number";
18
- TokenType[TokenType["Error"] = 6] = "Error";
19
- })(TokenType || (TokenType = {}));
20
- const KEYWORDS = ['var', 'let', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];
21
- export class Lexer {
22
- tokenize(text) {
23
- const scanner = new _Scanner(text);
24
- const tokens = [];
25
- let token = scanner.scanToken();
26
- while (token != null) {
27
- tokens.push(token);
28
- token = scanner.scanToken();
29
- }
30
- return tokens;
31
- }
32
- }
33
- export class Token {
34
- constructor(index, type, numValue, strValue) {
35
- this.index = index;
36
- this.type = type;
37
- this.numValue = numValue;
38
- this.strValue = strValue;
39
- }
40
- isCharacter(code) {
41
- return this.type == TokenType.Character && this.numValue == code;
42
- }
43
- isNumber() { return this.type == TokenType.Number; }
44
- isString() { return this.type == TokenType.String; }
45
- isOperator(operater) {
46
- return this.type == TokenType.Operator && this.strValue == operater;
47
- }
48
- isIdentifier() { return this.type == TokenType.Identifier; }
49
- isKeyword() { return this.type == TokenType.Keyword; }
50
- isKeywordLet() { return this.type == TokenType.Keyword && this.strValue == 'let'; }
51
- isKeywordNull() { return this.type == TokenType.Keyword && this.strValue == 'null'; }
52
- isKeywordUndefined() {
53
- return this.type == TokenType.Keyword && this.strValue == 'undefined';
54
- }
55
- isKeywordTrue() { return this.type == TokenType.Keyword && this.strValue == 'true'; }
56
- isKeywordFalse() { return this.type == TokenType.Keyword && this.strValue == 'false'; }
57
- isKeywordThis() { return this.type == TokenType.Keyword && this.strValue == 'this'; }
58
- isError() { return this.type == TokenType.Error; }
59
- toNumber() { return this.type == TokenType.Number ? this.numValue : -1; }
60
- toString() {
61
- switch (this.type) {
62
- case TokenType.Character:
63
- case TokenType.Identifier:
64
- case TokenType.Keyword:
65
- case TokenType.Operator:
66
- case TokenType.String:
67
- case TokenType.Error:
68
- return this.strValue;
69
- case TokenType.Number:
70
- return this.numValue.toString();
71
- default:
72
- return null;
73
- }
74
- }
75
- }
76
- function newCharacterToken(index, code) {
77
- return new Token(index, TokenType.Character, code, String.fromCharCode(code));
78
- }
79
- function newIdentifierToken(index, text) {
80
- return new Token(index, TokenType.Identifier, 0, text);
81
- }
82
- function newKeywordToken(index, text) {
83
- return new Token(index, TokenType.Keyword, 0, text);
84
- }
85
- function newOperatorToken(index, text) {
86
- return new Token(index, TokenType.Operator, 0, text);
87
- }
88
- function newStringToken(index, text) {
89
- return new Token(index, TokenType.String, 0, text);
90
- }
91
- function newNumberToken(index, n) {
92
- return new Token(index, TokenType.Number, n, '');
93
- }
94
- function newErrorToken(index, message) {
95
- return new Token(index, TokenType.Error, 0, message);
96
- }
97
- export const EOF = new Token(-1, TokenType.Character, 0, '');
98
- class _Scanner {
99
- constructor(input) {
100
- this.input = input;
101
- this.peek = 0;
102
- this.index = -1;
103
- this.length = input.length;
104
- this.advance();
105
- }
106
- advance() {
107
- this.peek = ++this.index >= this.length ? chars.$EOF : this.input.charCodeAt(this.index);
108
- }
109
- scanToken() {
110
- const input = this.input, length = this.length;
111
- let peek = this.peek, index = this.index;
112
- // Skip whitespace.
113
- while (peek <= chars.$SPACE) {
114
- if (++index >= length) {
115
- peek = chars.$EOF;
116
- break;
117
- }
118
- else {
119
- peek = input.charCodeAt(index);
120
- }
121
- }
122
- this.peek = peek;
123
- this.index = index;
124
- if (index >= length) {
125
- return null;
126
- }
127
- // Handle identifiers and numbers.
128
- if (isIdentifierStart(peek))
129
- return this.scanIdentifier();
130
- if (chars.isDigit(peek))
131
- return this.scanNumber(index);
132
- const start = index;
133
- switch (peek) {
134
- case chars.$PERIOD:
135
- this.advance();
136
- return chars.isDigit(this.peek) ? this.scanNumber(start) :
137
- newCharacterToken(start, chars.$PERIOD);
138
- case chars.$LPAREN:
139
- case chars.$RPAREN:
140
- case chars.$LBRACE:
141
- case chars.$RBRACE:
142
- case chars.$LBRACKET:
143
- case chars.$RBRACKET:
144
- case chars.$COMMA:
145
- case chars.$COLON:
146
- case chars.$SEMICOLON:
147
- return this.scanCharacter(start, peek);
148
- case chars.$SQ:
149
- case chars.$DQ:
150
- return this.scanString();
151
- case chars.$HASH:
152
- case chars.$PLUS:
153
- case chars.$MINUS:
154
- case chars.$STAR:
155
- case chars.$SLASH:
156
- case chars.$PERCENT:
157
- case chars.$CARET:
158
- return this.scanOperator(start, String.fromCharCode(peek));
159
- case chars.$QUESTION:
160
- return this.scanComplexOperator(start, '?', chars.$PERIOD, '.');
161
- case chars.$LT:
162
- case chars.$GT:
163
- return this.scanComplexOperator(start, String.fromCharCode(peek), chars.$EQ, '=');
164
- case chars.$BANG:
165
- case chars.$EQ:
166
- return this.scanComplexOperator(start, String.fromCharCode(peek), chars.$EQ, '=', chars.$EQ, '=');
167
- case chars.$AMPERSAND:
168
- return this.scanComplexOperator(start, '&', chars.$AMPERSAND, '&');
169
- case chars.$BAR:
170
- return this.scanComplexOperator(start, '|', chars.$BAR, '|');
171
- case chars.$NBSP:
172
- while (chars.isWhitespace(this.peek))
173
- this.advance();
174
- return this.scanToken();
175
- }
176
- this.advance();
177
- return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0);
178
- }
179
- scanCharacter(start, code) {
180
- this.advance();
181
- return newCharacterToken(start, code);
182
- }
183
- scanOperator(start, str) {
184
- this.advance();
185
- return newOperatorToken(start, str);
186
- }
187
- /**
188
- * Tokenize a 2/3 char long operator
189
- *
190
- * @param start start index in the expression
191
- * @param one first symbol (always part of the operator)
192
- * @param twoCode code point for the second symbol
193
- * @param two second symbol (part of the operator when the second code point matches)
194
- * @param threeCode code point for the third symbol
195
- * @param three third symbol (part of the operator when provided and matches source expression)
196
- * @returns {Token}
197
- */
198
- scanComplexOperator(start, one, twoCode, two, threeCode, three) {
199
- this.advance();
200
- let str = one;
201
- if (this.peek == twoCode) {
202
- this.advance();
203
- str += two;
204
- }
205
- if (threeCode != null && this.peek == threeCode) {
206
- this.advance();
207
- str += three;
208
- }
209
- return newOperatorToken(start, str);
210
- }
211
- scanIdentifier() {
212
- const start = this.index;
213
- this.advance();
214
- while (isIdentifierPart(this.peek))
215
- this.advance();
216
- const str = this.input.substring(start, this.index);
217
- return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :
218
- newIdentifierToken(start, str);
219
- }
220
- scanNumber(start) {
221
- let simple = (this.index === start);
222
- this.advance(); // Skip initial digit.
223
- while (true) {
224
- if (chars.isDigit(this.peek)) {
225
- // Do nothing.
226
- }
227
- else if (this.peek == chars.$PERIOD) {
228
- simple = false;
229
- }
230
- else if (isExponentStart(this.peek)) {
231
- this.advance();
232
- if (isExponentSign(this.peek))
233
- this.advance();
234
- if (!chars.isDigit(this.peek))
235
- return this.error('Invalid exponent', -1);
236
- simple = false;
237
- }
238
- else {
239
- break;
240
- }
241
- this.advance();
242
- }
243
- const str = this.input.substring(start, this.index);
244
- const value = simple ? NumberWrapper.parseIntAutoRadix(str) : parseFloat(str);
245
- return newNumberToken(start, value);
246
- }
247
- scanString() {
248
- const start = this.index;
249
- const quote = this.peek;
250
- this.advance(); // Skip initial quote.
251
- let buffer = '';
252
- let marker = this.index;
253
- const input = this.input;
254
- while (this.peek != quote) {
255
- if (this.peek == chars.$BACKSLASH) {
256
- buffer += input.substring(marker, this.index);
257
- this.advance();
258
- let unescapedCode;
259
- // Workaround for TS2.1-introduced type strictness
260
- this.peek = this.peek;
261
- if (this.peek == chars.$u) {
262
- // 4 character hex code for unicode character.
263
- const hex = input.substring(this.index + 1, this.index + 5);
264
- if (/^[0-9a-f]+$/i.test(hex)) {
265
- unescapedCode = parseInt(hex, 16);
266
- }
267
- else {
268
- return this.error(`Invalid unicode escape [\\u${hex}]`, 0);
269
- }
270
- for (let i = 0; i < 5; i++) {
271
- this.advance();
272
- }
273
- }
274
- else {
275
- unescapedCode = unescape(this.peek);
276
- this.advance();
277
- }
278
- buffer += String.fromCharCode(unescapedCode);
279
- marker = this.index;
280
- }
281
- else if (this.peek == chars.$EOF) {
282
- return this.error('Unterminated quote', 0);
283
- }
284
- else {
285
- this.advance();
286
- }
287
- }
288
- const last = input.substring(marker, this.index);
289
- this.advance(); // Skip terminating quote.
290
- return newStringToken(start, buffer + last);
291
- }
292
- error(message, offset) {
293
- const position = this.index + offset;
294
- return newErrorToken(position, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`);
295
- }
296
- }
297
- function isIdentifierStart(code) {
298
- return (chars.$a <= code && code <= chars.$z) || (chars.$A <= code && code <= chars.$Z) ||
299
- (code == chars.$_) || (code == chars.$$);
300
- }
301
- export function isIdentifier(input) {
302
- if (input.length == 0)
303
- return false;
304
- const scanner = new _Scanner(input);
305
- if (!isIdentifierStart(scanner.peek))
306
- return false;
307
- scanner.advance();
308
- while (scanner.peek !== chars.$EOF) {
309
- if (!isIdentifierPart(scanner.peek))
310
- return false;
311
- scanner.advance();
312
- }
313
- return true;
314
- }
315
- function isIdentifierPart(code) {
316
- return chars.isAsciiLetter(code) || chars.isDigit(code) || (code == chars.$_) ||
317
- (code == chars.$$);
318
- }
319
- function isExponentStart(code) {
320
- return code == chars.$e || code == chars.$E;
321
- }
322
- function isExponentSign(code) {
323
- return code == chars.$MINUS || code == chars.$PLUS;
324
- }
325
- export function isQuote(code) {
326
- return code === chars.$SQ || code === chars.$DQ || code === chars.$BT;
327
- }
328
- function unescape(code) {
329
- switch (code) {
330
- case chars.$n:
331
- return chars.$LF;
332
- case chars.$f:
333
- return chars.$FF;
334
- case chars.$r:
335
- return chars.$CR;
336
- case chars.$t:
337
- return chars.$TAB;
338
- case chars.$v:
339
- return chars.$VTAB;
340
- default:
341
- return code;
342
- }
343
- }
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyMnBhcnNlL3NyYy9saWIvYW5ndWxhci9jb21waWxlci9sZXhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsTUFBTSxDQUFOLElBQVksU0FRWDtBQVJELFdBQVksU0FBUztJQUNqQixtREFBUyxDQUFBO0lBQ1QscURBQVUsQ0FBQTtJQUNWLCtDQUFPLENBQUE7SUFDUCw2Q0FBTSxDQUFBO0lBQ04saURBQVEsQ0FBQTtJQUNSLDZDQUFNLENBQUE7SUFDTiwyQ0FBSyxDQUFBO0FBQ1QsQ0FBQyxFQVJXLFNBQVMsS0FBVCxTQUFTLFFBUXBCO0FBRUQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTVGLE1BQU0sT0FBTyxLQUFLO0lBQ2QsUUFBUSxDQUFDLElBQVk7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsTUFBTSxNQUFNLEdBQVksRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFP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RyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFZO0lBQzFCLFFBQVEsSUFBSSxFQUFFO1FBQ1YsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNyQixLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3JCLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDckIsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQztRQUN0QixLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3ZCO1lBQ0ksT0FBTyxJQUFJLENBQUM7S0FDbkI7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKlxyXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxyXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXHJcbiAqL1xyXG5cclxuaW1wb3J0ICogYXMgY2hhcnMgZnJvbSAnLi9jaGFycyc7XHJcbmltcG9ydCB7TnVtYmVyV3JhcHBlcn0gZnJvbSAnLi4vZmFjYWRlL2xhbmcnO1xyXG5cclxuZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcclxuICAgIENoYXJhY3RlcixcclxuICAgIElkZW50aWZpZXIsXHJcbiAgICBLZXl3b3JkLFxyXG4gICAgU3RyaW5nLFxyXG4gICAgT3BlcmF0b3IsXHJcbiAgICBOdW1iZXIsXHJcbiAgICBFcnJvclxyXG59XHJcblxyXG5jb25zdCBLRVlXT1JEUyA9IFsndmFyJywgJ2xldCcsICdudWxsJywgJ3VuZGVmaW5lZCcsICd0cnVlJywgJ2ZhbHNlJywgJ2lmJywgJ2Vsc2UnLCAndGhpcyddO1xyXG5cclxuZXhwb3J0IGNsYXNzIExleGVyIHtcclxuICAgIHRva2VuaXplKHRleHQ6IHN0cmluZyk6IFRva2VuW10ge1xyXG4gICAgICAgIGNvbnN0IHNjYW5uZXIgPSBuZXcgX1NjYW5uZXIodGV4dCk7XHJcbiAgICAgICAgY29uc3QgdG9rZW5zOiBUb2tlbltdID0gW107XHJcbiAgICAgICAgbGV0IHRva2VuID0gc2Nhbm5lci5zY2FuVG9rZW4oKTtcclxuICAgICAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XHJcbiAgICAgICAgICAgIHRva2VuID0gc2Nhbm5lci5zY2FuVG9rZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRva2VucztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRva2VuIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgdHlwZTogVG9rZW5UeXBlLCBwdWJsaWMgbnVtVmFsdWU6IG51bWJlcixcclxuICAgICAgICBwdWJsaWMgc3RyVmFsdWU6IHN0cmluZykge31cclxuXHJcbiAgICBpc0NoYXJhY3Rlcihjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5DaGFyYWN0ZXIgJiYgdGhpcy5udW1WYWx1ZSA9PSBjb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTnVtYmVyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5OdW1iZXI7IH1cclxuXHJcbiAgICBpc1N0cmluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nOyB9XHJcblxyXG4gICAgaXNPcGVyYXRvcihvcGVyYXRlcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IgJiYgdGhpcy5zdHJWYWx1ZSA9PSBvcGVyYXRlcjtcclxuICAgIH1cclxuXHJcbiAgICBpc0lkZW50aWZpZXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLklkZW50aWZpZXI7IH1cclxuXHJcbiAgICBpc0tleXdvcmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQ7IH1cclxuXHJcbiAgICBpc0tleXdvcmRMZXQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQgJiYgdGhpcy5zdHJWYWx1ZSA9PSAnbGV0JzsgfVxyXG5cclxuICAgIGlzS2V5d29yZE51bGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQgJiYgdGhpcy5zdHJWYWx1ZSA9PSAnbnVsbCc7IH1cclxuXHJcbiAgICBpc0tleXdvcmRVbmRlZmluZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICd1bmRlZmluZWQnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzS2V5d29yZFRydWUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQgJiYgdGhpcy5zdHJWYWx1ZSA9PSAndHJ1ZSc7IH1cclxuXHJcbiAgICBpc0tleXdvcmRGYWxzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICdmYWxzZSc7IH1cclxuXHJcbiAgICBpc0tleXdvcmRUaGlzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gJ3RoaXMnOyB9XHJcblxyXG4gICAgaXNFcnJvcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuRXJyb3I7IH1cclxuXHJcbiAgICB0b051bWJlcigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5OdW1iZXIgPyB0aGlzLm51bVZhbHVlIDogLTE7IH1cclxuXHJcbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkNoYXJhY3RlcjpcclxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSWRlbnRpZmllcjpcclxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuS2V5d29yZDpcclxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuT3BlcmF0b3I6XHJcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLlN0cmluZzpcclxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuRXJyb3I6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJWYWx1ZTtcclxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuTnVtYmVyOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtVmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbmV3Q2hhcmFjdGVyVG9rZW4oaW5kZXg6IG51bWJlciwgY29kZTogbnVtYmVyKTogVG9rZW4ge1xyXG4gICAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLkNoYXJhY3RlciwgY29kZSwgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5ld0lkZW50aWZpZXJUb2tlbihpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBUb2tlbiB7XHJcbiAgICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuSWRlbnRpZmllciwgMCwgdGV4dCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5ld0tleXdvcmRUb2tlbihpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBUb2tlbiB7XHJcbiAgICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuS2V5d29yZCwgMCwgdGV4dCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5ld09wZXJhdG9yVG9rZW4oaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogVG9rZW4ge1xyXG4gICAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLk9wZXJhdG9yLCAwLCB0ZXh0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gbmV3U3RyaW5nVG9rZW4oaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogVG9rZW4ge1xyXG4gICAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLlN0cmluZywgMCwgdGV4dCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5ld051bWJlclRva2VuKGluZGV4OiBudW1iZXIsIG46IG51bWJlcik6IFRva2VuIHtcclxuICAgIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5OdW1iZXIsIG4sICcnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbmV3RXJyb3JUb2tlbihpbmRleDogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBUb2tlbiB7XHJcbiAgICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuRXJyb3IsIDAsIG1lc3NhZ2UpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgRU9GOiBUb2tlbiA9IG5ldyBUb2tlbigtMSwgVG9rZW5UeXBlLkNoYXJhY3RlciwgMCwgJycpO1xyXG5cclxuY2xhc3MgX1NjYW5uZXIge1xyXG4gICAgbGVuZ3RoOiBudW1iZXI7XHJcbiAgICBwZWVrOiBudW1iZXIgPSAwO1xyXG4gICAgaW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpbnB1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSBpbnB1dC5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWR2YW5jZSgpIHtcclxuICAgICAgICB0aGlzLnBlZWsgPSArK3RoaXMuaW5kZXggPj0gdGhpcy5sZW5ndGggPyBjaGFycy4kRU9GIDogdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjYW5Ub2tlbigpOiBUb2tlbiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0LCBsZW5ndGggPSB0aGlzLmxlbmd0aDtcclxuICAgICAgICBsZXQgcGVlayA9IHRoaXMucGVlaywgaW5kZXggPSB0aGlzLmluZGV4O1xyXG5cclxuICAgICAgICAvLyBTa2lwIHdoaXRlc3BhY2UuXHJcbiAgICAgICAgd2hpbGUgKHBlZWsgPD0gY2hhcnMuJFNQQUNFKSB7XHJcbiAgICAgICAgICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcGVlayA9IGNoYXJzLiRFT0Y7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBlZWsgPSBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wZWVrID0gcGVlaztcclxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBIYW5kbGUgaWRlbnRpZmllcnMgYW5kIG51bWJlcnMuXHJcbiAgICAgICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHBlZWspKSByZXR1cm4gdGhpcy5zY2FuSWRlbnRpZmllcigpO1xyXG4gICAgICAgIGlmIChjaGFycy5pc0RpZ2l0KHBlZWspKSByZXR1cm4gdGhpcy5zY2FuTnVtYmVyKGluZGV4KTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnQ6IG51bWJlciA9IGluZGV4O1xyXG4gICAgICAgIHN3aXRjaCAocGVlaykge1xyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRQRVJJT0Q6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjaGFycy5pc0RpZ2l0KHRoaXMucGVlaykgPyB0aGlzLnNjYW5OdW1iZXIoc3RhcnQpIDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdDaGFyYWN0ZXJUb2tlbihzdGFydCwgY2hhcnMuJFBFUklPRCk7XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJExQQVJFTjpcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kUlBBUkVOOlxyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRMQlJBQ0U6XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJFJCUkFDRTpcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kTEJSQUNLRVQ6XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJFJCUkFDS0VUOlxyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRDT01NQTpcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kQ09MT046XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJFNFTUlDT0xPTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5DaGFyYWN0ZXIoc3RhcnQsIHBlZWspO1xyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRTUTpcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kRFE6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJEhBU0g6XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJFBMVVM6XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJE1JTlVTOlxyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRTVEFSOlxyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRTTEFTSDpcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kUEVSQ0VOVDpcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kQ0FSRVQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuT3BlcmF0b3Ioc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUocGVlaykpO1xyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRRVUVTVElPTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICc/JywgY2hhcnMuJFBFUklPRCwgJy4nKTtcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJEdUOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgU3RyaW5nLmZyb21DaGFyQ29kZShwZWVrKSwgY2hhcnMuJEVRLCAnPScpO1xyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRCQU5HOlxyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiRFUTpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUocGVlayksIGNoYXJzLiRFUSwgJz0nLCBjaGFycy4kRVEsICc9Jyk7XHJcbiAgICAgICAgICAgIGNhc2UgY2hhcnMuJEFNUEVSU0FORDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICcmJywgY2hhcnMuJEFNUEVSU0FORCwgJyYnKTtcclxuICAgICAgICAgICAgY2FzZSBjaGFycy4kQkFSOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgJ3wnLCBjaGFycy4kQkFSLCAnfCcpO1xyXG4gICAgICAgICAgICBjYXNlIGNoYXJzLiROQlNQOlxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoYXJzLmlzV2hpdGVzcGFjZSh0aGlzLnBlZWspKSB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Ub2tlbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIFske1N0cmluZy5mcm9tQ2hhckNvZGUocGVlayl9XWAsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNjYW5DaGFyYWN0ZXIoc3RhcnQ6IG51bWJlciwgY29kZTogbnVtYmVyKTogVG9rZW4ge1xyXG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xyXG4gICAgICAgIHJldHVybiBuZXdDaGFyYWN0ZXJUb2tlbihzdGFydCwgY29kZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHNjYW5PcGVyYXRvcihzdGFydDogbnVtYmVyLCBzdHI6IHN0cmluZyk6IFRva2VuIHtcclxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICByZXR1cm4gbmV3T3BlcmF0b3JUb2tlbihzdGFydCwgc3RyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRva2VuaXplIGEgMi8zIGNoYXIgbG9uZyBvcGVyYXRvclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleCBpbiB0aGUgZXhwcmVzc2lvblxyXG4gICAgICogQHBhcmFtIG9uZSBmaXJzdCBzeW1ib2wgKGFsd2F5cyBwYXJ0IG9mIHRoZSBvcGVyYXRvcilcclxuICAgICAqIEBwYXJhbSB0d29Db2RlIGNvZGUgcG9pbnQgZm9yIHRoZSBzZWNvbmQgc3ltYm9sXHJcbiAgICAgKiBAcGFyYW0gdHdvIHNlY29uZCBzeW1ib2wgKHBhcnQgb2YgdGhlIG9wZXJhdG9yIHdoZW4gdGhlIHNlY29uZCBjb2RlIHBvaW50IG1hdGNoZXMpXHJcbiAgICAgKiBAcGFyYW0gdGhyZWVDb2RlIGNvZGUgcG9pbnQgZm9yIHRoZSB0aGlyZCBzeW1ib2xcclxuICAgICAqIEBwYXJhbSB0aHJlZSB0aGlyZCBzeW1ib2wgKHBhcnQgb2YgdGhlIG9wZXJhdG9yIHdoZW4gcHJvdmlkZWQgYW5kIG1hdGNoZXMgc291cmNlIGV4cHJlc3Npb24pXHJcbiAgICAgKiBAcmV0dXJucyB7VG9rZW59XHJcbiAgICAgKi9cclxuICAgIHNjYW5Db21wbGV4T3BlcmF0b3IoXHJcbiAgICAgICAgc3RhcnQ6IG51bWJlciwgb25lOiBzdHJpbmcsIHR3b0NvZGU6IG51bWJlciwgdHdvOiBzdHJpbmcsIHRocmVlQ29kZT86IG51bWJlcixcclxuICAgICAgICB0aHJlZT86IHN0cmluZyk6IFRva2VuIHtcclxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmcgPSBvbmU7XHJcbiAgICAgICAgaWYgKHRoaXMucGVlayA9PSB0d29Db2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xyXG4gICAgICAgICAgICBzdHIgKz0gdHdvO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhyZWVDb2RlICE9IG51bGwgJiYgdGhpcy5wZWVrID09IHRocmVlQ29kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgc3RyICs9IHRocmVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3T3BlcmF0b3JUb2tlbihzdGFydCwgc3RyKTtcclxuICAgIH1cclxuXHJcbiAgICBzY2FuSWRlbnRpZmllcigpOiBUb2tlbiB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQ6IG51bWJlciA9IHRoaXMuaW5kZXg7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XHJcbiAgICAgICAgd2hpbGUgKGlzSWRlbnRpZmllclBhcnQodGhpcy5wZWVrKSkgdGhpcy5hZHZhbmNlKCk7XHJcbiAgICAgICAgY29uc3Qgc3RyOiBzdHJpbmcgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydCwgdGhpcy5pbmRleCk7XHJcbiAgICAgICAgcmV0dXJuIEtFWVdPUkRTLmluZGV4T2Yoc3RyKSA+IC0xID8gbmV3S2V5d29yZFRva2VuKHN0YXJ0LCBzdHIpIDpcclxuICAgICAgICAgICAgbmV3SWRlbnRpZmllclRva2VuKHN0YXJ0LCBzdHIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjYW5OdW1iZXIoc3RhcnQ6IG51bWJlcik6IFRva2VuIHtcclxuICAgICAgICBsZXQgc2ltcGxlOiBib29sZWFuID0gKHRoaXMuaW5kZXggPT09IHN0YXJ0KTtcclxuICAgICAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgaW5pdGlhbCBkaWdpdC5cclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoY2hhcnMuaXNEaWdpdCh0aGlzLnBlZWspKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLlxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGVlayA9PSBjaGFycy4kUEVSSU9EKSB7XHJcbiAgICAgICAgICAgICAgICBzaW1wbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0V4cG9uZW50U3RhcnQodGhpcy5wZWVrKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNFeHBvbmVudFNpZ24odGhpcy5wZWVrKSkgdGhpcy5hZHZhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNoYXJzLmlzRGlnaXQodGhpcy5wZWVrKSkgcmV0dXJuIHRoaXMuZXJyb3IoJ0ludmFsaWQgZXhwb25lbnQnLCAtMSk7XHJcbiAgICAgICAgICAgICAgICBzaW1wbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdHI6IHN0cmluZyA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmluZGV4KTtcclxuICAgICAgICBjb25zdCB2YWx1ZTogbnVtYmVyID0gc2ltcGxlID8gTnVtYmVyV3JhcHBlci5wYXJzZUludEF1dG9SYWRpeChzdHIpIDogcGFyc2VGbG9hdChzdHIpO1xyXG4gICAgICAgIHJldHVybiBuZXdOdW1iZXJUb2tlbihzdGFydCwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjYW5TdHJpbmcoKTogVG9rZW4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0OiBudW1iZXIgPSB0aGlzLmluZGV4O1xyXG4gICAgICAgIGNvbnN0IHF1b3RlOiBudW1iZXIgPSB0aGlzLnBlZWs7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7ICAvLyBTa2lwIGluaXRpYWwgcXVvdGUuXHJcblxyXG4gICAgICAgIGxldCBidWZmZXI6IHN0cmluZyA9ICcnO1xyXG4gICAgICAgIGxldCBtYXJrZXI6IG51bWJlciA9IHRoaXMuaW5kZXg7XHJcbiAgICAgICAgY29uc3QgaW5wdXQ6IHN0cmluZyA9IHRoaXMuaW5wdXQ7XHJcblxyXG4gICAgICAgIHdoaWxlICh0aGlzLnBlZWsgIT0gcXVvdGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGVlayA9PSBjaGFycy4kQkFDS1NMQVNIKSB7XHJcbiAgICAgICAgICAgICAgICBidWZmZXIgKz0gaW5wdXQuc3Vic3RyaW5nKG1hcmtlciwgdGhpcy5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgICAgIGxldCB1bmVzY2FwZWRDb2RlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBUUzIuMS1pbnRyb2R1Y2VkIHR5cGUgc3RyaWN0bmVzc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZWVrID0gdGhpcy5wZWVrO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVlayA9PSBjaGFycy4kdSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIDQgY2hhcmFjdGVyIGhleCBjb2RlIGZvciB1bmljb2RlIGNoYXJhY3Rlci5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZXg6IHN0cmluZyA9IGlucHV0LnN1YnN0cmluZyh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgvXlswLTlhLWZdKyQvaS50ZXN0KGhleCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkQ29kZSA9IHBhcnNlSW50KGhleCwgMTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXFxcdSR7aGV4fV1gLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlZENvZGUgPSB1bmVzY2FwZSh0aGlzLnBlZWspO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnVmZmVyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5lc2NhcGVkQ29kZSk7XHJcbiAgICAgICAgICAgICAgICBtYXJrZXIgPSB0aGlzLmluZGV4O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGVlayA9PSBjaGFycy4kRU9GKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcignVW50ZXJtaW5hdGVkIHF1b3RlJywgMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbGFzdDogc3RyaW5nID0gaW5wdXQuc3Vic3RyaW5nKG1hcmtlciwgdGhpcy5pbmRleCk7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7ICAvLyBTa2lwIHRlcm1pbmF0aW5nIHF1b3RlLlxyXG5cclxuICAgICAgICByZXR1cm4gbmV3U3RyaW5nVG9rZW4oc3RhcnQsIGJ1ZmZlciArIGxhc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpOiBUb2tlbiB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb246IG51bWJlciA9IHRoaXMuaW5kZXggKyBvZmZzZXQ7XHJcbiAgICAgICAgcmV0dXJuIG5ld0Vycm9yVG9rZW4oXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLCBgTGV4ZXIgRXJyb3I6ICR7bWVzc2FnZX0gYXQgY29sdW1uICR7cG9zaXRpb259IGluIGV4cHJlc3Npb24gWyR7dGhpcy5pbnB1dH1dYCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0KGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChjaGFycy4kYSA8PSBjb2RlICYmIGNvZGUgPD0gY2hhcnMuJHopIHx8IChjaGFycy4kQSA8PSBjb2RlICYmIGNvZGUgPD0gY2hhcnMuJFopIHx8XHJcbiAgICAgICAgKGNvZGUgPT0gY2hhcnMuJF8pIHx8IChjb2RlID09IGNoYXJzLiQkKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpZmllcihpbnB1dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHNjYW5uZXIgPSBuZXcgX1NjYW5uZXIoaW5wdXQpO1xyXG4gICAgaWYgKCFpc0lkZW50aWZpZXJTdGFydChzY2FubmVyLnBlZWspKSByZXR1cm4gZmFsc2U7XHJcbiAgICBzY2FubmVyLmFkdmFuY2UoKTtcclxuICAgIHdoaWxlIChzY2FubmVyLnBlZWsgIT09IGNoYXJzLiRFT0YpIHtcclxuICAgICAgICBpZiAoIWlzSWRlbnRpZmllclBhcnQoc2Nhbm5lci5wZWVrKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHNjYW5uZXIuYWR2YW5jZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY2hhcnMuaXNBc2NpaUxldHRlcihjb2RlKSB8fCBjaGFycy5pc0RpZ2l0KGNvZGUpIHx8IChjb2RlID09IGNoYXJzLiRfKSB8fFxyXG4gICAgICAgIChjb2RlID09IGNoYXJzLiQkKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFeHBvbmVudFN0YXJ0KGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNvZGUgPT0gY2hhcnMuJGUgfHwgY29kZSA9PSBjaGFycy4kRTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFeHBvbmVudFNpZ24oY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY29kZSA9PSBjaGFycy4kTUlOVVMgfHwgY29kZSA9PSBjaGFycy4kUExVUztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUXVvdGUoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY29kZSA9PT0gY2hhcnMuJFNRIHx8IGNvZGUgPT09IGNoYXJzLiREUSB8fCBjb2RlID09PSBjaGFycy4kQlQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVuZXNjYXBlKGNvZGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBzd2l0Y2ggKGNvZGUpIHtcclxuICAgICAgICBjYXNlIGNoYXJzLiRuOlxyXG4gICAgICAgICAgICByZXR1cm4gY2hhcnMuJExGO1xyXG4gICAgICAgIGNhc2UgY2hhcnMuJGY6XHJcbiAgICAgICAgICAgIHJldHVybiBjaGFycy4kRkY7XHJcbiAgICAgICAgY2FzZSBjaGFycy4kcjpcclxuICAgICAgICAgICAgcmV0dXJuIGNoYXJzLiRDUjtcclxuICAgICAgICBjYXNlIGNoYXJzLiR0OlxyXG4gICAgICAgICAgICByZXR1cm4gY2hhcnMuJFRBQjtcclxuICAgICAgICBjYXNlIGNoYXJzLiR2OlxyXG4gICAgICAgICAgICByZXR1cm4gY2hhcnMuJFZUQUI7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICB9XHJcbn0iXX0=