valtech-components 4.0.438 → 4.0.440

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 (30) hide show
  1. package/esm2022/lib/components/organisms/mini-games/bubble-blitz-game.component.mjs +9 -18
  2. package/esm2022/lib/components/organisms/mini-games/chessimals-challenge-progress.service.mjs +145 -0
  3. package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +16 -109
  4. package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +540 -22
  5. package/esm2022/lib/components/organisms/mini-games/memory-game.component.mjs +9 -18
  6. package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +89 -147
  7. package/esm2022/lib/components/organisms/mini-games/simon-game.component.mjs +9 -18
  8. package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
  9. package/esm2022/lib/version.mjs +2 -2
  10. package/esm2022/mini-games/public-api.mjs +2 -34
  11. package/esm2022/public-api.mjs +1 -3
  12. package/fesm2022/valtech-components-mini-games.mjs +2 -34
  13. package/fesm2022/valtech-components-mini-games.mjs.map +1 -1
  14. package/fesm2022/valtech-components.mjs +807 -1583
  15. package/fesm2022/valtech-components.mjs.map +1 -1
  16. package/lib/components/organisms/mini-games/bubble-blitz-game.component.d.ts +0 -2
  17. package/lib/components/organisms/mini-games/chessimals-challenge-progress.service.d.ts +30 -0
  18. package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +36 -4
  19. package/lib/components/organisms/mini-games/memory-game.component.d.ts +0 -2
  20. package/lib/components/organisms/mini-games/simon-game.component.d.ts +0 -2
  21. package/lib/components/organisms/mini-games/types.d.ts +57 -65
  22. package/lib/version.d.ts +1 -1
  23. package/mini-games/public-api.d.ts +0 -4
  24. package/package.json +1 -1
  25. package/public-api.d.ts +0 -2
  26. package/src/lib/services/firebase/scripts/generate-sw-config.js +0 -0
  27. package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -1204
  28. package/esm2022/lib/directives/light-ripple.directive.mjs +0 -57
  29. package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -84
  30. package/lib/directives/light-ripple.directive.d.ts +0 -8
@@ -1,1204 +0,0 @@
1
- import { Component, computed, inject, signal } from '@angular/core';
2
- import { LightRippleDirective } from '../../../directives/light-ripple.directive';
3
- import { I18nService } from '../../../services/i18n';
4
- import { MINI_GAMES_I18N } from './mini-games.i18n';
5
- import * as i0 from "@angular/core";
6
- const STARTER_CARDS = {
7
- o_simple: { id: 'o_simple', name: 'Ofrenda simple', type: 'offering', cost: 0, attack: 0, life: 1 },
8
- o_forbidden: {
9
- id: 'o_forbidden',
10
- name: 'El fruto prohibido',
11
- type: 'offering',
12
- cost: 0,
13
- attack: 0,
14
- life: 2,
15
- abilityName: 'Conocimiento del bien y del mal',
16
- abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Lider.',
17
- abilityCost: 0,
18
- },
19
- p_scout: { id: 'p_scout', name: 'Scout', type: 'character', cost: 1, attack: 1, life: 1 },
20
- p_guard: { id: 'p_guard', name: 'Guard', type: 'character', cost: 2, attack: 1, life: 3 },
21
- p_warrior: { id: 'p_warrior', name: 'Warrior', type: 'character', cost: 2, attack: 2, life: 2 },
22
- p_elder: { id: 'p_elder', name: 'Elder', type: 'character', cost: 3, attack: 2, life: 4 },
23
- p_champion: { id: 'p_champion', name: 'Champion', type: 'character', cost: 4, attack: 4, life: 4 },
24
- };
25
- const STARTING_SHARED_DECK = [
26
- 'o_simple',
27
- 'p_scout',
28
- 'o_forbidden',
29
- 'o_simple',
30
- 'p_guard',
31
- 'p_warrior',
32
- 'o_simple',
33
- 'p_elder',
34
- 'p_scout',
35
- 'o_simple',
36
- 'p_champion',
37
- 'p_guard',
38
- 'o_simple',
39
- 'p_warrior',
40
- 'p_scout',
41
- 'o_simple',
42
- 'p_elder',
43
- 'p_guard',
44
- 'o_simple',
45
- ];
46
- const STARTING_GAME = {
47
- gameId: 'mock-christianity',
48
- status: 'in_progress',
49
- mode: 'local_pass',
50
- turnOwner: 'P1',
51
- revision: 0,
52
- turnCount: 1,
53
- matchScore: { P1: 1, P2: 0 },
54
- sharedDeck: STARTING_SHARED_DECK,
55
- historyZone: [],
56
- players: {
57
- P1: {
58
- seat: 'P1',
59
- displayName: 'Jugador',
60
- avatar: 'J',
61
- avatarColor: '#2563eb',
62
- leaderName: 'Adam',
63
- leaderHp: 15,
64
- leaderMaxHp: 15,
65
- offerings: [
66
- { instanceId: 'p1_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P1', ready: true, value: 1 },
67
- {
68
- instanceId: 'p1_offering_002',
69
- cardId: 'o_forbidden',
70
- name: 'El fruto prohibido',
71
- owner: 'P1',
72
- ready: true,
73
- value: 2,
74
- abilityName: 'Conocimiento del bien y del mal',
75
- abilityText: 'Al usarla, disminuye en 1 los puntos de vida de tu Lider.',
76
- abilityCost: 0,
77
- },
78
- ],
79
- offeringPlayedThisTurn: false,
80
- hand: ['o_simple', 'p_scout', 'p_warrior', 'p_guard'],
81
- battleZone: [],
82
- },
83
- P2: {
84
- seat: 'P2',
85
- displayName: 'Rival',
86
- avatar: 'R',
87
- avatarColor: '#b45309',
88
- leaderName: 'Noah',
89
- leaderHp: 15,
90
- leaderMaxHp: 15,
91
- offerings: [{ instanceId: 'p2_offering_001', cardId: 'o_simple', name: 'Ofrenda simple', owner: 'P2', ready: true, value: 1 }],
92
- offeringPlayedThisTurn: false,
93
- handCount: 4,
94
- battleZone: [
95
- {
96
- instanceId: 'opp_001',
97
- cardId: 'p_scout',
98
- name: 'Scout',
99
- owner: 'P2',
100
- controller: 'P2',
101
- attack: 1,
102
- currentHp: 1,
103
- maxHp: 1,
104
- canAttack: false,
105
- },
106
- ],
107
- },
108
- },
109
- log: ['Partida iniciada.'],
110
- };
111
- export class ChristianityGameComponent {
112
- constructor() {
113
- this.i18n = inject(I18nService);
114
- this.game = signal(structuredClone(STARTING_GAME));
115
- this.selectedHandCard = signal(null);
116
- this.selectedAttacker = signal(null);
117
- this.selectedPreview = signal(null);
118
- this.previewTilt = signal({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
119
- this.hoveredHandIndex = signal(null);
120
- this.showHistory = signal(false);
121
- this.offeringsSeat = signal(null);
122
- this.player = computed(() => this.game().players.P1);
123
- this.opponent = computed(() => this.game().players.P2);
124
- this.currentPlayer = computed(() => this.game().players[this.game().turnOwner]);
125
- this.isOwnTurn = computed(() => this.game().turnOwner === 'P1');
126
- this.hasOpponentGuards = computed(() => this.opponent().battleZone.length > 0);
127
- this.opponentHandCount = computed(() => this.opponent().handCount ?? this.opponent().hand?.length ?? 0);
128
- this.selectedCardDefinition = computed(() => {
129
- const selected = this.selectedHandCard();
130
- return selected ? this.cardDefinition(selected) : null;
131
- });
132
- this.statusText = computed(() => {
133
- const attacker = this.selectedAttacker();
134
- const handCard = this.selectedCardDefinition();
135
- if (!this.isOwnTurn()) {
136
- return this.t('christianityWaitTurn');
137
- }
138
- if (attacker) {
139
- return this.hasOpponentGuards() ? this.t('christianityChooseCharacterTarget') : this.t('christianityChooseTarget');
140
- }
141
- if (handCard) {
142
- if (!this.canPlay(handCard)) {
143
- return this.t('christianityNeedOfferings');
144
- }
145
- return handCard.type === 'offering' ? this.t('christianityPlaceOffering') : this.t('christianityChooseSlot');
146
- }
147
- return this.t('christianityChooseCard');
148
- });
149
- this.i18n.registerDefaults('MiniGames', MINI_GAMES_I18N);
150
- }
151
- t(key) {
152
- this.i18n.lang();
153
- return this.i18n.t(key, 'MiniGames');
154
- }
155
- cardDefinition(cardId) {
156
- return STARTER_CARDS[cardId] ?? STARTER_CARDS['p_scout'];
157
- }
158
- battleSlots(seat) {
159
- const cards = this.game().players[seat].battleZone;
160
- return Array.from({ length: 4 }, (_, index) => ({
161
- trackId: cards[index]?.instanceId ?? `${seat}-empty-${index}`,
162
- card: cards[index],
163
- }));
164
- }
165
- hiddenHandCards(count) {
166
- return Array.from({ length: count });
167
- }
168
- fanTransform(index, total, opponent) {
169
- if (total <= 1)
170
- return 'none';
171
- const center = (total - 1) / 2;
172
- const offset = index - center;
173
- const rotate = offset * (opponent ? 8 : 5);
174
- const lift = Math.abs(offset) * 0.25;
175
- const hoverLift = opponent ? 0 : this.handWaveLift(index);
176
- const scale = opponent ? 1 : this.handWaveScale(index);
177
- const fanLift = opponent ? Math.abs(offset) * 0.34 : lift + hoverLift;
178
- const fanSpread = opponent ? offset * 0.08 : 0;
179
- return `translate(${fanSpread}rem, ${fanLift}rem) rotate(${rotate}deg) scale(${scale})`;
180
- }
181
- handCardZIndex(index) {
182
- const hovered = this.hoveredHandIndex();
183
- if (hovered === null)
184
- return 2;
185
- const distance = Math.abs(index - hovered);
186
- return Math.max(2, 8 - distance);
187
- }
188
- setHoveredHandIndex(index) {
189
- this.hoveredHandIndex.set(index);
190
- }
191
- clearHoveredHandIndex() {
192
- this.hoveredHandIndex.set(null);
193
- }
194
- releaseHoveredHand(event) {
195
- if (event.pointerType !== 'mouse') {
196
- window.setTimeout(() => this.clearHoveredHandIndex(), 180);
197
- }
198
- }
199
- handWaveLift(index) {
200
- const hovered = this.hoveredHandIndex();
201
- if (hovered === null)
202
- return 0;
203
- const distance = Math.abs(index - hovered);
204
- if (distance === 0)
205
- return -1.15;
206
- if (distance === 1)
207
- return -0.58;
208
- if (distance === 2)
209
- return -0.22;
210
- return 0;
211
- }
212
- handWaveScale(index) {
213
- const hovered = this.hoveredHandIndex();
214
- if (hovered === null)
215
- return 1;
216
- const distance = Math.abs(index - hovered);
217
- if (distance === 0)
218
- return 1.06;
219
- if (distance === 1)
220
- return 1.03;
221
- return 1;
222
- }
223
- readyOfferings(player) {
224
- return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), 0);
225
- }
226
- totalOfferings(player) {
227
- return player.offerings.reduce((total, offering) => total + offering.value, 0);
228
- }
229
- canPlay(card) {
230
- if (!this.isOwnTurn())
231
- return false;
232
- if (card.type === 'offering')
233
- return !this.player().offeringPlayedThisTurn;
234
- return this.readyOfferings(this.player()) >= card.cost && this.player().battleZone.length < 4;
235
- }
236
- canPlaySelected() {
237
- const selected = this.selectedHandCard();
238
- return !!selected && this.canPlay(this.cardDefinition(selected));
239
- }
240
- selectedActionLabel() {
241
- const selected = this.selectedCardDefinition();
242
- if (!selected)
243
- return this.t('christianityPlayCard');
244
- return selected.type === 'offering' ? this.t('christianityPlayOffering') : this.t('christianityPlayCard');
245
- }
246
- selectedActionDisabled() {
247
- const selected = this.selectedCardDefinition();
248
- if (!selected || !this.canPlay(selected))
249
- return true;
250
- return selected.type === 'character';
251
- }
252
- canPlaceSelectedCharacter() {
253
- const selected = this.selectedCardDefinition();
254
- return !!selected && selected.type === 'character' && this.canPlay(selected);
255
- }
256
- canPlaceSelectedOffering() {
257
- const selected = this.selectedCardDefinition();
258
- return !!selected && selected.type === 'offering' && this.canPlay(selected);
259
- }
260
- selectHandCard(cardId) {
261
- this.selectedAttacker.set(null);
262
- this.selectedHandCard.set(this.selectedHandCard() === cardId ? null : cardId);
263
- this.inspectHandCard(cardId);
264
- }
265
- playSelectedCard(slotIndex) {
266
- const cardId = this.selectedHandCard();
267
- if (!cardId)
268
- return;
269
- const card = this.cardDefinition(cardId);
270
- if (!this.canPlay(card))
271
- return;
272
- this.game.update(game => {
273
- const next = structuredClone(game);
274
- const player = next.players.P1;
275
- const handIndex = player.hand?.indexOf(cardId) ?? -1;
276
- if (handIndex < 0 || !player.hand)
277
- return game;
278
- player.hand.splice(handIndex, 1);
279
- if (card.type === 'offering') {
280
- player.offerings.push({
281
- instanceId: `p1_offering_${next.revision + 1}`,
282
- cardId: card.id,
283
- name: card.name,
284
- owner: 'P1',
285
- ready: true,
286
- value: card.life,
287
- abilityName: card.abilityName,
288
- abilityText: card.abilityText,
289
- abilityCost: card.abilityCost,
290
- });
291
- player.offeringPlayedThisTurn = true;
292
- }
293
- else {
294
- this.spendOfferings(player, card.cost);
295
- const insertIndex = Math.min(slotIndex ?? player.battleZone.length, player.battleZone.length);
296
- player.battleZone.splice(insertIndex, 0, {
297
- instanceId: `p1_${next.revision + 1}_${player.battleZone.length}`,
298
- cardId: card.id,
299
- name: card.name,
300
- owner: 'P1',
301
- controller: 'P1',
302
- attack: card.attack,
303
- currentHp: card.life,
304
- maxHp: card.life,
305
- canAttack: false,
306
- });
307
- }
308
- next.revision++;
309
- next.log = [
310
- card.type === 'offering' ? `${card.name} queda lista como ofrenda.` : `${card.name} entra en batalla.`,
311
- ...next.log,
312
- ].slice(0, 4);
313
- return next;
314
- });
315
- this.selectedHandCard.set(null);
316
- }
317
- handleOfferingPile(seat) {
318
- this.openOfferings(seat);
319
- }
320
- selectAttacker(card) {
321
- this.selectedHandCard.set(null);
322
- this.inspectCharacter(card);
323
- if (!this.isOwnTurn() || !card.canAttack)
324
- return;
325
- this.selectedAttacker.set(this.selectedAttacker()?.instanceId === card.instanceId ? null : card);
326
- }
327
- handleOpponentCharacter(card) {
328
- this.inspectCharacter(card);
329
- if (this.selectedAttacker()) {
330
- this.attackCharacter(card);
331
- }
332
- }
333
- handleOpponentLeader() {
334
- this.inspectLeader('P2');
335
- if (this.selectedAttacker() && !this.hasOpponentGuards()) {
336
- this.attackLeader();
337
- }
338
- }
339
- attackLeader() {
340
- const attacker = this.selectedAttacker();
341
- if (!attacker)
342
- return;
343
- if (this.hasOpponentGuards()) {
344
- this.selectedPreview.set({
345
- title: this.opponent().leaderName,
346
- eyebrow: this.t('christianityLeaderCard'),
347
- meta: `${this.opponent().leaderHp}/${this.opponent().leaderMaxHp}`,
348
- body: this.t('christianityLeaderProtected'),
349
- });
350
- return;
351
- }
352
- this.game.update(game => {
353
- const next = structuredClone(game);
354
- const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
355
- if (!liveAttacker || !liveAttacker.canAttack)
356
- return game;
357
- next.players.P2.leaderHp = Math.max(0, next.players.P2.leaderHp - liveAttacker.attack);
358
- liveAttacker.canAttack = false;
359
- next.revision++;
360
- next.log = [`${liveAttacker.name} ataca al lider rival.`, ...next.log].slice(0, 4);
361
- return next;
362
- });
363
- this.selectedAttacker.set(null);
364
- }
365
- attackCharacter(target) {
366
- const attacker = this.selectedAttacker();
367
- if (!attacker)
368
- return;
369
- this.game.update(game => {
370
- const next = structuredClone(game);
371
- const liveAttacker = next.players.P1.battleZone.find(card => card.instanceId === attacker.instanceId);
372
- const liveTarget = next.players.P2.battleZone.find(card => card.instanceId === target.instanceId);
373
- if (!liveAttacker || !liveTarget || !liveAttacker.canAttack)
374
- return game;
375
- liveTarget.currentHp -= liveAttacker.attack;
376
- liveAttacker.currentHp -= liveTarget.attack;
377
- liveAttacker.canAttack = false;
378
- this.cleanupDestroyed(next.players.P1, next);
379
- this.cleanupDestroyed(next.players.P2, next);
380
- next.revision++;
381
- next.log = [`${liveAttacker.name} combate contra ${liveTarget.name}.`, ...next.log].slice(0, 4);
382
- return next;
383
- });
384
- this.selectedAttacker.set(null);
385
- }
386
- endTurn() {
387
- this.selectedHandCard.set(null);
388
- this.selectedAttacker.set(null);
389
- this.selectedPreview.set(null);
390
- this.game.update(game => {
391
- const next = structuredClone(game);
392
- next.turnOwner = next.turnOwner === 'P1' ? 'P2' : 'P1';
393
- next.turnCount++;
394
- const current = next.players[next.turnOwner];
395
- current.offeringPlayedThisTurn = false;
396
- current.offerings = current.offerings.map(offering => ({ ...offering, ready: true }));
397
- current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
398
- const drawnCard = next.sharedDeck.shift();
399
- if (drawnCard) {
400
- if (current.hand) {
401
- current.hand.push(drawnCard);
402
- }
403
- else {
404
- current.handCount = (current.handCount ?? 0) + 1;
405
- }
406
- }
407
- next.revision++;
408
- next.log = [
409
- drawnCard ? `${current.displayName} roba una carta.` : `El mazo esta vacio.`,
410
- `Turno de ${current.displayName}.`,
411
- ...next.log,
412
- ].slice(0, 4);
413
- return next;
414
- });
415
- }
416
- resetMock() {
417
- this.game.set(structuredClone(STARTING_GAME));
418
- this.selectedHandCard.set(null);
419
- this.selectedAttacker.set(null);
420
- this.selectedPreview.set(null);
421
- this.showHistory.set(false);
422
- this.offeringsSeat.set(null);
423
- }
424
- closePreview() {
425
- this.selectedPreview.set(null);
426
- this.resetPreviewTilt();
427
- }
428
- openOfferings(seat) {
429
- this.selectedPreview.set(null);
430
- this.showHistory.set(false);
431
- this.offeringsSeat.set(seat);
432
- }
433
- closeOfferings() {
434
- this.offeringsSeat.set(null);
435
- }
436
- tiltPreview(event) {
437
- const bounds = event.currentTarget.getBoundingClientRect();
438
- const x = (event.clientX - bounds.left) / bounds.width - 0.5;
439
- const y = (event.clientY - bounds.top) / bounds.height - 0.5;
440
- this.previewTilt.set({
441
- rotateX: 5 - y * 18,
442
- rotateY: -5 + x * 18,
443
- shiftX: x * 10,
444
- shiftY: y * 10,
445
- });
446
- }
447
- resetPreviewTilt() {
448
- this.previewTilt.set({ rotateX: 5, rotateY: -5, shiftX: 0, shiftY: 0 });
449
- }
450
- cleanupDestroyed(player, game) {
451
- const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
452
- if (!destroyed.length)
453
- return;
454
- game.historyZone.push(...destroyed.map(card => card.cardId));
455
- player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
456
- }
457
- inspectLeader(seat) {
458
- const player = this.game().players[seat];
459
- this.selectedPreview.set({
460
- title: player.leaderName,
461
- eyebrow: this.t('christianityLeaderCard'),
462
- meta: `${player.leaderHp}/${player.leaderMaxHp}`,
463
- body: seat === 'P2' && this.hasOpponentGuards() ? this.t('christianityLeaderProtected') : this.t('christianityLeaderBody'),
464
- });
465
- }
466
- inspectOffering(offering) {
467
- this.selectedPreview.set({
468
- title: offering.name,
469
- eyebrow: this.t('christianityOfferingCard'),
470
- meta: offering.ready ? this.t('christianityOfferingReady') : this.t('christianityOfferingExhausted'),
471
- body: offering.abilityText || this.t('christianityOfferingBody'),
472
- });
473
- }
474
- canUseOfferingAbility(offering, seat) {
475
- if (seat !== 'P1' || !this.isOwnTurn())
476
- return false;
477
- if (!offering.ready || !offering.abilityName)
478
- return false;
479
- return this.readyOfferings(this.game().players[seat]) >= (offering.abilityCost ?? 0);
480
- }
481
- useOfferingAbility(offering, seat) {
482
- if (!this.canUseOfferingAbility(offering, seat))
483
- return;
484
- this.game.update(game => {
485
- const next = structuredClone(game);
486
- const player = next.players[seat];
487
- const liveOffering = player.offerings.find(card => card.instanceId === offering.instanceId);
488
- if (!liveOffering || !liveOffering.ready)
489
- return game;
490
- const offeringId = liveOffering.instanceId;
491
- this.spendOfferings(player, liveOffering.abilityCost ?? 0);
492
- player.offerings = player.offerings.map(card => (card.instanceId === offeringId ? { ...card, ready: false } : card));
493
- player.leaderHp = Math.max(0, player.leaderHp - 1);
494
- next.revision++;
495
- next.log = [`${liveOffering.name}: ${liveOffering.abilityName}.`, ...next.log].slice(0, 4);
496
- return next;
497
- });
498
- }
499
- inspectDeck() {
500
- this.selectedPreview.set({
501
- title: this.t('christianityDeck'),
502
- eyebrow: this.t('christianitySharedZone'),
503
- meta: `${this.game().sharedDeck.length}`,
504
- body: this.t('christianityDeckBody'),
505
- });
506
- }
507
- inspectHandCard(cardId) {
508
- const card = this.cardDefinition(cardId);
509
- this.selectedPreview.set({
510
- title: card.name,
511
- eyebrow: card.type === 'offering' ? this.t('christianityOfferingCard') : this.t('christianityCharacterCard'),
512
- meta: card.type === 'offering' ? `+${card.life}` : `${this.t('christianityCost')} ${card.cost} · ${card.attack}/${card.life}`,
513
- body: card.type === 'offering' ? this.t('christianityOfferingBody') : this.t('christianityCharacterBody'),
514
- });
515
- }
516
- inspectHistoryCard(cardId) {
517
- this.showHistory.set(false);
518
- this.inspectHandCard(cardId);
519
- }
520
- inspectCharacter(card) {
521
- this.selectedPreview.set({
522
- title: card.name,
523
- eyebrow: this.t('christianityCharacterCard'),
524
- meta: `${card.attack}/${card.currentHp}`,
525
- body: card.canAttack ? this.t('christianityCharacterReady') : this.t('christianityCharacterExhausted'),
526
- });
527
- }
528
- spendOfferings(player, cost) {
529
- let remaining = cost;
530
- player.offerings = player.offerings.map(offering => {
531
- if (remaining <= 0 || !offering.ready)
532
- return offering;
533
- remaining -= offering.value;
534
- return { ...offering, ready: false };
535
- });
536
- }
537
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
538
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChristianityGameComponent, isStandalone: true, selector: "val-christianity-game", ngImport: i0, template: `
539
- <main class="christianity-shell">
540
- <section class="christianity-header">
541
- <div>
542
- <p>{{ t('christianityEyebrow') }}</p>
543
- <h1>{{ t('christianityTitle') }}</h1>
544
- </div>
545
- <div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
546
- <span>{{ t('christianityTurn') }}</span>
547
- <strong>{{ currentPlayer().displayName }}</strong>
548
- </div>
549
- </section>
550
-
551
- <section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
552
- <article class="christianity-match-player">
553
- <span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
554
- <div>
555
- <strong>{{ player().displayName }}</strong>
556
- <small>{{ player().leaderName }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
557
- </div>
558
- </article>
559
- <div class="christianity-scoreboard">
560
- <span>{{ t('christianityMatch') }}</span>
561
- <strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
562
- </div>
563
- <article class="christianity-match-player christianity-match-player--opponent">
564
- <span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
565
- <div>
566
- <strong>{{ opponent().displayName }}</strong>
567
- <small>{{ opponent().leaderName }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
568
- </div>
569
- </article>
570
- </section>
571
-
572
- <section class="christianity-hand-shelf christianity-hand-shelf--opponent">
573
- <div class="christianity-hand-meter christianity-hand-meter--opponent">
574
- <span>{{ t('christianityHand') }}</span>
575
- <strong>{{ opponentHandCount() }}</strong>
576
- </div>
577
- <section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
578
- @for (_ of hiddenHandCards(opponentHandCount()); track $index) {
579
- <button
580
- type="button"
581
- class="christianity-card-preview-card christianity-card-preview-card--back"
582
- valLightRipple
583
- [style.transform]="fanTransform($index, opponentHandCount(), true)"
584
- [attr.aria-label]="t('christianityHiddenCard')"
585
- ></button>
586
- }
587
- </section>
588
- </section>
589
-
590
- <section class="christianity-table" [attr.aria-label]="t('christianityTable')">
591
- <section class="christianity-player-side christianity-player-side--opponent">
592
- <section class="christianity-player-rack christianity-player-rack--opponent">
593
- <div class="christianity-offerings-zone">
594
- <button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
595
- <i aria-hidden="true"></i>
596
- <i aria-hidden="true"></i>
597
- <i aria-hidden="true"></i>
598
- <span>{{ t('christianityOfferings') }}</span>
599
- <strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
600
- </button>
601
- </div>
602
- <button type="button" class="christianity-leader-card" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
603
- <span>{{ opponent().leaderName }}</span>
604
- <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
605
- </button>
606
- <span class="christianity-rack-spacer" aria-hidden="true"></span>
607
- </section>
608
-
609
- <section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
610
- @for (slot of battleSlots('P2'); track slot.trackId) {
611
- @if (slot.card) {
612
- <button
613
- type="button"
614
- class="christianity-card-preview-card christianity-card-preview-card--battle"
615
- valLightRipple
616
- [class.is-target]="selectedAttacker()"
617
- (click)="handleOpponentCharacter(slot.card)"
618
- >
619
- <span>{{ slot.card.name }}</span>
620
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
621
- </button>
622
- } @else {
623
- <span class="christianity-slot"></span>
624
- }
625
- }
626
- </section>
627
- </section>
628
-
629
- <section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
630
- <button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="showHistory.set(true)">
631
- <i aria-hidden="true"></i>
632
- <i aria-hidden="true"></i>
633
- <i aria-hidden="true"></i>
634
- <span>{{ t('christianityHistory') }}</span>
635
- <strong>{{ game().historyZone.length }}</strong>
636
- </button>
637
- <button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
638
- <i aria-hidden="true"></i>
639
- <i aria-hidden="true"></i>
640
- <i aria-hidden="true"></i>
641
- <span>{{ t('christianityDeck') }}</span>
642
- <strong>{{ game().sharedDeck.length }}</strong>
643
- </button>
644
- <div class="christianity-zone-card">
645
- <span>{{ t('christianityPlace') }}</span>
646
- <strong>{{ t('christianityEmpty') }}</strong>
647
- </div>
648
- </section>
649
-
650
- <section class="christianity-player-side">
651
- <section class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
652
- @for (slot of battleSlots('P1'); track slot.trackId) {
653
- @if (slot.card) {
654
- <button
655
- type="button"
656
- class="christianity-card-preview-card christianity-card-preview-card--battle"
657
- valLightRipple
658
- [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
659
- [class.is-exhausted]="!slot.card.canAttack"
660
- (click)="selectAttacker(slot.card)"
661
- >
662
- <span>{{ slot.card.name }}</span>
663
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
664
- </button>
665
- } @else if (canPlaceSelectedCharacter()) {
666
- <button type="button" class="christianity-slot christianity-slot--play-target" valLightRipple (click)="playSelectedCard($index)">
667
- <span>{{ t('christianityPlayHere') }}</span>
668
- </button>
669
- } @else {
670
- <span class="christianity-slot"></span>
671
- }
672
- }
673
- </section>
674
-
675
- <section class="christianity-player-rack">
676
- <div class="christianity-offerings-zone">
677
- <button
678
- type="button"
679
- class="christianity-offering-pile"
680
- valLightRipple
681
- (click)="handleOfferingPile('P1')"
682
- >
683
- <i aria-hidden="true"></i>
684
- <i aria-hidden="true"></i>
685
- <i aria-hidden="true"></i>
686
- <span>{{ t('christianityOfferings') }}</span>
687
- <strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
688
- </button>
689
- </div>
690
- <button type="button" class="christianity-leader-card" valLightRipple (click)="inspectLeader('P1')">
691
- <span>{{ player().leaderName }}</span>
692
- <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
693
- </button>
694
- <div class="christianity-player-command">
695
- <div class="christianity-player-badge">
696
- <span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
697
- <strong>{{ player().displayName }}</strong>
698
- </div>
699
- <button
700
- type="button"
701
- class="christianity-end-turn"
702
- (click)="endTurn()"
703
- >
704
- {{ t('christianityEndTurn') }}
705
- </button>
706
- </div>
707
- </section>
708
- </section>
709
- </section>
710
-
711
- <section class="christianity-hand-shelf">
712
- <div class="christianity-hand-meter">
713
- <span>{{ t('christianityHand') }}</span>
714
- <strong>{{ player().hand?.length ?? 0 }}</strong>
715
- </div>
716
- <section class="christianity-hand-fan" [attr.aria-label]="t('christianityYourHand')" (pointerleave)="clearHoveredHandIndex()">
717
- @for (cardId of player().hand ?? []; track cardId + $index) {
718
- @let card = cardDefinition(cardId);
719
- <button
720
- type="button"
721
- class="christianity-card-preview-card christianity-card-preview-card--hand"
722
- valLightRipple
723
- [class.is-selected]="selectedHandCard() === cardId"
724
- [class.is-disabled]="!canPlay(card)"
725
- [style.z-index]="handCardZIndex($index)"
726
- [style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
727
- (pointerenter)="setHoveredHandIndex($index)"
728
- (pointerdown)="setHoveredHandIndex($index)"
729
- (pointerup)="releaseHoveredHand($event)"
730
- (click)="selectHandCard(cardId)"
731
- >
732
- <small>
733
- @if (card.type === 'offering') {
734
- {{ t('christianityOfferingCard') }}
735
- } @else {
736
- {{ t('christianityCost') }} {{ card.cost }}
737
- }
738
- </small>
739
- <span>{{ card.name }}</span>
740
- <strong>
741
- @if (card.type === 'offering') {
742
- +{{ card.life }}
743
- } @else {
744
- {{ card.attack }} / {{ card.life }}
745
- }
746
- </strong>
747
- </button>
748
- }
749
- </section>
750
- </section>
751
-
752
- @if (selectedPreview()) {
753
- <button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
754
- <aside
755
- class="christianity-floating-card-shell"
756
- aria-live="polite"
757
- >
758
- <button type="button" class="christianity-floating-card-close" (click)="closePreview()">
759
- {{ t('close') }}
760
- </button>
761
- <div
762
- class="christianity-floating-card"
763
- [style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
764
- [style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
765
- [style.--preview-shift-x]="previewTilt().shiftX + 'px'"
766
- [style.--preview-shift-y]="previewTilt().shiftY + 'px'"
767
- (pointermove)="tiltPreview($event)"
768
- (pointerleave)="resetPreviewTilt()"
769
- >
770
- <small>{{ selectedPreview()?.eyebrow }}</small>
771
- <strong>{{ selectedPreview()?.title }}</strong>
772
- <span>{{ selectedPreview()?.meta }}</span>
773
- <p>{{ selectedPreview()?.body }}</p>
774
- </div>
775
- </aside>
776
- }
777
-
778
- <section class="christianity-actions" aria-live="polite">
779
- <p>{{ statusText() }}</p>
780
- <div>
781
- <button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
782
- {{ selectedActionLabel() }}
783
- </button>
784
- <button type="button" (click)="resetMock()">
785
- {{ t('christianityReset') }}
786
- </button>
787
- </div>
788
- </section>
789
-
790
- @if (showHistory()) {
791
- <button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
792
- <section class="christianity-history-drawer">
793
- <header>
794
- <h2>{{ t('christianityHistory') }}</h2>
795
- <div class="christianity-dialog-actions">
796
- <span>{{ game().historyZone.length }}</span>
797
- <button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
798
- {{ t('close') }}
799
- </button>
800
- </div>
801
- </header>
802
- @if (game().historyZone.length) {
803
- <div class="christianity-history-grid">
804
- @for (cardId of game().historyZone; track cardId + $index) {
805
- @let card = cardDefinition(cardId);
806
- <button type="button" class="christianity-card-preview-card" valLightRipple (click)="inspectHistoryCard(cardId)">
807
- <small>{{ card.type === 'offering' ? t('christianityOfferingCard') : t('christianityCharacterCard') }}</small>
808
- <span>{{ card.name }}</span>
809
- <strong>
810
- @if (card.type === 'offering') {
811
- +{{ card.life }}
812
- } @else {
813
- {{ card.attack }} / {{ card.life }}
814
- }
815
- </strong>
816
- </button>
817
- }
818
- </div>
819
- } @else {
820
- <p>{{ t('christianityHistoryEmpty') }}</p>
821
- }
822
- </section>
823
- }
824
-
825
- @if (offeringsSeat()) {
826
- @let offeringPlayer = game().players[offeringsSeat()!];
827
- <button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
828
- <section class="christianity-history-drawer christianity-offerings-drawer">
829
- <header>
830
- <h2>{{ t('christianityOfferings') }}</h2>
831
- <div class="christianity-dialog-actions">
832
- <span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
833
- <button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
834
- {{ t('close') }}
835
- </button>
836
- </div>
837
- </header>
838
- <div class="christianity-offering-list">
839
- @for (offering of offeringPlayer.offerings; track offering.instanceId) {
840
- <article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
841
- <button type="button" class="christianity-offering-card" valLightRipple (click)="inspectOffering(offering)">
842
- <small>{{ t('christianityOfferingCard') }}</small>
843
- <span>{{ offering.name }}</span>
844
- <strong>+{{ offering.value }}</strong>
845
- @if (offering.abilityName) {
846
- <p>{{ offering.abilityName }}</p>
847
- }
848
- </button>
849
- <div>
850
- <strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
851
- <p>{{ offering.abilityText || t('christianityOfferingNoAbility') }}</p>
852
- @if (offering.abilityName) {
853
- <button
854
- type="button"
855
- [disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
856
- (click)="useOfferingAbility(offering, offeringsSeat()!)"
857
- >
858
- {{ t('christianityUseAbility') }}
859
- </button>
860
- }
861
- </div>
862
- </article>
863
- }
864
- </div>
865
- </section>
866
- }
867
- </main>
868
- `, isInline: true, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.65rem;padding:.75rem .25rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb;overflow:visible}.christianity-header,.christianity-match-strip,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-header h1,.christianity-header p,.christianity-match-player strong,.christianity-match-player small,.christianity-scoreboard span,.christianity-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header p,.christianity-turn span,.christianity-offerings span,.christianity-hidden-hand span,.christianity-deck span,.christianity-place span,.christianity-pile span,.christianity-leader span{color:#1f2933a3;font-size:.75rem}.christianity-turn,.christianity-leader,.christianity-offerings,.christianity-hidden-hand,.christianity-pile,.christianity-deck,.christianity-place{display:grid;gap:.15rem;min-width:5.25rem;padding:.55rem .65rem;border:1px solid rgba(36,48,68,.12);border-radius:.5rem;background:#fff}.christianity-turn.is-own-turn{border-color:#12806c59;background:#ecfdf5}.christianity-match-strip{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);padding:.45rem;border:1px solid rgba(36,48,68,.1);border-radius:.75rem;background:#fff}.christianity-match-player{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.5rem;align-items:center;min-width:0}.christianity-match-player--opponent{direction:rtl}.christianity-match-player--opponent div{direction:ltr;text-align:right}.christianity-match-player div{display:grid;min-width:0}.christianity-match-player strong,.christianity-match-player small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-match-player small,.christianity-scoreboard span{color:#1f293394;font-size:.72rem}.christianity-scoreboard{display:grid;justify-items:center;min-width:4.2rem;padding:0 .55rem;border-right:1px solid rgba(36,48,68,.1);border-left:1px solid rgba(36,48,68,.1)}.christianity-scoreboard strong{font-size:1.2rem;line-height:1}.christianity-table{display:grid;gap:.45rem;padding:.45rem .35rem;border-radius:.75rem;background:#dceafb;overflow:visible}.christianity-player-side{display:grid;gap:.35rem;padding:.35rem .3rem;border-radius:.7rem;background:#ffffff57;grid-template-rows:minmax(7rem,1fr) auto;min-height:13.75rem}.christianity-player-side--opponent{grid-template-rows:auto minmax(7rem,1fr)}.christianity-player{display:grid;gap:.65rem}.christianity-battle-zone{display:grid;grid-template-columns:repeat(5,minmax(4.2rem,1fr));gap:.5rem;align-items:center;min-height:clamp(6.9rem,23vw,8.9rem);padding:.55rem .4rem;border-radius:.75rem;background:#ffffffc2}.christianity-shared-zone{padding:.55rem .4rem;border-radius:.75rem;background:#ffffffe6}.christianity-card,.christianity-end-turn,.christianity-actions button,.christianity-pile,.christianity-leader--target{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card{display:grid;align-content:space-between;min-height:5.8rem;padding:.5rem;text-align:left;box-shadow:0 .5rem 1.25rem #24304414}.christianity-card span{font-weight:700}.christianity-card strong{justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-card.is-selected{border-color:#2563eb;box-shadow:0 0 0 .2rem #2563eb29}.christianity-card.is-disabled,.christianity-card.is-exhausted{opacity:.55}.christianity-card.is-target{border-color:#dc2626}.christianity-offering-cards{display:grid;grid-auto-flow:column;grid-auto-columns:.7rem;gap:.16rem;align-items:end;min-height:1.05rem}.christianity-offering-cards i{display:block;width:.65rem;height:.95rem;border:1px solid rgba(16,42,67,.22);border-radius:.18rem;background:#f8fafc}.christianity-offering-cards i.is-used{background:#cbd5e1;transform:rotate(90deg);transform-origin:center}.christianity-slot{display:grid;place-items:center;min-height:clamp(6.1rem,20vw,7.6rem);border:1px dashed rgba(36,48,68,.22);border-radius:.5rem;background:#ffffff73;color:inherit;font:inherit}.christianity-slot--play-target{position:relative;border-color:#2563eb8c;background:#dbeafec7;color:#1d4ed8;font-weight:800;overflow:hidden;box-shadow:inset 0 0 0 .12rem #60a5fa33,0 .7rem 1.25rem #2563eb29;animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-slot--play-target span{position:relative;z-index:2;padding:.16rem .44rem;border-radius:999px;background:#ffffffc7;font-size:.78rem}@keyframes christianity-target-pulse{0%,to{box-shadow:inset 0 0 0 .12rem #60a5fa33,0 .7rem 1.25rem #2563eb29}50%{box-shadow:inset 0 0 0 .16rem #60a5fa57,0 .9rem 1.65rem #2563eb3d}}.christianity-hand{display:grid;grid-auto-columns:minmax(6rem,8rem);grid-auto-flow:column;gap:.55rem;overflow-x:auto;padding-bottom:.25rem}.christianity-actions{align-items:flex-start;padding:.75rem;border-radius:.75rem;background:#fff}.christianity-actions div{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.christianity-actions button,.christianity-end-turn{min-height:2.4rem;padding:0 .75rem;font-weight:700}.christianity-actions button:not(:disabled),.christianity-end-turn{background:#102a43;color:#fff}.christianity-history{padding:.75rem;border-radius:.75rem;background:#fff}.christianity-hand-fan{position:relative;display:flex;justify-content:center;min-height:10.8rem;padding:.25rem .25rem 2.1rem;isolation:isolate;overflow:visible}.christianity-hand-shelf{position:relative;display:grid;z-index:12;min-height:12rem;margin-top:-1.15rem;padding:1.45rem .25rem 1rem;overflow:visible}.christianity-hand-shelf--opponent{z-index:8;min-height:6.85rem;margin-top:0;margin-bottom:0;padding:.45rem .25rem .85rem}.christianity-hand-fan--opponent{min-height:5.9rem;padding-bottom:.75rem;align-items:start}.christianity-card-preview-card,.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile,.christianity-end-turn{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card-preview-card{display:grid;align-content:space-between;width:clamp(4.9rem,17vw,7.1rem);min-height:clamp(6.6rem,22vw,8.8rem);margin-inline:-.42rem;padding:.48rem;text-align:left;transform-origin:50% 115%;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;box-shadow:0 .5rem 1.25rem #2430441a}.christianity-card-preview-card--hand:hover,.christianity-card-preview-card--hand.is-selected{z-index:3;border-color:#2563eb;box-shadow:0 1rem 2rem #2563eb2e}.christianity-offering-pile.is-play-target{border-color:#2563eb94;background:linear-gradient(180deg,#eff6fff5,#fffffff0),radial-gradient(circle at 82% 14%,rgba(250,204,21,.28) 0 .7rem,transparent .72rem);box-shadow:inset 0 0 0 .12rem #60a5fa3d,0 .8rem 1.55rem #2563eb33;animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-card-preview-card--back{width:clamp(4rem,14vw,5.7rem);min-height:clamp(5rem,16vw,6.6rem);box-shadow:0 .8rem 1.55rem #24304424;transform-origin:50% -18%;background:linear-gradient(135deg,#102a431f,#102a4305),repeating-linear-gradient(45deg,#e2e8f0 0 .35rem,#f8fafc .35rem .7rem)}.christianity-card-preview-card--battle{width:100%;min-height:clamp(6.1rem,20vw,7.6rem);margin-inline:0}.christianity-card-preview-card span,.christianity-card-mini span,.christianity-offering-pile span,.christianity-offering-card span,.christianity-leader-card span,.christianity-zone-card span,.christianity-zone-pile span{position:relative;z-index:2;font-weight:700}.christianity-card-preview-card strong,.christianity-card-mini strong,.christianity-offering-pile strong,.christianity-offering-card strong,.christianity-leader-card strong,.christianity-zone-card strong,.christianity-zone-pile strong{position:relative;z-index:3;justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-player-rack{display:grid;grid-template-columns:minmax(5.9rem,7rem) minmax(5rem,1fr) minmax(4.2rem,7rem);gap:.45rem;align-items:end;justify-items:stretch}.christianity-player-rack--opponent{align-items:start}.christianity-hand-meter{position:absolute;top:0;right:.35rem;z-index:4;display:inline-grid;grid-auto-flow:column;gap:.25rem;align-items:center;min-height:1.7rem;padding:.18rem .46rem;border:1px solid rgba(36,48,68,.12);border-radius:999px;background:#ffffffe6;box-shadow:0 .35rem .8rem #102a4314}.christianity-hand-meter--opponent{top:.15rem}.christianity-hand-meter span{color:#1f293394;font-size:.68rem}.christianity-hand-meter strong{font-size:.86rem}.christianity-player-badge,.christianity-player-command{display:grid;gap:.35rem;justify-items:center;min-width:0}.christianity-player-badge{align-content:start;color:#1f2933c2;font-size:.74rem}.christianity-player-badge--opponent{justify-self:center;grid-auto-flow:column;align-items:center;justify-content:center}.christianity-player-badge strong{max-width:6.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-avatar{display:grid;place-items:center;width:1.85rem;height:1.85rem;border-radius:999px;color:#fff;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .9rem #102a4329}.christianity-offerings-zone{display:flex;flex-wrap:wrap;gap:.25rem;justify-content:flex-start;justify-self:start;width:100%}.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile{display:grid;align-content:space-between;min-height:4.9rem;padding:.48rem;text-align:left}.christianity-card-mini{width:3.5rem}.christianity-offering-pile{position:relative;isolation:isolate;overflow:hidden;justify-self:start;width:min(100%,5.9rem);min-height:7.1rem;padding:.95rem .52rem .6rem;background:linear-gradient(180deg,#fff,#f8fafc),linear-gradient(135deg,rgba(250,204,21,.18),transparent 42%)}.christianity-offering-pile i{position:absolute;inset:auto auto 1.05rem .72rem;z-index:-1;width:2.55rem;height:3.55rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:linear-gradient(180deg,#ffffffeb,#f1f5f9eb),radial-gradient(circle at 78% 18%,#facc15 0 .38rem,transparent .4rem);box-shadow:0 .35rem .85rem #102a431a;transform:rotate(-5deg)}.christianity-offering-pile i:nth-child(2){transform:translate(.28rem,.08rem) rotate(3deg)}.christianity-offering-pile i:nth-child(3){transform:translate(.55rem,.18rem) rotate(-1deg)}.christianity-leader-card{align-self:center;justify-self:center;width:clamp(4.75rem,17vw,6rem);min-height:clamp(6.6rem,22vw,8.4rem)}.christianity-rack-spacer{display:block;min-height:1px}.christianity-battle-zone{grid-template-columns:repeat(4,minmax(4rem,1fr))}.christianity-shared-zone{display:grid;grid-template-columns:repeat(3,minmax(4.3rem,1fr));align-items:stretch}.christianity-zone-card,.christianity-zone-pile{min-height:6.45rem;padding:.7rem .52rem .55rem}.christianity-zone-pile{position:relative;isolation:isolate;overflow:hidden;box-shadow:inset 0 0 0 999px #ffffff1f}.christianity-zone-pile i{position:absolute;inset:auto .72rem 1.02rem auto;z-index:-1;width:2.7rem;height:3.7rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:#f8fafc;box-shadow:0 .35rem .85rem #102a431c;transform:rotate(4deg)}.christianity-zone-pile i:nth-child(2){transform:translate(-.28rem,.12rem) rotate(-3deg)}.christianity-zone-pile i:nth-child(3){background:linear-gradient(135deg,#102a4329,#102a4308),repeating-linear-gradient(45deg,#dbeafe 0 .33rem,#fff .33rem .66rem);transform:translate(-.54rem,.24rem) rotate(2deg)}.christianity-floating-card-shell{position:fixed;top:50%;left:50%;z-index:61;width:min(23rem,calc(100vw - 1.25rem));transform:translate(-50%,-50%)}.christianity-floating-card{display:grid;gap:.45rem;width:100%;min-height:min(31rem,calc(100vh - 3.5rem));padding:1.15rem;border:1px solid rgba(36,48,68,.18);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,rgba(37,99,235,.12),transparent 45%);box-shadow:0 0 0 .18rem #bfdbfe6b,0 0 2.2rem #60a5fa57,0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c;touch-action:none;transform:translate(var(--preview-shift-x, 0px),var(--preview-shift-y, 0px)) perspective(48rem) rotateX(var(--preview-rotate-x, 5deg)) rotateY(var(--preview-rotate-y, -5deg));transition:transform 90ms ease-out}.christianity-floating-card-close{position:absolute;top:-2.6rem;right:0;z-index:62;min-height:2rem;padding:0 .6rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#ffffffe6;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .45rem 1rem #102a431a}.christianity-preview-backdrop,.christianity-history-backdrop{position:fixed;inset:0;border:0;border-radius:0;background:#0f172a75}.christianity-preview-backdrop{z-index:60}.christianity-floating-card small,.christianity-floating-card span{color:#1f2933a3}.christianity-floating-card strong{font-size:clamp(1.55rem,8vw,2.35rem);line-height:1.05}.christianity-floating-card p{margin:0;align-self:end;font-size:.95rem;line-height:1.35}.christianity-history-backdrop{z-index:40}.christianity-history-drawer{position:fixed;right:auto;bottom:max(.5rem,env(safe-area-inset-bottom));left:50%;z-index:41;display:grid;grid-template-rows:auto minmax(0,1fr);gap:.75rem;width:min(calc(100vw - 1rem),44rem);min-height:min(18rem,calc(100dvh - 1rem));max-height:min(32rem,calc(100dvh - 2rem));padding:.8rem;border:1px solid rgba(36,48,68,.16);border-radius:.75rem;background:#fffffffa;box-shadow:0 1.5rem 4rem #102a4347;transform:translate(-50%)}.christianity-history-drawer header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-history-drawer h2,.christianity-history-drawer p{margin:0}.christianity-history-drawer header span{display:grid;place-items:center;min-width:1.85rem;height:1.85rem;border-radius:999px;background:#edf2f7;font-weight:800}.christianity-dialog-actions{display:flex;align-items:center;gap:.45rem}.christianity-dialog-close{min-height:1.85rem;padding:0 .62rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#fff;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .8rem #102a4314}.christianity-history-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.4rem,1fr));gap:.55rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem .1rem .25rem}.christianity-history-grid::-webkit-scrollbar,.christianity-offering-list::-webkit-scrollbar{width:.65rem}.christianity-history-grid::-webkit-scrollbar-track,.christianity-offering-list::-webkit-scrollbar-track{border-radius:999px;background:#e2e8f0b8}.christianity-history-grid::-webkit-scrollbar-thumb,.christianity-offering-list::-webkit-scrollbar-thumb{border:.14rem solid rgba(226,232,240,.72);border-radius:999px;background:#24304452}.christianity-offerings-drawer{width:min(calc(100vw - 1rem),48rem);min-height:min(20rem,calc(100dvh - 1rem));max-height:min(34rem,calc(100dvh - 2rem))}.christianity-offering-list{display:grid;gap:.6rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem}.christianity-offering-row{display:grid;grid-template-columns:minmax(4.9rem,6.2rem) minmax(0,1fr);gap:.65rem;align-items:stretch;padding:.45rem;border:1px solid rgba(36,48,68,.12);border-radius:.65rem;background:#fff}.christianity-offering-row.is-exhausted{opacity:.68}.christianity-offering-card{min-height:7.4rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 82% 14%,#facc15 0 .48rem,transparent .5rem);box-shadow:0 .45rem 1rem #102a431a}.christianity-offering-card small{color:#1f293394;font-size:.66rem;text-transform:uppercase}.christianity-offering-card p,.christianity-offering-row p{margin:0}.christianity-offering-card p{align-self:end;color:#1f2933a3;font-size:.72rem;line-height:1.2}.christianity-offering-row>div{display:grid;gap:.35rem;align-content:center;min-width:0}.christianity-offering-row>div p{color:#1f2933b8;font-size:.85rem;line-height:1.3}.christianity-offering-row>div button{justify-self:start;min-height:2.2rem;padding:0 .7rem;border:1px solid rgba(16,42,67,.16);border-radius:.5rem;background:#102a43;color:#fff;font:inherit;font-weight:800}.christianity-offering-row>div button:disabled{background:#e2e8f0;color:#1f293394}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible{outline:.1875rem solid rgba(37,99,235,.24);outline-offset:.125rem}@media (max-width: 720px){.christianity-shell{padding:.55rem 0;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-match-strip{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:.35rem;padding:.35rem}.christianity-match-player{gap:.35rem}.christianity-match-player small{display:none}.christianity-scoreboard{min-width:3.65rem;padding:0 .35rem}.christianity-scoreboard strong{font-size:1.05rem}.christianity-table{gap:.35rem}.christianity-player-side{padding:.3rem .25rem}.christianity-battle-zone{grid-template-columns:repeat(4,minmax(3.35rem,1fr));overflow-x:auto}.christianity-hand-fan{min-height:10.55rem;padding-bottom:2rem;overflow:visible}.christianity-hand-shelf{min-height:11.75rem;margin-top:-1rem;padding-top:1.35rem;padding-bottom:.9rem}.christianity-hand-shelf--opponent{min-height:6.65rem;margin-top:0;margin-bottom:0;padding-top:.4rem;padding-bottom:.85rem}.christianity-player-rack{grid-template-columns:minmax(4.7rem,5.9rem) minmax(4.8rem,1fr) minmax(3.7rem,5rem)}.christianity-shared-zone{grid-template-columns:repeat(3,minmax(3.7rem,1fr))}.christianity-zone-card,.christianity-zone-pile{min-height:6.15rem;padding:.58rem .46rem .5rem}.christianity-offering-pile{min-height:6.85rem;padding:.88rem .46rem .55rem}.christianity-card-preview-card{width:clamp(4.2rem,20vw,5.7rem);min-height:clamp(5.8rem,26vw,7.4rem)}.christianity-leader-card{width:clamp(4.55rem,20vw,5.7rem);min-height:clamp(6.15rem,27vw,7.6rem)}.christianity-offering-row{grid-template-columns:minmax(4.5rem,5.5rem) minmax(0,1fr);gap:.5rem}.christianity-hand-fan--opponent{min-height:5.75rem;padding-bottom:.7rem}}\n"], dependencies: [{ kind: "directive", type: LightRippleDirective, selector: "[valLightRipple]" }] }); }
869
- }
870
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChristianityGameComponent, decorators: [{
871
- type: Component,
872
- args: [{ selector: 'val-christianity-game', standalone: true, imports: [LightRippleDirective], template: `
873
- <main class="christianity-shell">
874
- <section class="christianity-header">
875
- <div>
876
- <p>{{ t('christianityEyebrow') }}</p>
877
- <h1>{{ t('christianityTitle') }}</h1>
878
- </div>
879
- <div class="christianity-turn" [class.is-own-turn]="isOwnTurn()">
880
- <span>{{ t('christianityTurn') }}</span>
881
- <strong>{{ currentPlayer().displayName }}</strong>
882
- </div>
883
- </section>
884
-
885
- <section class="christianity-match-strip" [attr.aria-label]="t('christianityMatchScore')">
886
- <article class="christianity-match-player">
887
- <span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
888
- <div>
889
- <strong>{{ player().displayName }}</strong>
890
- <small>{{ player().leaderName }} · {{ player().leaderHp }}/{{ player().leaderMaxHp }}</small>
891
- </div>
892
- </article>
893
- <div class="christianity-scoreboard">
894
- <span>{{ t('christianityMatch') }}</span>
895
- <strong>{{ game().matchScore.P1 }}-{{ game().matchScore.P2 }}</strong>
896
- </div>
897
- <article class="christianity-match-player christianity-match-player--opponent">
898
- <span class="christianity-avatar" [style.background]="opponent().avatarColor">{{ opponent().avatar }}</span>
899
- <div>
900
- <strong>{{ opponent().displayName }}</strong>
901
- <small>{{ opponent().leaderName }} · {{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</small>
902
- </div>
903
- </article>
904
- </section>
905
-
906
- <section class="christianity-hand-shelf christianity-hand-shelf--opponent">
907
- <div class="christianity-hand-meter christianity-hand-meter--opponent">
908
- <span>{{ t('christianityHand') }}</span>
909
- <strong>{{ opponentHandCount() }}</strong>
910
- </div>
911
- <section class="christianity-hand-fan christianity-hand-fan--opponent" [attr.aria-label]="t('christianityOpponentHand')">
912
- @for (_ of hiddenHandCards(opponentHandCount()); track $index) {
913
- <button
914
- type="button"
915
- class="christianity-card-preview-card christianity-card-preview-card--back"
916
- valLightRipple
917
- [style.transform]="fanTransform($index, opponentHandCount(), true)"
918
- [attr.aria-label]="t('christianityHiddenCard')"
919
- ></button>
920
- }
921
- </section>
922
- </section>
923
-
924
- <section class="christianity-table" [attr.aria-label]="t('christianityTable')">
925
- <section class="christianity-player-side christianity-player-side--opponent">
926
- <section class="christianity-player-rack christianity-player-rack--opponent">
927
- <div class="christianity-offerings-zone">
928
- <button type="button" class="christianity-offering-pile" valLightRipple (click)="openOfferings('P2')">
929
- <i aria-hidden="true"></i>
930
- <i aria-hidden="true"></i>
931
- <i aria-hidden="true"></i>
932
- <span>{{ t('christianityOfferings') }}</span>
933
- <strong>{{ readyOfferings(opponent()) }}/{{ totalOfferings(opponent()) }}</strong>
934
- </button>
935
- </div>
936
- <button type="button" class="christianity-leader-card" valLightRipple [class.is-target]="selectedAttacker() && !hasOpponentGuards()" (click)="handleOpponentLeader()">
937
- <span>{{ opponent().leaderName }}</span>
938
- <strong>{{ opponent().leaderHp }}/{{ opponent().leaderMaxHp }}</strong>
939
- </button>
940
- <span class="christianity-rack-spacer" aria-hidden="true"></span>
941
- </section>
942
-
943
- <section class="christianity-battle-zone christianity-battle-zone--opponent" [attr.aria-label]="t('christianityOpponentBattle')">
944
- @for (slot of battleSlots('P2'); track slot.trackId) {
945
- @if (slot.card) {
946
- <button
947
- type="button"
948
- class="christianity-card-preview-card christianity-card-preview-card--battle"
949
- valLightRipple
950
- [class.is-target]="selectedAttacker()"
951
- (click)="handleOpponentCharacter(slot.card)"
952
- >
953
- <span>{{ slot.card.name }}</span>
954
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
955
- </button>
956
- } @else {
957
- <span class="christianity-slot"></span>
958
- }
959
- }
960
- </section>
961
- </section>
962
-
963
- <section class="christianity-shared-zone" [attr.aria-label]="t('christianitySharedZone')">
964
- <button type="button" class="christianity-zone-pile christianity-zone-pile--history" valLightRipple (click)="showHistory.set(true)">
965
- <i aria-hidden="true"></i>
966
- <i aria-hidden="true"></i>
967
- <i aria-hidden="true"></i>
968
- <span>{{ t('christianityHistory') }}</span>
969
- <strong>{{ game().historyZone.length }}</strong>
970
- </button>
971
- <button type="button" class="christianity-zone-pile christianity-zone-pile--deck" valLightRipple aria-live="polite" (click)="inspectDeck()">
972
- <i aria-hidden="true"></i>
973
- <i aria-hidden="true"></i>
974
- <i aria-hidden="true"></i>
975
- <span>{{ t('christianityDeck') }}</span>
976
- <strong>{{ game().sharedDeck.length }}</strong>
977
- </button>
978
- <div class="christianity-zone-card">
979
- <span>{{ t('christianityPlace') }}</span>
980
- <strong>{{ t('christianityEmpty') }}</strong>
981
- </div>
982
- </section>
983
-
984
- <section class="christianity-player-side">
985
- <section class="christianity-battle-zone" [attr.aria-label]="t('christianityYourBattle')">
986
- @for (slot of battleSlots('P1'); track slot.trackId) {
987
- @if (slot.card) {
988
- <button
989
- type="button"
990
- class="christianity-card-preview-card christianity-card-preview-card--battle"
991
- valLightRipple
992
- [class.is-selected]="selectedAttacker()?.instanceId === slot.card.instanceId"
993
- [class.is-exhausted]="!slot.card.canAttack"
994
- (click)="selectAttacker(slot.card)"
995
- >
996
- <span>{{ slot.card.name }}</span>
997
- <strong>{{ slot.card.attack }} / {{ slot.card.currentHp }}</strong>
998
- </button>
999
- } @else if (canPlaceSelectedCharacter()) {
1000
- <button type="button" class="christianity-slot christianity-slot--play-target" valLightRipple (click)="playSelectedCard($index)">
1001
- <span>{{ t('christianityPlayHere') }}</span>
1002
- </button>
1003
- } @else {
1004
- <span class="christianity-slot"></span>
1005
- }
1006
- }
1007
- </section>
1008
-
1009
- <section class="christianity-player-rack">
1010
- <div class="christianity-offerings-zone">
1011
- <button
1012
- type="button"
1013
- class="christianity-offering-pile"
1014
- valLightRipple
1015
- (click)="handleOfferingPile('P1')"
1016
- >
1017
- <i aria-hidden="true"></i>
1018
- <i aria-hidden="true"></i>
1019
- <i aria-hidden="true"></i>
1020
- <span>{{ t('christianityOfferings') }}</span>
1021
- <strong>{{ readyOfferings(player()) }}/{{ totalOfferings(player()) }}</strong>
1022
- </button>
1023
- </div>
1024
- <button type="button" class="christianity-leader-card" valLightRipple (click)="inspectLeader('P1')">
1025
- <span>{{ player().leaderName }}</span>
1026
- <strong>{{ player().leaderHp }}/{{ player().leaderMaxHp }}</strong>
1027
- </button>
1028
- <div class="christianity-player-command">
1029
- <div class="christianity-player-badge">
1030
- <span class="christianity-avatar" [style.background]="player().avatarColor">{{ player().avatar }}</span>
1031
- <strong>{{ player().displayName }}</strong>
1032
- </div>
1033
- <button
1034
- type="button"
1035
- class="christianity-end-turn"
1036
- (click)="endTurn()"
1037
- >
1038
- {{ t('christianityEndTurn') }}
1039
- </button>
1040
- </div>
1041
- </section>
1042
- </section>
1043
- </section>
1044
-
1045
- <section class="christianity-hand-shelf">
1046
- <div class="christianity-hand-meter">
1047
- <span>{{ t('christianityHand') }}</span>
1048
- <strong>{{ player().hand?.length ?? 0 }}</strong>
1049
- </div>
1050
- <section class="christianity-hand-fan" [attr.aria-label]="t('christianityYourHand')" (pointerleave)="clearHoveredHandIndex()">
1051
- @for (cardId of player().hand ?? []; track cardId + $index) {
1052
- @let card = cardDefinition(cardId);
1053
- <button
1054
- type="button"
1055
- class="christianity-card-preview-card christianity-card-preview-card--hand"
1056
- valLightRipple
1057
- [class.is-selected]="selectedHandCard() === cardId"
1058
- [class.is-disabled]="!canPlay(card)"
1059
- [style.z-index]="handCardZIndex($index)"
1060
- [style.transform]="fanTransform($index, player().hand?.length ?? 0, false)"
1061
- (pointerenter)="setHoveredHandIndex($index)"
1062
- (pointerdown)="setHoveredHandIndex($index)"
1063
- (pointerup)="releaseHoveredHand($event)"
1064
- (click)="selectHandCard(cardId)"
1065
- >
1066
- <small>
1067
- @if (card.type === 'offering') {
1068
- {{ t('christianityOfferingCard') }}
1069
- } @else {
1070
- {{ t('christianityCost') }} {{ card.cost }}
1071
- }
1072
- </small>
1073
- <span>{{ card.name }}</span>
1074
- <strong>
1075
- @if (card.type === 'offering') {
1076
- +{{ card.life }}
1077
- } @else {
1078
- {{ card.attack }} / {{ card.life }}
1079
- }
1080
- </strong>
1081
- </button>
1082
- }
1083
- </section>
1084
- </section>
1085
-
1086
- @if (selectedPreview()) {
1087
- <button type="button" class="christianity-preview-backdrop" [attr.aria-label]="t('christianityClosePreview')" (click)="closePreview()"></button>
1088
- <aside
1089
- class="christianity-floating-card-shell"
1090
- aria-live="polite"
1091
- >
1092
- <button type="button" class="christianity-floating-card-close" (click)="closePreview()">
1093
- {{ t('close') }}
1094
- </button>
1095
- <div
1096
- class="christianity-floating-card"
1097
- [style.--preview-rotate-x]="previewTilt().rotateX + 'deg'"
1098
- [style.--preview-rotate-y]="previewTilt().rotateY + 'deg'"
1099
- [style.--preview-shift-x]="previewTilt().shiftX + 'px'"
1100
- [style.--preview-shift-y]="previewTilt().shiftY + 'px'"
1101
- (pointermove)="tiltPreview($event)"
1102
- (pointerleave)="resetPreviewTilt()"
1103
- >
1104
- <small>{{ selectedPreview()?.eyebrow }}</small>
1105
- <strong>{{ selectedPreview()?.title }}</strong>
1106
- <span>{{ selectedPreview()?.meta }}</span>
1107
- <p>{{ selectedPreview()?.body }}</p>
1108
- </div>
1109
- </aside>
1110
- }
1111
-
1112
- <section class="christianity-actions" aria-live="polite">
1113
- <p>{{ statusText() }}</p>
1114
- <div>
1115
- <button type="button" [disabled]="selectedActionDisabled()" (click)="playSelectedCard()">
1116
- {{ selectedActionLabel() }}
1117
- </button>
1118
- <button type="button" (click)="resetMock()">
1119
- {{ t('christianityReset') }}
1120
- </button>
1121
- </div>
1122
- </section>
1123
-
1124
- @if (showHistory()) {
1125
- <button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseHistory')" (click)="showHistory.set(false)"></button>
1126
- <section class="christianity-history-drawer">
1127
- <header>
1128
- <h2>{{ t('christianityHistory') }}</h2>
1129
- <div class="christianity-dialog-actions">
1130
- <span>{{ game().historyZone.length }}</span>
1131
- <button type="button" class="christianity-dialog-close" (click)="showHistory.set(false)">
1132
- {{ t('close') }}
1133
- </button>
1134
- </div>
1135
- </header>
1136
- @if (game().historyZone.length) {
1137
- <div class="christianity-history-grid">
1138
- @for (cardId of game().historyZone; track cardId + $index) {
1139
- @let card = cardDefinition(cardId);
1140
- <button type="button" class="christianity-card-preview-card" valLightRipple (click)="inspectHistoryCard(cardId)">
1141
- <small>{{ card.type === 'offering' ? t('christianityOfferingCard') : t('christianityCharacterCard') }}</small>
1142
- <span>{{ card.name }}</span>
1143
- <strong>
1144
- @if (card.type === 'offering') {
1145
- +{{ card.life }}
1146
- } @else {
1147
- {{ card.attack }} / {{ card.life }}
1148
- }
1149
- </strong>
1150
- </button>
1151
- }
1152
- </div>
1153
- } @else {
1154
- <p>{{ t('christianityHistoryEmpty') }}</p>
1155
- }
1156
- </section>
1157
- }
1158
-
1159
- @if (offeringsSeat()) {
1160
- @let offeringPlayer = game().players[offeringsSeat()!];
1161
- <button type="button" class="christianity-history-backdrop" [attr.aria-label]="t('christianityCloseOfferings')" (click)="closeOfferings()"></button>
1162
- <section class="christianity-history-drawer christianity-offerings-drawer">
1163
- <header>
1164
- <h2>{{ t('christianityOfferings') }}</h2>
1165
- <div class="christianity-dialog-actions">
1166
- <span>{{ readyOfferings(offeringPlayer) }}/{{ totalOfferings(offeringPlayer) }}</span>
1167
- <button type="button" class="christianity-dialog-close" (click)="closeOfferings()">
1168
- {{ t('close') }}
1169
- </button>
1170
- </div>
1171
- </header>
1172
- <div class="christianity-offering-list">
1173
- @for (offering of offeringPlayer.offerings; track offering.instanceId) {
1174
- <article class="christianity-offering-row" [class.is-exhausted]="!offering.ready">
1175
- <button type="button" class="christianity-offering-card" valLightRipple (click)="inspectOffering(offering)">
1176
- <small>{{ t('christianityOfferingCard') }}</small>
1177
- <span>{{ offering.name }}</span>
1178
- <strong>+{{ offering.value }}</strong>
1179
- @if (offering.abilityName) {
1180
- <p>{{ offering.abilityName }}</p>
1181
- }
1182
- </button>
1183
- <div>
1184
- <strong>{{ offering.ready ? t('christianityOfferingReady') : t('christianityOfferingExhausted') }}</strong>
1185
- <p>{{ offering.abilityText || t('christianityOfferingNoAbility') }}</p>
1186
- @if (offering.abilityName) {
1187
- <button
1188
- type="button"
1189
- [disabled]="!canUseOfferingAbility(offering, offeringsSeat()!)"
1190
- (click)="useOfferingAbility(offering, offeringsSeat()!)"
1191
- >
1192
- {{ t('christianityUseAbility') }}
1193
- </button>
1194
- }
1195
- </div>
1196
- </article>
1197
- }
1198
- </div>
1199
- </section>
1200
- }
1201
- </main>
1202
- `, styles: [":host{display:block;color:var(--val-text-color, #1f2933)}.christianity-shell{display:grid;gap:.65rem;padding:.75rem .25rem;border:1px solid rgba(36,48,68,.12);border-radius:.75rem;background:#f6f8fb;overflow:visible}.christianity-header,.christianity-match-strip,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-header h1,.christianity-header p,.christianity-match-player strong,.christianity-match-player small,.christianity-scoreboard span,.christianity-history h2,.christianity-actions p{margin:0}.christianity-header h1{font-size:1.35rem;line-height:1.1}.christianity-header p,.christianity-turn span,.christianity-offerings span,.christianity-hidden-hand span,.christianity-deck span,.christianity-place span,.christianity-pile span,.christianity-leader span{color:#1f2933a3;font-size:.75rem}.christianity-turn,.christianity-leader,.christianity-offerings,.christianity-hidden-hand,.christianity-pile,.christianity-deck,.christianity-place{display:grid;gap:.15rem;min-width:5.25rem;padding:.55rem .65rem;border:1px solid rgba(36,48,68,.12);border-radius:.5rem;background:#fff}.christianity-turn.is-own-turn{border-color:#12806c59;background:#ecfdf5}.christianity-match-strip{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);padding:.45rem;border:1px solid rgba(36,48,68,.1);border-radius:.75rem;background:#fff}.christianity-match-player{display:grid;grid-template-columns:auto minmax(0,1fr);gap:.5rem;align-items:center;min-width:0}.christianity-match-player--opponent{direction:rtl}.christianity-match-player--opponent div{direction:ltr;text-align:right}.christianity-match-player div{display:grid;min-width:0}.christianity-match-player strong,.christianity-match-player small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-match-player small,.christianity-scoreboard span{color:#1f293394;font-size:.72rem}.christianity-scoreboard{display:grid;justify-items:center;min-width:4.2rem;padding:0 .55rem;border-right:1px solid rgba(36,48,68,.1);border-left:1px solid rgba(36,48,68,.1)}.christianity-scoreboard strong{font-size:1.2rem;line-height:1}.christianity-table{display:grid;gap:.45rem;padding:.45rem .35rem;border-radius:.75rem;background:#dceafb;overflow:visible}.christianity-player-side{display:grid;gap:.35rem;padding:.35rem .3rem;border-radius:.7rem;background:#ffffff57;grid-template-rows:minmax(7rem,1fr) auto;min-height:13.75rem}.christianity-player-side--opponent{grid-template-rows:auto minmax(7rem,1fr)}.christianity-player{display:grid;gap:.65rem}.christianity-battle-zone{display:grid;grid-template-columns:repeat(5,minmax(4.2rem,1fr));gap:.5rem;align-items:center;min-height:clamp(6.9rem,23vw,8.9rem);padding:.55rem .4rem;border-radius:.75rem;background:#ffffffc2}.christianity-shared-zone{padding:.55rem .4rem;border-radius:.75rem;background:#ffffffe6}.christianity-card,.christianity-end-turn,.christianity-actions button,.christianity-pile,.christianity-leader--target{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card{display:grid;align-content:space-between;min-height:5.8rem;padding:.5rem;text-align:left;box-shadow:0 .5rem 1.25rem #24304414}.christianity-card span{font-weight:700}.christianity-card strong{justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-card.is-selected{border-color:#2563eb;box-shadow:0 0 0 .2rem #2563eb29}.christianity-card.is-disabled,.christianity-card.is-exhausted{opacity:.55}.christianity-card.is-target{border-color:#dc2626}.christianity-offering-cards{display:grid;grid-auto-flow:column;grid-auto-columns:.7rem;gap:.16rem;align-items:end;min-height:1.05rem}.christianity-offering-cards i{display:block;width:.65rem;height:.95rem;border:1px solid rgba(16,42,67,.22);border-radius:.18rem;background:#f8fafc}.christianity-offering-cards i.is-used{background:#cbd5e1;transform:rotate(90deg);transform-origin:center}.christianity-slot{display:grid;place-items:center;min-height:clamp(6.1rem,20vw,7.6rem);border:1px dashed rgba(36,48,68,.22);border-radius:.5rem;background:#ffffff73;color:inherit;font:inherit}.christianity-slot--play-target{position:relative;border-color:#2563eb8c;background:#dbeafec7;color:#1d4ed8;font-weight:800;overflow:hidden;box-shadow:inset 0 0 0 .12rem #60a5fa33,0 .7rem 1.25rem #2563eb29;animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-slot--play-target span{position:relative;z-index:2;padding:.16rem .44rem;border-radius:999px;background:#ffffffc7;font-size:.78rem}@keyframes christianity-target-pulse{0%,to{box-shadow:inset 0 0 0 .12rem #60a5fa33,0 .7rem 1.25rem #2563eb29}50%{box-shadow:inset 0 0 0 .16rem #60a5fa57,0 .9rem 1.65rem #2563eb3d}}.christianity-hand{display:grid;grid-auto-columns:minmax(6rem,8rem);grid-auto-flow:column;gap:.55rem;overflow-x:auto;padding-bottom:.25rem}.christianity-actions{align-items:flex-start;padding:.75rem;border-radius:.75rem;background:#fff}.christianity-actions div{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end}.christianity-actions button,.christianity-end-turn{min-height:2.4rem;padding:0 .75rem;font-weight:700}.christianity-actions button:not(:disabled),.christianity-end-turn{background:#102a43;color:#fff}.christianity-history{padding:.75rem;border-radius:.75rem;background:#fff}.christianity-hand-fan{position:relative;display:flex;justify-content:center;min-height:10.8rem;padding:.25rem .25rem 2.1rem;isolation:isolate;overflow:visible}.christianity-hand-shelf{position:relative;display:grid;z-index:12;min-height:12rem;margin-top:-1.15rem;padding:1.45rem .25rem 1rem;overflow:visible}.christianity-hand-shelf--opponent{z-index:8;min-height:6.85rem;margin-top:0;margin-bottom:0;padding:.45rem .25rem .85rem}.christianity-hand-fan--opponent{min-height:5.9rem;padding-bottom:.75rem;align-items:start}.christianity-card-preview-card,.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile,.christianity-end-turn{border:1px solid rgba(36,48,68,.16);border-radius:.5rem;background:#fff;color:inherit;font:inherit}.christianity-card-preview-card{display:grid;align-content:space-between;width:clamp(4.9rem,17vw,7.1rem);min-height:clamp(6.6rem,22vw,8.8rem);margin-inline:-.42rem;padding:.48rem;text-align:left;transform-origin:50% 115%;transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;box-shadow:0 .5rem 1.25rem #2430441a}.christianity-card-preview-card--hand:hover,.christianity-card-preview-card--hand.is-selected{z-index:3;border-color:#2563eb;box-shadow:0 1rem 2rem #2563eb2e}.christianity-offering-pile.is-play-target{border-color:#2563eb94;background:linear-gradient(180deg,#eff6fff5,#fffffff0),radial-gradient(circle at 82% 14%,rgba(250,204,21,.28) 0 .7rem,transparent .72rem);box-shadow:inset 0 0 0 .12rem #60a5fa3d,0 .8rem 1.55rem #2563eb33;animation:christianity-target-pulse 1.45s ease-in-out infinite}.christianity-card-preview-card--back{width:clamp(4rem,14vw,5.7rem);min-height:clamp(5rem,16vw,6.6rem);box-shadow:0 .8rem 1.55rem #24304424;transform-origin:50% -18%;background:linear-gradient(135deg,#102a431f,#102a4305),repeating-linear-gradient(45deg,#e2e8f0 0 .35rem,#f8fafc .35rem .7rem)}.christianity-card-preview-card--battle{width:100%;min-height:clamp(6.1rem,20vw,7.6rem);margin-inline:0}.christianity-card-preview-card span,.christianity-card-mini span,.christianity-offering-pile span,.christianity-offering-card span,.christianity-leader-card span,.christianity-zone-card span,.christianity-zone-pile span{position:relative;z-index:2;font-weight:700}.christianity-card-preview-card strong,.christianity-card-mini strong,.christianity-offering-pile strong,.christianity-offering-card strong,.christianity-leader-card strong,.christianity-zone-card strong,.christianity-zone-pile strong{position:relative;z-index:3;justify-self:end;padding:.15rem .35rem;border-radius:999px;background:#edf2f7;font-size:.8rem}.christianity-player-rack{display:grid;grid-template-columns:minmax(5.9rem,7rem) minmax(5rem,1fr) minmax(4.2rem,7rem);gap:.45rem;align-items:end;justify-items:stretch}.christianity-player-rack--opponent{align-items:start}.christianity-hand-meter{position:absolute;top:0;right:.35rem;z-index:4;display:inline-grid;grid-auto-flow:column;gap:.25rem;align-items:center;min-height:1.7rem;padding:.18rem .46rem;border:1px solid rgba(36,48,68,.12);border-radius:999px;background:#ffffffe6;box-shadow:0 .35rem .8rem #102a4314}.christianity-hand-meter--opponent{top:.15rem}.christianity-hand-meter span{color:#1f293394;font-size:.68rem}.christianity-hand-meter strong{font-size:.86rem}.christianity-player-badge,.christianity-player-command{display:grid;gap:.35rem;justify-items:center;min-width:0}.christianity-player-badge{align-content:start;color:#1f2933c2;font-size:.74rem}.christianity-player-badge--opponent{justify-self:center;grid-auto-flow:column;align-items:center;justify-content:center}.christianity-player-badge strong{max-width:6.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.christianity-avatar{display:grid;place-items:center;width:1.85rem;height:1.85rem;border-radius:999px;color:#fff;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .9rem #102a4329}.christianity-offerings-zone{display:flex;flex-wrap:wrap;gap:.25rem;justify-content:flex-start;justify-self:start;width:100%}.christianity-card-mini,.christianity-offering-pile,.christianity-offering-card,.christianity-leader-card,.christianity-zone-card,.christianity-zone-pile{display:grid;align-content:space-between;min-height:4.9rem;padding:.48rem;text-align:left}.christianity-card-mini{width:3.5rem}.christianity-offering-pile{position:relative;isolation:isolate;overflow:hidden;justify-self:start;width:min(100%,5.9rem);min-height:7.1rem;padding:.95rem .52rem .6rem;background:linear-gradient(180deg,#fff,#f8fafc),linear-gradient(135deg,rgba(250,204,21,.18),transparent 42%)}.christianity-offering-pile i{position:absolute;inset:auto auto 1.05rem .72rem;z-index:-1;width:2.55rem;height:3.55rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:linear-gradient(180deg,#ffffffeb,#f1f5f9eb),radial-gradient(circle at 78% 18%,#facc15 0 .38rem,transparent .4rem);box-shadow:0 .35rem .85rem #102a431a;transform:rotate(-5deg)}.christianity-offering-pile i:nth-child(2){transform:translate(.28rem,.08rem) rotate(3deg)}.christianity-offering-pile i:nth-child(3){transform:translate(.55rem,.18rem) rotate(-1deg)}.christianity-leader-card{align-self:center;justify-self:center;width:clamp(4.75rem,17vw,6rem);min-height:clamp(6.6rem,22vw,8.4rem)}.christianity-rack-spacer{display:block;min-height:1px}.christianity-battle-zone{grid-template-columns:repeat(4,minmax(4rem,1fr))}.christianity-shared-zone{display:grid;grid-template-columns:repeat(3,minmax(4.3rem,1fr));align-items:stretch}.christianity-zone-card,.christianity-zone-pile{min-height:6.45rem;padding:.7rem .52rem .55rem}.christianity-zone-pile{position:relative;isolation:isolate;overflow:hidden;box-shadow:inset 0 0 0 999px #ffffff1f}.christianity-zone-pile i{position:absolute;inset:auto .72rem 1.02rem auto;z-index:-1;width:2.7rem;height:3.7rem;border:1px solid rgba(16,42,67,.18);border-radius:.35rem;background:#f8fafc;box-shadow:0 .35rem .85rem #102a431c;transform:rotate(4deg)}.christianity-zone-pile i:nth-child(2){transform:translate(-.28rem,.12rem) rotate(-3deg)}.christianity-zone-pile i:nth-child(3){background:linear-gradient(135deg,#102a4329,#102a4308),repeating-linear-gradient(45deg,#dbeafe 0 .33rem,#fff .33rem .66rem);transform:translate(-.54rem,.24rem) rotate(2deg)}.christianity-floating-card-shell{position:fixed;top:50%;left:50%;z-index:61;width:min(23rem,calc(100vw - 1.25rem));transform:translate(-50%,-50%)}.christianity-floating-card{display:grid;gap:.45rem;width:100%;min-height:min(31rem,calc(100vh - 3.5rem));padding:1.15rem;border:1px solid rgba(36,48,68,.18);border-radius:.75rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 20% 0%,rgba(37,99,235,.12),transparent 45%);box-shadow:0 0 0 .18rem #bfdbfe6b,0 0 2.2rem #60a5fa57,0 2.4rem 5rem #102a4357,inset 0 0 0 .35rem #ffffff8c;touch-action:none;transform:translate(var(--preview-shift-x, 0px),var(--preview-shift-y, 0px)) perspective(48rem) rotateX(var(--preview-rotate-x, 5deg)) rotateY(var(--preview-rotate-y, -5deg));transition:transform 90ms ease-out}.christianity-floating-card-close{position:absolute;top:-2.6rem;right:0;z-index:62;min-height:2rem;padding:0 .6rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#ffffffe6;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .45rem 1rem #102a431a}.christianity-preview-backdrop,.christianity-history-backdrop{position:fixed;inset:0;border:0;border-radius:0;background:#0f172a75}.christianity-preview-backdrop{z-index:60}.christianity-floating-card small,.christianity-floating-card span{color:#1f2933a3}.christianity-floating-card strong{font-size:clamp(1.55rem,8vw,2.35rem);line-height:1.05}.christianity-floating-card p{margin:0;align-self:end;font-size:.95rem;line-height:1.35}.christianity-history-backdrop{z-index:40}.christianity-history-drawer{position:fixed;right:auto;bottom:max(.5rem,env(safe-area-inset-bottom));left:50%;z-index:41;display:grid;grid-template-rows:auto minmax(0,1fr);gap:.75rem;width:min(calc(100vw - 1rem),44rem);min-height:min(18rem,calc(100dvh - 1rem));max-height:min(32rem,calc(100dvh - 2rem));padding:.8rem;border:1px solid rgba(36,48,68,.16);border-radius:.75rem;background:#fffffffa;box-shadow:0 1.5rem 4rem #102a4347;transform:translate(-50%)}.christianity-history-drawer header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.christianity-history-drawer h2,.christianity-history-drawer p{margin:0}.christianity-history-drawer header span{display:grid;place-items:center;min-width:1.85rem;height:1.85rem;border-radius:999px;background:#edf2f7;font-weight:800}.christianity-dialog-actions{display:flex;align-items:center;gap:.45rem}.christianity-dialog-close{min-height:1.85rem;padding:0 .62rem;border:1px solid rgba(36,48,68,.14);border-radius:999px;background:#fff;color:#1f2933c7;font:inherit;font-size:.76rem;font-weight:800;box-shadow:0 .35rem .8rem #102a4314}.christianity-history-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(5.4rem,1fr));gap:.55rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem .1rem .25rem}.christianity-history-grid::-webkit-scrollbar,.christianity-offering-list::-webkit-scrollbar{width:.65rem}.christianity-history-grid::-webkit-scrollbar-track,.christianity-offering-list::-webkit-scrollbar-track{border-radius:999px;background:#e2e8f0b8}.christianity-history-grid::-webkit-scrollbar-thumb,.christianity-offering-list::-webkit-scrollbar-thumb{border:.14rem solid rgba(226,232,240,.72);border-radius:999px;background:#24304452}.christianity-offerings-drawer{width:min(calc(100vw - 1rem),48rem);min-height:min(20rem,calc(100dvh - 1rem));max-height:min(34rem,calc(100dvh - 2rem))}.christianity-offering-list{display:grid;gap:.6rem;min-height:0;overflow-y:scroll;scrollbar-color:rgba(36,48,68,.32) rgba(226,232,240,.72);scrollbar-gutter:stable;padding:.1rem}.christianity-offering-row{display:grid;grid-template-columns:minmax(4.9rem,6.2rem) minmax(0,1fr);gap:.65rem;align-items:stretch;padding:.45rem;border:1px solid rgba(36,48,68,.12);border-radius:.65rem;background:#fff}.christianity-offering-row.is-exhausted{opacity:.68}.christianity-offering-card{min-height:7.4rem;background:linear-gradient(180deg,#fffffff5,#f8fafcf5),radial-gradient(circle at 82% 14%,#facc15 0 .48rem,transparent .5rem);box-shadow:0 .45rem 1rem #102a431a}.christianity-offering-card small{color:#1f293394;font-size:.66rem;text-transform:uppercase}.christianity-offering-card p,.christianity-offering-row p{margin:0}.christianity-offering-card p{align-self:end;color:#1f2933a3;font-size:.72rem;line-height:1.2}.christianity-offering-row>div{display:grid;gap:.35rem;align-content:center;min-width:0}.christianity-offering-row>div p{color:#1f2933b8;font-size:.85rem;line-height:1.3}.christianity-offering-row>div button{justify-self:start;min-height:2.2rem;padding:0 .7rem;border:1px solid rgba(16,42,67,.16);border-radius:.5rem;background:#102a43;color:#fff;font:inherit;font-weight:800}.christianity-offering-row>div button:disabled{background:#e2e8f0;color:#1f293394}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible{outline:.1875rem solid rgba(37,99,235,.24);outline-offset:.125rem}@media (max-width: 720px){.christianity-shell{padding:.55rem 0;border-right:0;border-left:0;border-radius:0}.christianity-header,.christianity-player__summary,.christianity-shared-zone,.christianity-actions{align-items:stretch;flex-direction:column}.christianity-match-strip{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:.35rem;padding:.35rem}.christianity-match-player{gap:.35rem}.christianity-match-player small{display:none}.christianity-scoreboard{min-width:3.65rem;padding:0 .35rem}.christianity-scoreboard strong{font-size:1.05rem}.christianity-table{gap:.35rem}.christianity-player-side{padding:.3rem .25rem}.christianity-battle-zone{grid-template-columns:repeat(4,minmax(3.35rem,1fr));overflow-x:auto}.christianity-hand-fan{min-height:10.55rem;padding-bottom:2rem;overflow:visible}.christianity-hand-shelf{min-height:11.75rem;margin-top:-1rem;padding-top:1.35rem;padding-bottom:.9rem}.christianity-hand-shelf--opponent{min-height:6.65rem;margin-top:0;margin-bottom:0;padding-top:.4rem;padding-bottom:.85rem}.christianity-player-rack{grid-template-columns:minmax(4.7rem,5.9rem) minmax(4.8rem,1fr) minmax(3.7rem,5rem)}.christianity-shared-zone{grid-template-columns:repeat(3,minmax(3.7rem,1fr))}.christianity-zone-card,.christianity-zone-pile{min-height:6.15rem;padding:.58rem .46rem .5rem}.christianity-offering-pile{min-height:6.85rem;padding:.88rem .46rem .55rem}.christianity-card-preview-card{width:clamp(4.2rem,20vw,5.7rem);min-height:clamp(5.8rem,26vw,7.4rem)}.christianity-leader-card{width:clamp(4.55rem,20vw,5.7rem);min-height:clamp(6.15rem,27vw,7.6rem)}.christianity-offering-row{grid-template-columns:minmax(4.5rem,5.5rem) minmax(0,1fr);gap:.5rem}.christianity-hand-fan--opponent{min-height:5.75rem;padding-bottom:.7rem}}\n"] }]
1203
- }], ctorParameters: () => [] });
1204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LWdhbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NocmlzdGlhbml0eS1nYW1lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBd0JwRCxNQUFNLGFBQWEsR0FBK0M7SUFDaEUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtJQUNuRyxXQUFXLEVBQUU7UUFDWCxFQUFFLEVBQUUsYUFBYTtRQUNqQixJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLElBQUksRUFBRSxVQUFVO1FBQ2hCLElBQUksRUFBRSxDQUFDO1FBQ1AsTUFBTSxFQUFFLENBQUM7UUFDVCxJQUFJLEVBQUUsQ0FBQztRQUNQLFdBQVcsRUFBRSxpQ0FBaUM7UUFDOUMsV0FBVyxFQUFFLDJEQUEyRDtRQUN4RSxXQUFXLEVBQUUsQ0FBQztLQUNmO0lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDekYsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDekYsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDL0YsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7SUFDekYsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7Q0FDbkcsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsVUFBVTtJQUNWLFNBQVM7SUFDVCxhQUFhO0lBQ2IsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtDQUNYLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBMEI7SUFDM0MsTUFBTSxFQUFFLG1CQUFtQjtJQUMzQixNQUFNLEVBQUUsYUFBYTtJQUNyQixJQUFJLEVBQUUsWUFBWTtJQUNsQixTQUFTLEVBQUUsSUFBSTtJQUNmLFFBQVEsRUFBRSxDQUFDO0lBQ1gsU0FBUyxFQUFFLENBQUM7SUFDWixVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7SUFDNUIsVUFBVSxFQUFFLG9CQUFvQjtJQUNoQyxXQUFXLEVBQUUsRUFBRTtJQUNmLE9BQU8sRUFBRTtRQUNQLEVBQUUsRUFBRTtZQUNGLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLFNBQVM7WUFDdEIsTUFBTSxFQUFFLEdBQUc7WUFDWCxXQUFXLEVBQUUsU0FBUztZQUN0QixVQUFVLEVBQUUsTUFBTTtZQUNsQixRQUFRLEVBQUUsRUFBRTtZQUNaLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFO2dCQUNULEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO2dCQUNqSDtvQkFDRSxVQUFVLEVBQUUsaUJBQWlCO29CQUM3QixNQUFNLEVBQUUsYUFBYTtvQkFDckIsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsS0FBSyxFQUFFLElBQUk7b0JBQ1gsS0FBSyxFQUFFLElBQUk7b0JBQ1gsS0FBSyxFQUFFLENBQUM7b0JBQ1IsV0FBVyxFQUFFLGlDQUFpQztvQkFDOUMsV0FBVyxFQUFFLDJEQUEyRDtvQkFDeEUsV0FBVyxFQUFFLENBQUM7aUJBQ2Y7YUFDRjtZQUNELHNCQUFzQixFQUFFLEtBQUs7WUFDN0IsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDO1lBQ3JELFVBQVUsRUFBRSxFQUFFO1NBQ2Y7UUFDRCxFQUFFLEVBQUU7WUFDRixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsV0FBVyxFQUFFLFNBQVM7WUFDdEIsVUFBVSxFQUFFLE1BQU07WUFDbEIsUUFBUSxFQUFFLEVBQUU7WUFDWixXQUFXLEVBQUUsRUFBRTtZQUNmLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDOUgsc0JBQXNCLEVBQUUsS0FBSztZQUM3QixTQUFTLEVBQUUsQ0FBQztZQUNaLFVBQVUsRUFBRTtnQkFDVjtvQkFDRSxVQUFVLEVBQUUsU0FBUztvQkFDckIsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLElBQUksRUFBRSxPQUFPO29CQUNiLEtBQUssRUFBRSxJQUFJO29CQUNYLFVBQVUsRUFBRSxJQUFJO29CQUNoQixNQUFNLEVBQUUsQ0FBQztvQkFDVCxTQUFTLEVBQUUsQ0FBQztvQkFDWixLQUFLLEVBQUUsQ0FBQztvQkFDUixTQUFTLEVBQUUsS0FBSztpQkFDakI7YUFDRjtTQUNGO0tBQ0Y7SUFDRCxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztDQUMzQixDQUFDO0FBczNDRixNQUFNLE9BQU8seUJBQXlCO0lBd0NwQztRQXZDUSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhCLFNBQUksR0FBRyxNQUFNLENBQXdCLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLHFCQUFnQixHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsTUFBTSxDQUF1QyxJQUFJLENBQUMsQ0FBQztRQUN0RSxvQkFBZSxHQUFHLE1BQU0sQ0FBaUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsZ0JBQVcsR0FBRyxNQUFNLENBQTBCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRyxxQkFBZ0IsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQy9DLGdCQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLGtCQUFhLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztRQUV0RCxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsY0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzNELHNCQUFpQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxRSxzQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRywyQkFBc0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDZ0IsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUNySCxDQUFDO1lBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUMvRyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFHRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRVMsQ0FBQyxDQUFDLEdBQVc7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRVMsY0FBYyxDQUFDLE1BQWM7UUFDckMsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxXQUFXLENBQUMsSUFBc0I7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDbkQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5QyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsSUFBSSxHQUFHLElBQUksVUFBVSxLQUFLLEVBQUU7WUFDN0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRVMsZUFBZSxDQUFDLEtBQWE7UUFDckMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVTLFlBQVksQ0FBQyxLQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWlCO1FBQ3BFLElBQUksS0FBSyxJQUFJLENBQUM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFPLGFBQWEsU0FBUyxRQUFRLE9BQU8sZUFBZSxNQUFNLGNBQWMsS0FBSyxHQUFHLENBQUM7SUFDMUYsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFhO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksT0FBTyxLQUFLLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBYTtRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyxxQkFBcUI7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsa0JBQWtCLENBQUMsS0FBbUI7UUFDOUMsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQWE7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksUUFBUSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRVMsY0FBYyxDQUFDLE1BQStCO1FBQ3RELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRVMsY0FBYyxDQUFDLE1BQStCO1FBQ3RELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRVMsT0FBTyxDQUFDLElBQWdDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVU7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLHNCQUFzQixDQUFDO1FBQzNFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRVMsZUFBZTtRQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QyxPQUFPLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLG1CQUFtQjtRQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFUyxzQkFBc0I7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEQsT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRVMseUJBQXlCO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFUyx3QkFBd0I7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDL0MsT0FBTyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVTLGNBQWMsQ0FBQyxNQUFjO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsU0FBa0I7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLFVBQVUsRUFBRSxlQUFlLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFO29CQUM5QyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLEtBQUssRUFBRSxJQUFJO29CQUNYLEtBQUssRUFBRSxJQUFJO29CQUNYLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO29CQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7b0JBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztpQkFDOUIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUYsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtvQkFDdkMsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7b0JBQ2pFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsS0FBSyxFQUFFLElBQUk7b0JBQ1gsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2hCLFNBQVMsRUFBRSxLQUFLO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUc7Z0JBQ1QsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksNEJBQTRCLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksb0JBQW9CO2dCQUN0RyxHQUFHLElBQUksQ0FBQyxHQUFHO2FBQ1osQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVTLGtCQUFrQixDQUFDLElBQXNCO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVTLGNBQWMsQ0FBQyxJQUFtQztRQUMxRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVTLHVCQUF1QixDQUFDLElBQW1DO1FBQ25FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVTLG9CQUFvQjtRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVTLFlBQVk7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3RCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztnQkFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVO2dCQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQztnQkFDekMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNsRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQzthQUM1QyxDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEcsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZGLFlBQVksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsSUFBSSx3QkFBd0IsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFUyxlQUFlLENBQUMsTUFBcUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xHLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6RSxVQUFVLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDNUMsWUFBWSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzVDLFlBQVksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLG1CQUFtQixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsT0FBTztRQUNmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7WUFDdkMsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUNULFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCO2dCQUM1RSxZQUFZLE9BQU8sQ0FBQyxXQUFXLEdBQUc7Z0JBQ2xDLEdBQUcsSUFBSSxDQUFDLEdBQUc7YUFDWixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDZCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLFNBQVM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFUyxhQUFhLENBQUMsSUFBc0I7UUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVTLGNBQWM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVTLFdBQVcsQ0FBQyxLQUFtQjtRQUN2QyxNQUFNLE1BQU0sR0FBSSxLQUFLLENBQUMsYUFBNkIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDN0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNuQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNwQixNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUU7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBK0IsRUFBRSxJQUEyQjtRQUNuRixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRVMsYUFBYSxDQUFDLElBQXNCO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDO1lBQ3pDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUNoRCxJQUFJLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDO1NBQzNILENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxlQUFlLENBQUMsUUFBc0M7UUFDOUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO1lBQzNDLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUM7WUFDcEcsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztTQUNqRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMscUJBQXFCLENBQUMsUUFBc0MsRUFBRSxJQUFzQjtRQUM1RixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUFzQyxFQUFFLElBQXNCO1FBQ3pGLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU87UUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1RixJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDdEQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNySCxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxXQUFXO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDO1lBQ3pDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3hDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO1NBQ3JDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxlQUFlLENBQUMsTUFBYztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQztZQUM1RyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUM3SCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQztTQUMxRyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsTUFBYztRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFtQztRQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDaEIsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUM7WUFDNUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3hDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUM7U0FDdkcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUErQixFQUFFLElBQVk7UUFDbEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDakQsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFDdkQsU0FBUyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDNUIsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBNWJVLHlCQUF5QjttR0FBekIseUJBQXlCLGlGQWgzQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwVVQsc3FrQkEzVVMsb0JBQW9COzs0RkFpM0NuQix5QkFBeUI7a0JBcDNDckMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxXQUNQLENBQUMsb0JBQW9CLENBQUMsWUFDckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBVVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IExpZ2h0UmlwcGxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9saWdodC1yaXBwbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBNSU5JX0dBTUVTX0kxOE4gfSBmcm9tICcuL21pbmktZ2FtZXMuaTE4bic7XG5pbXBvcnQge1xuICBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgQ2hyaXN0aWFuaXR5T2ZmZXJpbmdJbnN0YW5jZSxcbiAgQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUsXG4gIENocmlzdGlhbml0eVNlYXQsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5pbnRlcmZhY2UgQ2hyaXN0aWFuaXR5Q2FyZFByZXZpZXcge1xuICB0aXRsZTogc3RyaW5nO1xuICBleWVicm93OiBzdHJpbmc7XG4gIG1ldGE6IHN0cmluZztcbiAgYm9keTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hyaXN0aWFuaXR5UHJldmlld1RpbHQge1xuICByb3RhdGVYOiBudW1iZXI7XG4gIHJvdGF0ZVk6IG51bWJlcjtcbiAgc2hpZnRYOiBudW1iZXI7XG4gIHNoaWZ0WTogbnVtYmVyO1xufVxuXG5jb25zdCBTVEFSVEVSX0NBUkRTOiBSZWNvcmQ8c3RyaW5nLCBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbj4gPSB7XG4gIG9fc2ltcGxlOiB7IGlkOiAnb19zaW1wbGUnLCBuYW1lOiAnT2ZyZW5kYSBzaW1wbGUnLCB0eXBlOiAnb2ZmZXJpbmcnLCBjb3N0OiAwLCBhdHRhY2s6IDAsIGxpZmU6IDEgfSxcbiAgb19mb3JiaWRkZW46IHtcbiAgICBpZDogJ29fZm9yYmlkZGVuJyxcbiAgICBuYW1lOiAnRWwgZnJ1dG8gcHJvaGliaWRvJyxcbiAgICB0eXBlOiAnb2ZmZXJpbmcnLFxuICAgIGNvc3Q6IDAsXG4gICAgYXR0YWNrOiAwLFxuICAgIGxpZmU6IDIsXG4gICAgYWJpbGl0eU5hbWU6ICdDb25vY2ltaWVudG8gZGVsIGJpZW4geSBkZWwgbWFsJyxcbiAgICBhYmlsaXR5VGV4dDogJ0FsIHVzYXJsYSwgZGlzbWludXllIGVuIDEgbG9zIHB1bnRvcyBkZSB2aWRhIGRlIHR1IExpZGVyLicsXG4gICAgYWJpbGl0eUNvc3Q6IDAsXG4gIH0sXG4gIHBfc2NvdXQ6IHsgaWQ6ICdwX3Njb3V0JywgbmFtZTogJ1Njb3V0JywgdHlwZTogJ2NoYXJhY3RlcicsIGNvc3Q6IDEsIGF0dGFjazogMSwgbGlmZTogMSB9LFxuICBwX2d1YXJkOiB7IGlkOiAncF9ndWFyZCcsIG5hbWU6ICdHdWFyZCcsIHR5cGU6ICdjaGFyYWN0ZXInLCBjb3N0OiAyLCBhdHRhY2s6IDEsIGxpZmU6IDMgfSxcbiAgcF93YXJyaW9yOiB7IGlkOiAncF93YXJyaW9yJywgbmFtZTogJ1dhcnJpb3InLCB0eXBlOiAnY2hhcmFjdGVyJywgY29zdDogMiwgYXR0YWNrOiAyLCBsaWZlOiAyIH0sXG4gIHBfZWxkZXI6IHsgaWQ6ICdwX2VsZGVyJywgbmFtZTogJ0VsZGVyJywgdHlwZTogJ2NoYXJhY3RlcicsIGNvc3Q6IDMsIGF0dGFjazogMiwgbGlmZTogNCB9LFxuICBwX2NoYW1waW9uOiB7IGlkOiAncF9jaGFtcGlvbicsIG5hbWU6ICdDaGFtcGlvbicsIHR5cGU6ICdjaGFyYWN0ZXInLCBjb3N0OiA0LCBhdHRhY2s6IDQsIGxpZmU6IDQgfSxcbn07XG5cbmNvbnN0IFNUQVJUSU5HX1NIQVJFRF9ERUNLID0gW1xuICAnb19zaW1wbGUnLFxuICAncF9zY291dCcsXG4gICdvX2ZvcmJpZGRlbicsXG4gICdvX3NpbXBsZScsXG4gICdwX2d1YXJkJyxcbiAgJ3Bfd2FycmlvcicsXG4gICdvX3NpbXBsZScsXG4gICdwX2VsZGVyJyxcbiAgJ3Bfc2NvdXQnLFxuICAnb19zaW1wbGUnLFxuICAncF9jaGFtcGlvbicsXG4gICdwX2d1YXJkJyxcbiAgJ29fc2ltcGxlJyxcbiAgJ3Bfd2FycmlvcicsXG4gICdwX3Njb3V0JyxcbiAgJ29fc2ltcGxlJyxcbiAgJ3BfZWxkZXInLFxuICAncF9ndWFyZCcsXG4gICdvX3NpbXBsZScsXG5dO1xuXG5jb25zdCBTVEFSVElOR19HQU1FOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUgPSB7XG4gIGdhbWVJZDogJ21vY2stY2hyaXN0aWFuaXR5JyxcbiAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICBtb2RlOiAnbG9jYWxfcGFzcycsXG4gIHR1cm5Pd25lcjogJ1AxJyxcbiAgcmV2aXNpb246IDAsXG4gIHR1cm5Db3VudDogMSxcbiAgbWF0Y2hTY29yZTogeyBQMTogMSwgUDI6IDAgfSxcbiAgc2hhcmVkRGVjazogU1RBUlRJTkdfU0hBUkVEX0RFQ0ssXG4gIGhpc3Rvcnlab25lOiBbXSxcbiAgcGxheWVyczoge1xuICAgIFAxOiB7XG4gICAgICBzZWF0OiAnUDEnLFxuICAgICAgZGlzcGxheU5hbWU6ICdKdWdhZG9yJyxcbiAgICAgIGF2YXRhcjogJ0onLFxuICAgICAgYXZhdGFyQ29sb3I6ICcjMjU2M2ViJyxcbiAgICAgIGxlYWRlck5hbWU6ICdBZGFtJyxcbiAgICAgIGxlYWRlckhwOiAxNSxcbiAgICAgIGxlYWRlck1heEhwOiAxNSxcbiAgICAgIG9mZmVyaW5nczogW1xuICAgICAgICB7IGluc3RhbmNlSWQ6ICdwMV9vZmZlcmluZ18wMDEnLCBjYXJkSWQ6ICdvX3NpbXBsZScsIG5hbWU6ICdPZnJlbmRhIHNpbXBsZScsIG93bmVyOiAnUDEnLCByZWFkeTogdHJ1ZSwgdmFsdWU6IDEgfSxcbiAgICAgICAge1xuICAgICAgICAgIGluc3RhbmNlSWQ6ICdwMV9vZmZlcmluZ18wMDInLFxuICAgICAgICAgIGNhcmRJZDogJ29fZm9yYmlkZGVuJyxcbiAgICAgICAgICBuYW1lOiAnRWwgZnJ1dG8gcHJvaGliaWRvJyxcbiAgICAgICAgICBvd25lcjogJ1AxJyxcbiAgICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgICBhYmlsaXR5TmFtZTogJ0Nvbm9jaW1pZW50byBkZWwgYmllbiB5IGRlbCBtYWwnLFxuICAgICAgICAgIGFiaWxpdHlUZXh0OiAnQWwgdXNhcmxhLCBkaXNtaW51eWUgZW4gMSBsb3MgcHVudG9zIGRlIHZpZGEgZGUgdHUgTGlkZXIuJyxcbiAgICAgICAgICBhYmlsaXR5Q29zdDogMCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBvZmZlcmluZ1BsYXllZFRoaXNUdXJuOiBmYWxzZSxcbiAgICAgIGhhbmQ6IFsnb19zaW1wbGUnLCAncF9zY291dCcsICdwX3dhcnJpb3InLCAncF9ndWFyZCddLFxuICAgICAgYmF0dGxlWm9uZTogW10sXG4gICAgfSxcbiAgICBQMjoge1xuICAgICAgc2VhdDogJ1AyJyxcbiAgICAgIGRpc3BsYXlOYW1lOiAnUml2YWwnLFxuICAgICAgYXZhdGFyOiAnUicsXG4gICAgICBhdmF0YXJDb2xvcjogJyNiNDUzMDknLFxuICAgICAgbGVhZGVyTmFtZTogJ05vYWgnLFxuICAgICAgbGVhZGVySHA6IDE1LFxuICAgICAgbGVhZGVyTWF4SHA6IDE1LFxuICAgICAgb2ZmZXJpbmdzOiBbeyBpbnN0YW5jZUlkOiAncDJfb2ZmZXJpbmdfMDAxJywgY2FyZElkOiAnb19zaW1wbGUnLCBuYW1lOiAnT2ZyZW5kYSBzaW1wbGUnLCBvd25lcjogJ1AyJywgcmVhZHk6IHRydWUsIHZhbHVlOiAxIH1dLFxuICAgICAgb2ZmZXJpbmdQbGF5ZWRUaGlzVHVybjogZmFsc2UsXG4gICAgICBoYW5kQ291bnQ6IDQsXG4gICAgICBiYXR0bGVab25lOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiAnb3BwXzAwMScsXG4gICAgICAgICAgY2FyZElkOiAncF9zY291dCcsXG4gICAgICAgICAgbmFtZTogJ1Njb3V0JyxcbiAgICAgICAgICBvd25lcjogJ1AyJyxcbiAgICAgICAgICBjb250cm9sbGVyOiAnUDInLFxuICAgICAgICAgIGF0dGFjazogMSxcbiAgICAgICAgICBjdXJyZW50SHA6IDEsXG4gICAgICAgICAgbWF4SHA6IDEsXG4gICAgICAgICAgY2FuQXR0YWNrOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgbG9nOiBbJ1BhcnRpZGEgaW5pY2lhZGEuJ10sXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY2hyaXN0aWFuaXR5LWdhbWUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTGlnaHRSaXBwbGVEaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxtYWluIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXNoZWxsXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNocmlzdGlhbml0eS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD57eyB0KCdjaHJpc3RpYW5pdHlFeWVicm93JykgfX08L3A+XG4gICAgICAgICAgPGgxPnt7IHQoJ2NocmlzdGlhbml0eVRpdGxlJykgfX08L2gxPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNocmlzdGlhbml0eS10dXJuXCIgW2NsYXNzLmlzLW93bi10dXJuXT1cImlzT3duVHVybigpXCI+XG4gICAgICAgICAgPHNwYW4+e3sgdCgnY2hyaXN0aWFuaXR5VHVybicpIH19PC9zcGFuPlxuICAgICAgICAgIDxzdHJvbmc+e3sgY3VycmVudFBsYXllcigpLmRpc3BsYXlOYW1lIH19PC9zdHJvbmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNocmlzdGlhbml0eS1tYXRjaC1zdHJpcFwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY2hyaXN0aWFuaXR5TWF0Y2hTY29yZScpXCI+XG4gICAgICAgIDxhcnRpY2xlIGNsYXNzPVwiY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWF2YXRhclwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInBsYXllcigpLmF2YXRhckNvbG9yXCI+e3sgcGxheWVyKCkuYXZhdGFyIH19PC9zcGFuPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHBsYXllcigpLmRpc3BsYXlOYW1lIH19PC9zdHJvbmc+XG4gICAgICAgICAgICA8c21hbGw+e3sgcGxheWVyKCkubGVhZGVyTmFtZSB9fSDCtyB7eyBwbGF5ZXIoKS5sZWFkZXJIcCB9fS97eyBwbGF5ZXIoKS5sZWFkZXJNYXhIcCB9fTwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYXJ0aWNsZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNocmlzdGlhbml0eS1zY29yZWJvYXJkXCI+XG4gICAgICAgICAgPHNwYW4+e3sgdCgnY2hyaXN0aWFuaXR5TWF0Y2gnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPnt7IGdhbWUoKS5tYXRjaFNjb3JlLlAxIH19LXt7IGdhbWUoKS5tYXRjaFNjb3JlLlAyIH19PC9zdHJvbmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cImNocmlzdGlhbml0eS1tYXRjaC1wbGF5ZXIgY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllci0tb3Bwb25lbnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNocmlzdGlhbml0eS1hdmF0YXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJvcHBvbmVudCgpLmF2YXRhckNvbG9yXCI+e3sgb3Bwb25lbnQoKS5hdmF0YXIgfX08L3NwYW4+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgb3Bwb25lbnQoKS5kaXNwbGF5TmFtZSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNtYWxsPnt7IG9wcG9uZW50KCkubGVhZGVyTmFtZSB9fSDCtyB7eyBvcHBvbmVudCgpLmxlYWRlckhwIH19L3t7IG9wcG9uZW50KCkubGVhZGVyTWF4SHAgfX08L3NtYWxsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2FydGljbGU+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWhhbmQtc2hlbGYgY2hyaXN0aWFuaXR5LWhhbmQtc2hlbGYtLW9wcG9uZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaHJpc3RpYW5pdHktaGFuZC1tZXRlciBjaHJpc3RpYW5pdHktaGFuZC1tZXRlci0tb3Bwb25lbnRcIj5cbiAgICAgICAgICA8c3Bhbj57eyB0KCdjaHJpc3RpYW5pdHlIYW5kJykgfX08L3NwYW4+XG4gICAgICAgICAgPHN0cm9uZz57eyBvcHBvbmVudEhhbmRDb3VudCgpIH19PC9zdHJvbmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNocmlzdGlhbml0eS1oYW5kLWZhbiBjaHJpc3RpYW5pdHktaGFuZC1mYW4tLW9wcG9uZW50XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjaHJpc3RpYW5pdHlPcHBvbmVudEhhbmQnKVwiPlxuICAgICAgICAgIEBmb3IgKF8gb2YgaGlkZGVuSGFuZENhcmRzKG9wcG9uZW50SGFuZENvdW50KCkpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWNhcmQtcHJldmlldy1jYXJkIGNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZC0tYmFja1wiXG4gICAgICAgICAgICAgIHZhbExpZ2h0UmlwcGxlXG4gICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiZmFuVHJhbnNmb3JtKCRpbmRleCwgb3Bwb25lbnRIYW5kQ291bnQoKSwgdHJ1ZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NocmlzdGlhbml0eUhpZGRlbkNhcmQnKVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXRhYmxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjaHJpc3RpYW5pdHlUYWJsZScpXCI+XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXBsYXllci1zaWRlIGNocmlzdGlhbml0eS1wbGF5ZXItc2lkZS0tb3Bwb25lbnRcIj5cbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNocmlzdGlhbml0eS1wbGF5ZXItcmFjayBjaHJpc3RpYW5pdHktcGxheWVyLXJhY2stLW9wcG9uZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hyaXN0aWFuaXR5LW9mZmVyaW5ncy16b25lXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2hyaXN0aWFuaXR5LW9mZmVyaW5nLXBpbGVcIiB2YWxMaWdodFJpcHBsZSAoY2xpY2spPVwib3Blbk9mZmVyaW5ncygnUDInKVwiPlxuICAgICAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8aSBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHQoJ2NocmlzdGlhbml0eU9mZmVyaW5ncycpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcmVhZHlPZmZlcmluZ3Mob3Bwb25lbnQoKSkgfX0ve3sgdG90YWxPZmZlcmluZ3Mob3Bwb25lbnQoKSkgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWxlYWRlci1jYXJkXCIgdmFsTGlnaHRSaXBwbGUgW2NsYXNzLmlzLXRhcmdldF09XCJzZWxlY3RlZEF0dGFja2VyKCkgJiYgIWhhc09wcG9uZW50R3VhcmRzKClcIiAoY2xpY2spPVwiaGFuZGxlT3Bwb25lbnRMZWFkZXIoKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBvcHBvbmVudCgpLmxlYWRlck5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgb3Bwb25lbnQoKS5sZWFkZXJIcCB9fS97eyBvcHBvbmVudCgpLmxlYWRlck1heEhwIH19PC9zdHJvbmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXJhY2stc3BhY2VyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWJhdHRsZS16b25lIGNocmlzdGlhbml0eS1iYXR0bGUtem9uZS0tb3Bwb25lbnRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NocmlzdGlhbml0eU9wcG9uZW50QmF0dGxlJylcIj5cbiAgICAgICAgICAgIEBmb3IgKHNsb3Qgb2YgYmF0dGxlU2xvdHMoJ1AyJyk7IHRyYWNrIHNsb3QudHJhY2tJZCkge1xuICAgICAgICAgICAgICBAaWYgKHNsb3QuY2FyZCkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaHJpc3RpYW5pdHktY2FyZC1wcmV2aWV3LWNhcmQgY2hyaXN0aWFuaXR5LWNhcmQtcHJldmlldy1jYXJkLS1iYXR0bGVcIlxuICAgICAgICAgICAgICAgICAgdmFsTGlnaHRSaXBwbGVcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy10YXJnZXRdPVwic2VsZWN0ZWRBdHRhY2tlcigpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPcHBvbmVudENoYXJhY3RlcihzbG90LmNhcmQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBzbG90LmNhcmQubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgc2xvdC5jYXJkLmF0dGFjayB9fSAvIHt7IHNsb3QuY2FyZC5jdXJyZW50SHAgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaHJpc3RpYW5pdHktc2xvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXNoYXJlZC16b25lXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjaHJpc3RpYW5pdHlTaGFyZWRab25lJylcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNocmlzdGlhbml0eS16b25lLXBpbGUgY2hyaXN0aWFuaXR5LXpvbmUtcGlsZS0taGlzdG9yeVwiIHZhbExpZ2h0UmlwcGxlIChjbGljayk9XCJzaG93SGlzdG9yeS5zZXQodHJ1ZSlcIj5cbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHQoJ2NocmlzdGlhbml0eUhpc3RvcnknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgZ2FtZSgpLmhpc3Rvcnlab25lLmxlbmd0aCB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXpvbmUtcGlsZSBjaHJpc3RpYW5pdHktem9uZS1waWxlLS1kZWNrXCIgdmFsTGlnaHRSaXBwbGUgYXJpYS1saXZlPVwicG9saXRlXCIgKGNsaWNrKT1cImluc3BlY3REZWNrKClcIj5cbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHQoJ2NocmlzdGlhbml0eURlY2snKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgZ2FtZSgpLnNoYXJlZERlY2subGVuZ3RoIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNocmlzdGlhbml0eS16b25lLWNhcmRcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHQoJ2NocmlzdGlhbml0eVBsYWNlJykgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ2NocmlzdGlhbml0eUVtcHR5JykgfX08L3N0cm9uZz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXBsYXllci1zaWRlXCI+XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjaHJpc3RpYW5pdHktYmF0dGxlLXpvbmVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NocmlzdGlhbml0eVlvdXJCYXR0bGUnKVwiPlxuICAgICAgICAgICAgQGZvciAoc2xvdCBvZiBiYXR0bGVTbG90cygnUDEnKTsgdHJhY2sgc2xvdC50cmFja0lkKSB7XG4gICAgICAgICAgICAgIEBpZiAoc2xvdC5jYXJkKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZCBjaHJpc3RpYW5pdHktY2FyZC1wcmV2aWV3LWNhcmQtLWJhdHRsZVwiXG4gICAgICAgICAgICAgICAgICB2YWxMaWdodFJpcHBsZVxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkQXR0YWNrZXIoKT8uaW5zdGFuY2VJZCA9PT0gc2xvdC5jYXJkLmluc3RhbmNlSWRcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWV4aGF1c3RlZF09XCIhc2xvdC5jYXJkLmNhbkF0dGFja1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXR0YWNrZXIoc2xvdC5jYXJkKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2xvdC5jYXJkLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHNsb3QuY2FyZC5hdHRhY2sgfX0gLyB7eyBzbG90LmNhcmQuY3VycmVudEhwIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNhblBsYWNlU2VsZWN0ZWRDaGFyYWN0ZXIoKSkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXNsb3QgY2hyaXN0aWFuaXR5LXNsb3QtLXBsYXktdGFyZ2V0XCIgdmFsTGlnaHRSaXBwbGUgKGNsaWNrKT1cInBsYXlTZWxlY3RlZENhcmQoJGluZGV4KVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnY2hyaXN0aWFuaXR5UGxheUhlcmUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaHJpc3RpYW5pdHktc2xvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXBsYXllci1yYWNrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hyaXN0aWFuaXR5LW9mZmVyaW5ncy16b25lXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNocmlzdGlhbml0eS1vZmZlcmluZy1waWxlXCJcbiAgICAgICAgICAgICAgICB2YWxMaWdodFJpcHBsZVxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPZmZlcmluZ1BpbGUoJ1AxJylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8aSBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdzJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57eyByZWFkeU9mZmVyaW5ncyhwbGF5ZXIoKSkgfX0ve3sgdG90YWxPZmZlcmluZ3MocGxheWVyKCkpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNocmlzdGlhbml0eS1sZWFkZXItY2FyZFwiIHZhbExpZ2h0UmlwcGxlIChjbGljayk9XCJpbnNwZWN0TGVhZGVyKCdQMScpXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHBsYXllcigpLmxlYWRlck5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgcGxheWVyKCkubGVhZGVySHAgfX0ve3sgcGxheWVyKCkubGVhZGVyTWF4SHAgfX08L3N0cm9uZz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNocmlzdGlhbml0eS1wbGF5ZXItY29tbWFuZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hyaXN0aWFuaXR5LXBsYXllci1iYWRnZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWF2YXRhclwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInBsYXllcigpLmF2YXRhckNvbG9yXCI+e3sgcGxheWVyKCkuYXZhdGFyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcGxheWVyKCkuZGlzcGxheU5hbWUgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNocmlzdGlhbml0eS1lbmQtdHVyblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVuZFR1cm4oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0KCdjaHJpc3RpYW5pdHlFbmRUdXJuJykgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjaHJpc3RpYW5pdHktaGFuZC1zaGVsZlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hyaXN0aWFuaXR5LWhhbmQtbWV0ZXJcIj5cbiAgICAgICAgICA8c3Bhbj57eyB0KCdjaHJpc3RpYW5pdHlIYW5kJykgfX08L3NwYW4+XG4gICAgICAgICAgPHN0cm9uZz57eyBwbGF5ZXIoKS5oYW5kPy5sZW5ndGggPz8gMCB9fTwvc3Ryb25nPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjaHJpc3RpYW5pdHktaGFuZC1mYW5cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NocmlzdGlhbml0eVlvdXJIYW5kJylcIiAocG9pbnRlcmxlYXZlKT1cImNsZWFySG92ZXJlZEhhbmRJbmRleCgpXCI+XG4gICAgICAgICAgQGZvciAoY2FyZElkIG9mIHBsYXllcigpLmhhbmQgPz8gW107IHRyYWNrIGNhcmRJZCArICRpbmRleCkge1xuICAgICAgICAgICAgQGxldCBjYXJkID0gY2FyZERlZmluaXRpb24oY2FyZElkKTtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWNhcmQtcHJldmlldy1jYXJkIGNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZC0taGFuZFwiXG4gICAgICAgICAgICAgIHZhbExpZ2h0UmlwcGxlXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZEhhbmRDYXJkKCkgPT09IGNhcmRJZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCIhY2FuUGxheShjYXJkKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS56LWluZGV4XT1cImhhbmRDYXJkWkluZGV4KCRpbmRleClcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cImZhblRyYW5zZm9ybSgkaW5kZXgsIHBsYXllcigpLmhhbmQ/Lmxlbmd0aCA/PyAwLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAocG9pbnRlcmVudGVyKT1cInNldEhvdmVyZWRIYW5kSW5kZXgoJGluZGV4KVwiXG4gICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJzZXRIb3ZlcmVkSGFuZEluZGV4KCRpbmRleClcIlxuICAgICAgICAgICAgICAocG9pbnRlcnVwKT1cInJlbGVhc2VIb3ZlcmVkSGFuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEhhbmRDYXJkKGNhcmRJZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgQGlmIChjYXJkLnR5cGUgPT09ICdvZmZlcmluZycpIHtcbiAgICAgICAgICAgICAgICAgIHt7IHQoJ2NocmlzdGlhbml0eU9mZmVyaW5nQ2FyZCcpIH19XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICB7eyB0KCdjaHJpc3RpYW5pdHlDb3N0JykgfX0ge3sgY2FyZC5jb3N0IH19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBjYXJkLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgQGlmIChjYXJkLnR5cGUgPT09ICdvZmZlcmluZycpIHtcbiAgICAgICAgICAgICAgICAgICt7eyBjYXJkLmxpZmUgfX1cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHt7IGNhcmQuYXR0YWNrIH19IC8ge3sgY2FyZC5saWZlIH19XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICBAaWYgKHNlbGVjdGVkUHJldmlldygpKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2hyaXN0aWFuaXR5LXByZXZpZXctYmFja2Ryb3BcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NocmlzdGlhbml0eUNsb3NlUHJldmlldycpXCIgKGNsaWNrKT1cImNsb3NlUHJldmlldygpXCI+PC9idXR0b24+XG4gICAgICAgIDxhc2lkZVxuICAgICAgICAgIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWZsb2F0aW5nLWNhcmQtc2hlbGxcIlxuICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNocmlzdGlhbml0eS1mbG9hdGluZy1jYXJkLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlUHJldmlldygpXCI+XG4gICAgICAgICAgICB7eyB0KCdjbG9zZScpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjaHJpc3RpYW5pdHktZmxvYXRpbmctY2FyZFwiXG4gICAgICAgICAgICBbc3R5bGUuLS1wcmV2aWV3LXJvdGF0ZS14XT1cInByZXZpZXdUaWx0KCkucm90YXRlWCArICdkZWcnXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXByZXZpZXctcm90YXRlLXldPVwicHJldmlld1RpbHQoKS5yb3RhdGVZICsgJ2RlZydcIlxuICAgICAgICAgICAgW3N0eWxlLi0tcHJldmlldy1zaGlmdC14XT1cInByZXZpZXdUaWx0KCkuc2hpZnRYICsgJ3B4J1wiXG4gICAgICAgICAgICBbc3R5bGUuLS1wcmV2aWV3LXNoaWZ0LXldPVwicHJldmlld1RpbHQoKS5zaGlmdFkgKyAncHgnXCJcbiAgICAgICAgICAgIChwb2ludGVybW92ZSk9XCJ0aWx0UHJldmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgIChwb2ludGVybGVhdmUpPVwicmVzZXRQcmV2aWV3VGlsdCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c21hbGw+e3sgc2VsZWN0ZWRQcmV2aWV3KCk/LmV5ZWJyb3cgfX08L3NtYWxsPlxuICAgICAgICAgICAgPHN0cm9uZz57eyBzZWxlY3RlZFByZXZpZXcoKT8udGl0bGUgfX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkUHJldmlldygpPy5tZXRhIH19PC9zcGFuPlxuICAgICAgICAgICAgPHA+e3sgc2VsZWN0ZWRQcmV2aWV3KCk/LmJvZHkgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYXNpZGU+XG4gICAgICB9XG5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWFjdGlvbnNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgPHA+e3sgc3RhdHVzVGV4dCgpIH19PC9wPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJzZWxlY3RlZEFjdGlvbkRpc2FibGVkKClcIiAoY2xpY2spPVwicGxheVNlbGVjdGVkQ2FyZCgpXCI+XG4gICAgICAgICAgICB7eyBzZWxlY3RlZEFjdGlvbkxhYmVsKCkgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRNb2NrKClcIj5cbiAgICAgICAgICAgIHt7IHQoJ2NocmlzdGlhbml0eVJlc2V0JykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIEBpZiAoc2hvd0hpc3RvcnkoKSkge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNocmlzdGlhbml0eS1oaXN0b3J5LWJhY2tkcm9wXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjaHJpc3RpYW5pdHlDbG9zZUhpc3RvcnknKVwiIChjbGljayk9XCJzaG93SGlzdG9yeS5zZXQoZmFsc2UpXCI+PC9idXR0b24+XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWhpc3RvcnktZHJhd2VyXCI+XG4gICAgICAgICAgPGhlYWRlcj5cbiAgICAgICAgICAgIDxoMj57eyB0KCdjaHJpc3RpYW5pdHlIaXN0b3J5JykgfX08L2gyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNocmlzdGlhbml0eS1kaWFsb2ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBnYW1lKCkuaGlzdG9yeVpvbmUubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNocmlzdGlhbml0eS1kaWFsb2ctY2xvc2VcIiAoY2xpY2spPVwic2hvd0hpc3Rvcnkuc2V0KGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgIHt7IHQoJ2Nsb3NlJykgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgICBAaWYgKGdhbWUoKS5oaXN0b3J5Wm9uZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaHJpc3RpYW5pdHktaGlzdG9yeS1ncmlkXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGNhcmRJZCBvZiBnYW1lKCkuaGlzdG9yeVpvbmU7IHRyYWNrIGNhcmRJZCArICRpbmRleCkge1xuICAgICAgICAgICAgICAgIEBsZXQgY2FyZCA9IGNhcmREZWZpbml0aW9uKGNhcmRJZCk7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjaHJpc3RpYW5pdHktY2FyZC1wcmV2aWV3LWNhcmRcIiB2YWxMaWdodFJpcHBsZSAoY2xpY2spPVwiaW5zcGVjdEhpc3RvcnlDYXJkKGNhcmRJZClcIj5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD57eyBjYXJkLnR5cGUgPT09ICdvZmZlcmluZycgPyB0KCdjaHJpc3RpYW5pdHlPZmZlcmluZ0NhcmQnKSA6IHQoJ2NocmlzdGlhbml0eUNoYXJhY3RlckNhcmQnKSB9fTwvc21hbGw+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYXJkLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICt7eyBjYXJkLmxpZmUgfX1cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgY2FyZC5hdHRhY2sgfX0gLyB7eyBjYXJkLmxpZmUgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHA+e3sgdCgnY2hyaXN0aWFuaXR5SGlzdG9yeUVtcHR5JykgfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICB9XG5cbiAgICAgIEBpZiAob2ZmZXJpbmdzU2VhdCgpKSB7XG4gICAgICAgIEBsZXQgb2ZmZXJpbmdQbGF5ZXIgPSBnYW1lKCkucGxheWVyc1tvZmZlcmluZ3NTZWF0KCkhXTtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjaHJpc3RpYW5pdHktaGlzdG9yeS1iYWNrZHJvcFwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY2hyaXN0aWFuaXR5Q2xvc2VPZmZlcmluZ3MnKVwiIChjbGljayk9XCJjbG9zZU9mZmVyaW5ncygpXCI+PC9idXR0b24+XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWhpc3RvcnktZHJhd2VyIGNocmlzdGlhbml0eS1vZmZlcmluZ3MtZHJhd2VyXCI+XG4gICAgICAgICAgPGhlYWRlcj5cbiAgICAgICAgICAgIDxoMj57eyB0KCdjaHJpc3RpYW5pdHlPZmZlcmluZ3MnKSB9fTwvaDI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hyaXN0aWFuaXR5LWRpYWxvZy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHJlYWR5T2ZmZXJpbmdzKG9mZmVyaW5nUGxheWVyKSB9fS97eyB0b3RhbE9mZmVyaW5ncyhvZmZlcmluZ1BsYXllcikgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2hyaXN0aWFuaXR5LWRpYWxvZy1jbG9zZVwiIChjbGljayk9XCJjbG9zZU9mZmVyaW5ncygpXCI+XG4gICAgICAgICAgICAgICAge3sgdCgnY2xvc2UnKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvaGVhZGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaHJpc3RpYW5pdHktb2ZmZXJpbmctbGlzdFwiPlxuICAgICAgICAgICAgQGZvciAob2ZmZXJpbmcgb2Ygb2ZmZXJpbmdQbGF5ZXIub2ZmZXJpbmdzOyB0cmFjayBvZmZlcmluZy5pbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICAgIDxhcnRpY2xlIGNsYXNzPVwiY2hyaXN0aWFuaXR5LW9mZmVyaW5nLXJvd1wiIFtjbGFzcy5pcy1leGhhdXN0ZWRdPVwiIW9mZmVyaW5nLnJlYWR5XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZFwiIHZhbExpZ2h0UmlwcGxlIChjbGljayk9XCJpbnNwZWN0T2ZmZXJpbmcob2ZmZXJpbmcpXCI+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+e3sgdCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdDYXJkJykgfX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgb2ZmZXJpbmcubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+K3t7IG9mZmVyaW5nLnZhbHVlIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICBAaWYgKG9mZmVyaW5nLmFiaWxpdHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwPnt7IG9mZmVyaW5nLmFiaWxpdHlOYW1lIH19PC9wPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IG9mZmVyaW5nLnJlYWR5ID8gdCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdSZWFkeScpIDogdCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdFeGhhdXN0ZWQnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHA+e3sgb2ZmZXJpbmcuYWJpbGl0eVRleHQgfHwgdCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdOb0FiaWxpdHknKSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIEBpZiAob2ZmZXJpbmcuYWJpbGl0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuVXNlT2ZmZXJpbmdBYmlsaXR5KG9mZmVyaW5nLCBvZmZlcmluZ3NTZWF0KCkhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZU9mZmVyaW5nQWJpbGl0eShvZmZlcmluZywgb2ZmZXJpbmdzU2VhdCgpISlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgdCgnY2hyaXN0aWFuaXR5VXNlQWJpbGl0eScpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2FydGljbGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cbiAgICA8L21haW4+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGNvbG9yOiB2YXIoLS12YWwtdGV4dC1jb2xvciwgIzFmMjkzMyk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktc2hlbGwge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBnYXA6IDAuNjVyZW07XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW0gMC4yNXJlbTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgzNiwgNDgsIDY4LCAwLjEyKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y2ZjhmYjtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGVhZGVyLFxuICAgICAgLmNocmlzdGlhbml0eS1tYXRjaC1zdHJpcCxcbiAgICAgIC5jaHJpc3RpYW5pdHktcGxheWVyX19zdW1tYXJ5LFxuICAgICAgLmNocmlzdGlhbml0eS1zaGFyZWQtem9uZSxcbiAgICAgIC5jaHJpc3RpYW5pdHktYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiAwLjc1cmVtO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhlYWRlciBoMSxcbiAgICAgIC5jaHJpc3RpYW5pdHktaGVhZGVyIHAsXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllciBzdHJvbmcsXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllciBzbWFsbCxcbiAgICAgIC5jaHJpc3RpYW5pdHktc2NvcmVib2FyZCBzcGFuLFxuICAgICAgLmNocmlzdGlhbml0eS1oaXN0b3J5IGgyLFxuICAgICAgLmNocmlzdGlhbml0eS1hY3Rpb25zIHAge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGVhZGVyIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjM1cmVtO1xuICAgICAgICBsaW5lLWhlaWdodDogMS4xO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhlYWRlciBwLFxuICAgICAgLmNocmlzdGlhbml0eS10dXJuIHNwYW4sXG4gICAgICAuY2hyaXN0aWFuaXR5LW9mZmVyaW5ncyBzcGFuLFxuICAgICAgLmNocmlzdGlhbml0eS1oaWRkZW4taGFuZCBzcGFuLFxuICAgICAgLmNocmlzdGlhbml0eS1kZWNrIHNwYW4sXG4gICAgICAuY2hyaXN0aWFuaXR5LXBsYWNlIHNwYW4sXG4gICAgICAuY2hyaXN0aWFuaXR5LXBpbGUgc3BhbixcbiAgICAgIC5jaHJpc3RpYW5pdHktbGVhZGVyIHNwYW4ge1xuICAgICAgICBjb2xvcjogcmdiYSgzMSwgNDEsIDUxLCAwLjY0KTtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXR1cm4sXG4gICAgICAuY2hyaXN0aWFuaXR5LWxlYWRlcixcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmdzLFxuICAgICAgLmNocmlzdGlhbml0eS1oaWRkZW4taGFuZCxcbiAgICAgIC5jaHJpc3RpYW5pdHktcGlsZSxcbiAgICAgIC5jaHJpc3RpYW5pdHktZGVjayxcbiAgICAgIC5jaHJpc3RpYW5pdHktcGxhY2Uge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBnYXA6IDAuMTVyZW07XG4gICAgICAgIG1pbi13aWR0aDogNS4yNXJlbTtcbiAgICAgICAgcGFkZGluZzogMC41NXJlbSAwLjY1cmVtO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMTIpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktdHVybi5pcy1vd24tdHVybiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOCwgMTI4LCAxMDgsIDAuMzUpO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZWNmZGY1O1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXN0cmlwIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIG1pbm1heCgwLCAxZnIpO1xuICAgICAgICBwYWRkaW5nOiAwLjQ1cmVtO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktbWF0Y2gtcGxheWVyIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heCgwLCAxZnIpO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllci0tb3Bwb25lbnQge1xuICAgICAgICBkaXJlY3Rpb246IHJ0bDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1tYXRjaC1wbGF5ZXItLW9wcG9uZW50IGRpdiB7XG4gICAgICAgIGRpcmVjdGlvbjogbHRyO1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1tYXRjaC1wbGF5ZXIgZGl2IHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllciBzdHJvbmcsXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllciBzbWFsbCB7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllciBzbWFsbCxcbiAgICAgIC5jaHJpc3RpYW5pdHktc2NvcmVib2FyZCBzcGFuIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMzEsIDQxLCA1MSwgMC41OCk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43MnJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1zY29yZWJvYXJkIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICAgICAgICBtaW4td2lkdGg6IDQuMnJlbTtcbiAgICAgICAgcGFkZGluZzogMCAwLjU1cmVtO1xuICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMSk7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgzNiwgNDgsIDY4LCAwLjEpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXNjb3JlYm9hcmQgc3Ryb25nIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjJyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXRhYmxlIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ2FwOiAwLjQ1cmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjQ1cmVtIDAuMzVyZW07XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNkY2VhZmI7XG4gICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXBsYXllci1zaWRlIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ2FwOiAwLjM1cmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjM1cmVtIDAuM3JlbTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMC43cmVtO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpO1xuICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbm1heCg3cmVtLCAxZnIpIGF1dG87XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEzLjc1cmVtO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXBsYXllci1zaWRlLS1vcHBvbmVudCB7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBtaW5tYXgoN3JlbSwgMWZyKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1wbGF5ZXIge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBnYXA6IDAuNjVyZW07XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktYmF0dGxlLXpvbmUge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg1LCBtaW5tYXgoNC4ycmVtLCAxZnIpKTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIG1pbi1oZWlnaHQ6IGNsYW1wKDYuOXJlbSwgMjN2dywgOC45cmVtKTtcbiAgICAgICAgcGFkZGluZzogMC41NXJlbSAwLjRyZW07XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Nik7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktc2hhcmVkLXpvbmUge1xuICAgICAgICBwYWRkaW5nOiAwLjU1cmVtIDAuNHJlbTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQsXG4gICAgICAuY2hyaXN0aWFuaXR5LWVuZC10dXJuLFxuICAgICAgLmNocmlzdGlhbml0eS1hY3Rpb25zIGJ1dHRvbixcbiAgICAgIC5jaHJpc3RpYW5pdHktcGlsZSxcbiAgICAgIC5jaHJpc3RpYW5pdHktbGVhZGVyLS10YXJnZXQge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMTYpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgICAgICBmb250OiBpbmhlcml0O1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBtaW4taGVpZ2h0OiA1LjhyZW07XG4gICAgICAgIHBhZGRpbmc6IDAuNXJlbTtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwLjVyZW0gMS4yNXJlbSByZ2JhKDM2LCA0OCwgNjgsIDAuMDgpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQgc3BhbiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktY2FyZCBzdHJvbmcge1xuICAgICAgICBqdXN0aWZ5LXNlbGY6IGVuZDtcbiAgICAgICAgcGFkZGluZzogMC4xNXJlbSAwLjM1cmVtO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2VkZjJmNztcbiAgICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktY2FyZC5pcy1zZWxlY3RlZCB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMC4ycmVtIHJnYmEoMzcsIDk5LCAyMzUsIDAuMTYpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQuaXMtZGlzYWJsZWQsXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQuaXMtZXhoYXVzdGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41NTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLmlzLXRhcmdldCB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2RjMjYyNjtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1jYXJkcyB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICAgIGdyaWQtYXV0by1jb2x1bW5zOiAwLjdyZW07XG4gICAgICAgIGdhcDogMC4xNnJlbTtcbiAgICAgICAgYWxpZ24taXRlbXM6IGVuZDtcbiAgICAgICAgbWluLWhlaWdodDogMS4wNXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1jYXJkcyBpIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAwLjY1cmVtO1xuICAgICAgICBoZWlnaHQ6IDAuOTVyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTYsIDQyLCA2NywgMC4yMik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuMThyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZHMgaS5pcy11c2VkIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2NiZDVlMTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktc2xvdCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIG1pbi1oZWlnaHQ6IGNsYW1wKDYuMXJlbSwgMjB2dywgNy42cmVtKTtcbiAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkIHJnYmEoMzYsIDQ4LCA2OCwgMC4yMik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktc2xvdC0tcGxheS10YXJnZXQge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgzNywgOTksIDIzNSwgMC41NSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjE5LCAyMzQsIDI1NCwgMC43OCk7XG4gICAgICAgIGNvbG9yOiAjMWQ0ZWQ4O1xuICAgICAgICBmb250LXdlaWdodDogODAwO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIGluc2V0IDAgMCAwIDAuMTJyZW0gcmdiYSg5NiwgMTY1LCAyNTAsIDAuMiksXG4gICAgICAgICAgMCAwLjdyZW0gMS4yNXJlbSByZ2JhKDM3LCA5OSwgMjM1LCAwLjE2KTtcbiAgICAgICAgYW5pbWF0aW9uOiBjaHJpc3RpYW5pdHktdGFyZ2V0LXB1bHNlIDE0NTBtcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1zbG90LS1wbGF5LXRhcmdldCBzcGFuIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB6LWluZGV4OiAyO1xuICAgICAgICBwYWRkaW5nOiAwLjE2cmVtIDAuNDRyZW07XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpO1xuICAgICAgICBmb250LXNpemU6IDAuNzhyZW07XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgY2hyaXN0aWFuaXR5LXRhcmdldC1wdWxzZSB7XG4gICAgICAgIDAlLFxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgaW5zZXQgMCAwIDAgMC4xMnJlbSByZ2JhKDk2LCAxNjUsIDI1MCwgMC4yKSxcbiAgICAgICAgICAgIDAgMC43cmVtIDEuMjVyZW0gcmdiYSgzNywgOTksIDIzNSwgMC4xNik7XG4gICAgICAgIH1cblxuICAgICAgICA1MCUge1xuICAgICAgICAgIGJveC1zaGFkb3c6XG4gICAgICAgICAgICBpbnNldCAwIDAgMCAwLjE2cmVtIHJnYmEoOTYsIDE2NSwgMjUwLCAwLjM0KSxcbiAgICAgICAgICAgIDAgMC45cmVtIDEuNjVyZW0gcmdiYSgzNywgOTksIDIzNSwgMC4yNCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oYW5kIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC1hdXRvLWNvbHVtbnM6IG1pbm1heCg2cmVtLCA4cmVtKTtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjU1cmVtO1xuICAgICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1hY3Rpb25zIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW07XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktYWN0aW9ucyBkaXYge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWFjdGlvbnMgYnV0dG9uLFxuICAgICAgLmNocmlzdGlhbml0eS1lbmQtdHVybiB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIuNHJlbTtcbiAgICAgICAgcGFkZGluZzogMCAwLjc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWFjdGlvbnMgYnV0dG9uOm5vdCg6ZGlzYWJsZWQpLFxuICAgICAgLmNocmlzdGlhbml0eS1lbmQtdHVybiB7XG4gICAgICAgIGJhY2tncm91bmQ6ICMxMDJhNDM7XG4gICAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhpc3Rvcnkge1xuICAgICAgICBwYWRkaW5nOiAwLjc1cmVtO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhhbmQtZmFuIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWluLWhlaWdodDogMTAuOHJlbTtcbiAgICAgICAgcGFkZGluZzogMC4yNXJlbSAwLjI1cmVtIDIuMXJlbTtcbiAgICAgICAgaXNvbGF0aW9uOiBpc29sYXRlO1xuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oYW5kLXNoZWxmIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICB6LWluZGV4OiAxMjtcbiAgICAgICAgbWluLWhlaWdodDogMTJyZW07XG4gICAgICAgIG1hcmdpbi10b3A6IC0xLjE1cmVtO1xuICAgICAgICBwYWRkaW5nOiAxLjQ1cmVtIDAuMjVyZW0gMXJlbTtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGFuZC1zaGVsZi0tb3Bwb25lbnQge1xuICAgICAgICB6LWluZGV4OiA4O1xuICAgICAgICBtaW4taGVpZ2h0OiA2Ljg1cmVtO1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICBwYWRkaW5nOiAwLjQ1cmVtIDAuMjVyZW0gMC44NXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oYW5kLWZhbi0tb3Bwb25lbnQge1xuICAgICAgICBtaW4taGVpZ2h0OiA1LjlyZW07XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjc1cmVtO1xuICAgICAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktY2FyZC1wcmV2aWV3LWNhcmQsXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQtbWluaSxcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZSxcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZCxcbiAgICAgIC5jaHJpc3RpYW5pdHktbGVhZGVyLWNhcmQsXG4gICAgICAuY2hyaXN0aWFuaXR5LXpvbmUtY2FyZCxcbiAgICAgIC5jaHJpc3RpYW5pdHktem9uZS1waWxlLFxuICAgICAgLmNocmlzdGlhbml0eS1lbmQtdHVybiB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzYsIDQ4LCA2OCwgMC4xNik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktY2FyZC1wcmV2aWV3LWNhcmQge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICB3aWR0aDogY2xhbXAoNC45cmVtLCAxN3Z3LCA3LjFyZW0pO1xuICAgICAgICBtaW4taGVpZ2h0OiBjbGFtcCg2LjZyZW0sIDIydncsIDguOHJlbSk7XG4gICAgICAgIG1hcmdpbi1pbmxpbmU6IC0wLjQycmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjQ4cmVtO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTE1JTtcbiAgICAgICAgdHJhbnNpdGlvbjpcbiAgICAgICAgICB0cmFuc2Zvcm0gMTYwbXMgZWFzZSxcbiAgICAgICAgICBib3gtc2hhZG93IDE2MG1zIGVhc2UsXG4gICAgICAgICAgYm9yZGVyLWNvbG9yIDE2MG1zIGVhc2U7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMC41cmVtIDEuMjVyZW0gcmdiYSgzNiwgNDgsIDY4LCAwLjEpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQtcHJldmlldy1jYXJkLS1oYW5kOmhvdmVyLFxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZC0taGFuZC5pcy1zZWxlY3RlZCB7XG4gICAgICAgIHotaW5kZXg6IDM7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxcmVtIDJyZW0gcmdiYSgzNywgOTksIDIzNSwgMC4xOCk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZS5pcy1wbGF5LXRhcmdldCB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgzNywgOTksIDIzNSwgMC41OCk7XG4gICAgICAgIGJhY2tncm91bmQ6XG4gICAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMzksIDI0NiwgMjU1LCAwLjk2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KSksXG4gICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MiUgMTQlLCByZ2JhKDI1MCwgMjA0LCAyMSwgMC4yOCkgMCAwLjdyZW0sIHRyYW5zcGFyZW50IDAuNzJyZW0pO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIGluc2V0IDAgMCAwIDAuMTJyZW0gcmdiYSg5NiwgMTY1LCAyNTAsIDAuMjQpLFxuICAgICAgICAgIDAgMC44cmVtIDEuNTVyZW0gcmdiYSgzNywgOTksIDIzNSwgMC4yKTtcbiAgICAgICAgYW5pbWF0aW9uOiBjaHJpc3RpYW5pdHktdGFyZ2V0LXB1bHNlIDE0NTBtcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZC0tYmFjayB7XG4gICAgICAgIHdpZHRoOiBjbGFtcCg0cmVtLCAxNHZ3LCA1LjdyZW0pO1xuICAgICAgICBtaW4taGVpZ2h0OiBjbGFtcCg1cmVtLCAxNnZ3LCA2LjZyZW0pO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAuOHJlbSAxLjU1cmVtIHJnYmEoMzYsIDQ4LCA2OCwgMC4xNCk7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAtMTglO1xuICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTYsIDQyLCA2NywgMC4xMiksIHJnYmEoMTYsIDQyLCA2NywgMC4wMikpLFxuICAgICAgICAgIHJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoNDVkZWcsICNlMmU4ZjAgMCAwLjM1cmVtLCAjZjhmYWZjIDAuMzVyZW0gMC43cmVtKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZC0tYmF0dGxlIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1pbi1oZWlnaHQ6IGNsYW1wKDYuMXJlbSwgMjB2dywgNy42cmVtKTtcbiAgICAgICAgbWFyZ2luLWlubGluZTogMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZCBzcGFuLFxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLW1pbmkgc3BhbixcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZSBzcGFuLFxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1jYXJkIHNwYW4sXG4gICAgICAuY2hyaXN0aWFuaXR5LWxlYWRlci1jYXJkIHNwYW4sXG4gICAgICAuY2hyaXN0aWFuaXR5LXpvbmUtY2FyZCBzcGFuLFxuICAgICAgLmNocmlzdGlhbml0eS16b25lLXBpbGUgc3BhbiB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgei1pbmRleDogMjtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1jYXJkLXByZXZpZXctY2FyZCBzdHJvbmcsXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQtbWluaSBzdHJvbmcsXG4gICAgICAuY2hyaXN0aWFuaXR5LW9mZmVyaW5nLXBpbGUgc3Ryb25nLFxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1jYXJkIHN0cm9uZyxcbiAgICAgIC5jaHJpc3RpYW5pdHktbGVhZGVyLWNhcmQgc3Ryb25nLFxuICAgICAgLmNocmlzdGlhbml0eS16b25lLWNhcmQgc3Ryb25nLFxuICAgICAgLmNocmlzdGlhbml0eS16b25lLXBpbGUgc3Ryb25nIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB6LWluZGV4OiAzO1xuICAgICAgICBqdXN0aWZ5LXNlbGY6IGVuZDtcbiAgICAgICAgcGFkZGluZzogMC4xNXJlbSAwLjM1cmVtO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2VkZjJmNztcbiAgICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktcGxheWVyLXJhY2sge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg1LjlyZW0sIDdyZW0pIG1pbm1heCg1cmVtLCAxZnIpIG1pbm1heCg0LjJyZW0sIDdyZW0pO1xuICAgICAgICBnYXA6IDAuNDVyZW07XG4gICAgICAgIGFsaWduLWl0ZW1zOiBlbmQ7XG4gICAgICAgIGp1c3RpZnktaXRlbXM6IHN0cmV0Y2g7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktcGxheWVyLXJhY2stLW9wcG9uZW50IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhhbmQtbWV0ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcmlnaHQ6IDAuMzVyZW07XG4gICAgICAgIHotaW5kZXg6IDQ7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBnYXA6IDAuMjVyZW07XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEuN3JlbTtcbiAgICAgICAgcGFkZGluZzogMC4xOHJlbSAwLjQ2cmVtO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMTIpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAuMzVyZW0gMC44cmVtIHJnYmEoMTYsIDQyLCA2NywgMC4wOCk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGFuZC1tZXRlci0tb3Bwb25lbnQge1xuICAgICAgICB0b3A6IDAuMTVyZW07XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGFuZC1tZXRlciBzcGFuIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMzEsIDQxLCA1MSwgMC41OCk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC42OHJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oYW5kLW1ldGVyIHN0cm9uZyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1wbGF5ZXItYmFkZ2UsXG4gICAgICAuY2hyaXN0aWFuaXR5LXBsYXllci1jb21tYW5kIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ2FwOiAwLjM1cmVtO1xuICAgICAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1wbGF5ZXItYmFkZ2Uge1xuICAgICAgICBhbGlnbi1jb250ZW50OiBzdGFydDtcbiAgICAgICAgY29sb3I6IHJnYmEoMzEsIDQxLCA1MSwgMC43Nik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NHJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1wbGF5ZXItYmFkZ2UtLW9wcG9uZW50IHtcbiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXBsYXllci1iYWRnZSBzdHJvbmcge1xuICAgICAgICBtYXgtd2lkdGg6IDYuNXJlbTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktYXZhdGFyIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDEuODVyZW07XG4gICAgICAgIGhlaWdodDogMS44NXJlbTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgICBmb250LXNpemU6IDAuNzZyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMC4zNXJlbSAwLjlyZW0gcmdiYSgxNiwgNDIsIDY3LCAwLjE2KTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZ3Mtem9uZSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgICAgZ2FwOiAwLjI1cmVtO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGp1c3RpZnktc2VsZjogc3RhcnQ7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQtbWluaSxcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZSxcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZCxcbiAgICAgIC5jaHJpc3RpYW5pdHktbGVhZGVyLWNhcmQsXG4gICAgICAuY2hyaXN0aWFuaXR5LXpvbmUtY2FyZCxcbiAgICAgIC5jaHJpc3RpYW5pdHktem9uZS1waWxlIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgbWluLWhlaWdodDogNC45cmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjQ4cmVtO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWNhcmQtbWluaSB7XG4gICAgICAgIHdpZHRoOiAzLjVyZW07XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgaXNvbGF0aW9uOiBpc29sYXRlO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBqdXN0aWZ5LXNlbGY6IHN0YXJ0O1xuICAgICAgICB3aWR0aDogbWluKDEwMCUsIDUuOXJlbSk7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDcuMXJlbTtcbiAgICAgICAgcGFkZGluZzogMC45NXJlbSAwLjUycmVtIDAuNnJlbTtcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjZmZmZmZmLCAjZjhmYWZjKSxcbiAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1MCwgMjA0LCAyMSwgMC4xOCksIHRyYW5zcGFyZW50IDQyJSk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZSBpIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogYXV0byBhdXRvIDEuMDVyZW0gMC43MnJlbTtcbiAgICAgICAgei1pbmRleDogLTE7XG4gICAgICAgIHdpZHRoOiAyLjU1cmVtO1xuICAgICAgICBoZWlnaHQ6IDMuNTVyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTYsIDQyLCA2NywgMC4xOCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuMzVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6XG4gICAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKSwgcmdiYSgyNDEsIDI0NSwgMjQ5LCAwLjkyKSksXG4gICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA3OCUgMTglLCAjZmFjYzE1IDAgMC4zOHJlbSwgdHJhbnNwYXJlbnQgMC40cmVtKTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwLjM1cmVtIDAuODVyZW0gcmdiYSgxNiwgNDIsIDY3LCAwLjEpO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcGlsZSBpOm50aC1jaGlsZCgyKSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAuMjhyZW0sIDAuMDhyZW0pIHJvdGF0ZSgzZGVnKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1waWxlIGk6bnRoLWNoaWxkKDMpIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMC41NXJlbSwgMC4xOHJlbSkgcm90YXRlKC0xZGVnKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1sZWFkZXItY2FyZCB7XG4gICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiBjbGFtcCg0Ljc1cmVtLCAxN3Z3LCA2cmVtKTtcbiAgICAgICAgbWluLWhlaWdodDogY2xhbXAoNi42cmVtLCAyMnZ3LCA4LjRyZW0pO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXJhY2stc3BhY2VyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDFweDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1iYXR0bGUtem9uZSB7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIG1pbm1heCg0cmVtLCAxZnIpKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1zaGFyZWQtem9uZSB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCg0LjNyZW0sIDFmcikpO1xuICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS16b25lLWNhcmQsXG4gICAgICAuY2hyaXN0aWFuaXR5LXpvbmUtcGlsZSB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDYuNDVyZW07XG4gICAgICAgIHBhZGRpbmc6IDAuN3JlbSAwLjUycmVtIDAuNTVyZW07XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktem9uZS1waWxlIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBpc29sYXRpb246IGlzb2xhdGU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDk5OXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktem9uZS1waWxlIGkge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGluc2V0OiBhdXRvIDAuNzJyZW0gMS4wMnJlbSBhdXRvO1xuICAgICAgICB6LWluZGV4OiAtMTtcbiAgICAgICAgd2lkdGg6IDIuN3JlbTtcbiAgICAgICAgaGVpZ2h0OiAzLjdyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTYsIDQyLCA2NywgMC4xOCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuMzVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMC4zNXJlbSAwLjg1cmVtIHJnYmEoMTYsIDQyLCA2NywgMC4xMSk7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDRkZWcpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXpvbmUtcGlsZSBpOm50aC1jaGlsZCgyKSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0wLjI4cmVtLCAwLjEycmVtKSByb3RhdGUoLTNkZWcpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXpvbmUtcGlsZSBpOm50aC1jaGlsZCgzKSB7XG4gICAgICAgIGJhY2tncm91bmQ6XG4gICAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxNiwgNDIsIDY3LCAwLjE2KSwgcmdiYSgxNiwgNDIsIDY3LCAwLjAzKSksXG4gICAgICAgICAgcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCg0NWRlZywgI2RiZWFmZSAwIDAuMzNyZW0sICNmZmZmZmYgMC4zM3JlbSAwLjY2cmVtKTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTAuNTRyZW0sIDAuMjRyZW0pIHJvdGF0ZSgyZGVnKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1mbG9hdGluZy1jYXJkLXNoZWxsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB6LWluZGV4OiA2MTtcbiAgICAgICAgd2lkdGg6IG1pbigyM3JlbSwgY2FsYygxMDB2dyAtIDEuMjVyZW0pKTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktZmxvYXRpbmctY2FyZCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdhcDogMC40NXJlbTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1pbi1oZWlnaHQ6IG1pbigzMXJlbSwgY2FsYygxMDB2aCAtIDMuNXJlbSkpO1xuICAgICAgICBwYWRkaW5nOiAxLjE1cmVtO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMTgpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xuICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NiksIHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45NikpLFxuICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjAlIDAlLCByZ2JhKDM3LCA5OSwgMjM1LCAwLjEyKSwgdHJhbnNwYXJlbnQgNDUlKTtcbiAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAwIDAgMCAwLjE4cmVtIHJnYmEoMTkxLCAyMTksIDI1NCwgMC40MiksXG4gICAgICAgICAgMCAwIDIuMnJlbSByZ2JhKDk2LCAxNjUsIDI1MCwgMC4zNCksXG4gICAgICAgICAgMCAyLjRyZW0gNXJlbSByZ2JhKDE2LCA0MiwgNjcsIDAuMzQpLFxuICAgICAgICAgIGluc2V0IDAgMCAwIDAuMzVyZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KTtcbiAgICAgICAgdG91Y2gtYWN0aW9uOiBub25lO1xuICAgICAgICB0cmFuc2Zvcm06XG4gICAgICAgICAgdHJhbnNsYXRlKHZhcigtLXByZXZpZXctc2hpZnQteCwgMHB4KSwgdmFyKC0tcHJldmlldy1zaGlmdC15LCAwcHgpKVxuICAgICAgICAgIHBlcnNwZWN0aXZlKDQ4cmVtKVxuICAgICAgICAgIHJvdGF0ZVgodmFyKC0tcHJldmlldy1yb3RhdGUteCwgNWRlZykpXG4gICAgICAgICAgcm90YXRlWSh2YXIoLS1wcmV2aWV3LXJvdGF0ZS15LCAtNWRlZykpO1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gOTBtcyBlYXNlLW91dDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1mbG9hdGluZy1jYXJkLWNsb3NlIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IC0yLjZyZW07XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB6LWluZGV4OiA2MjtcbiAgICAgICAgbWluLWhlaWdodDogMnJlbTtcbiAgICAgICAgcGFkZGluZzogMCAwLjZyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzYsIDQ4LCA2OCwgMC4xNCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XG4gICAgICAgIGNvbG9yOiByZ2JhKDMxLCA0MSwgNTEsIDAuNzgpO1xuICAgICAgICBmb250OiBpbmhlcml0O1xuICAgICAgICBmb250LXNpemU6IDAuNzZyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMC40NXJlbSAxcmVtIHJnYmEoMTYsIDQyLCA2NywgMC4xKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1wcmV2aWV3LWJhY2tkcm9wLFxuICAgICAgLmNocmlzdGlhbml0eS1oaXN0b3J5LWJhY2tkcm9wIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuNDYpO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LXByZXZpZXctYmFja2Ryb3Age1xuICAgICAgICB6LWluZGV4OiA2MDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1mbG9hdGluZy1jYXJkIHNtYWxsLFxuICAgICAgLmNocmlzdGlhbml0eS1mbG9hdGluZy1jYXJkIHNwYW4ge1xuICAgICAgICBjb2xvcjogcmdiYSgzMSwgNDEsIDUxLCAwLjY0KTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1mbG9hdGluZy1jYXJkIHN0cm9uZyB7XG4gICAgICAgIGZvbnQtc2l6ZTogY2xhbXAoMS41NXJlbSwgOHZ3LCAyLjM1cmVtKTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMDU7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktZmxvYXRpbmctY2FyZCBwIHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBhbGlnbi1zZWxmOiBlbmQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMzU7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGlzdG9yeS1iYWNrZHJvcCB7XG4gICAgICAgIHotaW5kZXg6IDQwO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhpc3RvcnktZHJhd2VyIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICByaWdodDogYXV0bztcbiAgICAgICAgYm90dG9tOiBtYXgoMC41cmVtLCBlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSkpO1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHotaW5kZXg6IDQxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gbWlubWF4KDAsIDFmcik7XG4gICAgICAgIGdhcDogMC43NXJlbTtcbiAgICAgICAgd2lkdGg6IG1pbihjYWxjKDEwMHZ3IC0gMXJlbSksIDQ0cmVtKTtcbiAgICAgICAgbWluLWhlaWdodDogbWluKDE4cmVtLCBjYWxjKDEwMGR2aCAtIDFyZW0pKTtcbiAgICAgICAgbWF4LWhlaWdodDogbWluKDMycmVtLCBjYWxjKDEwMGR2aCAtIDJyZW0pKTtcbiAgICAgICAgcGFkZGluZzogMC44cmVtO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM2LCA0OCwgNjgsIDAuMTYpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjc1cmVtO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpO1xuICAgICAgICBib3gtc2hhZG93OiAwIDEuNXJlbSA0cmVtIHJnYmEoMTYsIDQyLCA2NywgMC4yOCk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oaXN0b3J5LWRyYXdlciBoZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIGdhcDogMC43NXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oaXN0b3J5LWRyYXdlciBoMixcbiAgICAgIC5jaHJpc3RpYW5pdHktaGlzdG9yeS1kcmF3ZXIgcCB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oaXN0b3J5LWRyYXdlciBoZWFkZXIgc3BhbiB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIG1pbi13aWR0aDogMS44NXJlbTtcbiAgICAgICAgaGVpZ2h0OiAxLjg1cmVtO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2VkZjJmNztcbiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1kaWFsb2ctYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMC40NXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1kaWFsb2ctY2xvc2Uge1xuICAgICAgICBtaW4taGVpZ2h0OiAxLjg1cmVtO1xuICAgICAgICBwYWRkaW5nOiAwIDAuNjJyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzYsIDQ4LCA2OCwgMC4xNCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgICBjb2xvcjogcmdiYSgzMSwgNDEsIDUxLCAwLjc4KTtcbiAgICAgICAgZm9udDogaW5oZXJpdDtcbiAgICAgICAgZm9udC1zaXplOiAwLjc2cmVtO1xuICAgICAgICBmb250LXdlaWdodDogODAwO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAuMzVyZW0gMC44cmVtIHJnYmEoMTYsIDQyLCA2NywgMC4wOCk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGlzdG9yeS1ncmlkIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoNS40cmVtLCAxZnIpKTtcbiAgICAgICAgZ2FwOiAwLjU1cmVtO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgIHNjcm9sbGJhci1jb2xvcjogcmdiYSgzNiwgNDgsIDY4LCAwLjMyKSByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuNzIpO1xuICAgICAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7XG4gICAgICAgIHBhZGRpbmc6IDAuMXJlbSAwLjFyZW0gMC4yNXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1oaXN0b3J5LWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLFxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1saXN0Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICAgIHdpZHRoOiAwLjY1cmVtO1xuICAgICAgfVxuXG4gICAgICAuY2hyaXN0aWFuaXR5LWhpc3RvcnktZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2ssXG4gICAgICAuY2hyaXN0aWFuaXR5LW9mZmVyaW5nLWxpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjI2LCAyMzIsIDI0MCwgMC43Mik7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktaGlzdG9yeS1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYixcbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgICBib3JkZXI6IDAuMTRyZW0gc29saWQgcmdiYSgyMjYsIDIzMiwgMjQwLCAwLjcyKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzYsIDQ4LCA2OCwgMC4zMik7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmdzLWRyYXdlciB7XG4gICAgICAgIHdpZHRoOiBtaW4oY2FsYygxMDB2dyAtIDFyZW0pLCA0OHJlbSk7XG4gICAgICAgIG1pbi1oZWlnaHQ6IG1pbigyMHJlbSwgY2FsYygxMDBkdmggLSAxcmVtKSk7XG4gICAgICAgIG1heC1oZWlnaHQ6IG1pbigzNHJlbSwgY2FsYygxMDBkdmggLSAycmVtKSk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctbGlzdCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdhcDogMC42cmVtO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgIHNjcm9sbGJhci1jb2xvcjogcmdiYSgzNiwgNDgsIDY4LCAwLjMyKSByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuNzIpO1xuICAgICAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7XG4gICAgICAgIHBhZGRpbmc6IDAuMXJlbTtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1yb3cge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg0LjlyZW0sIDYuMnJlbSkgbWlubWF4KDAsIDFmcik7XG4gICAgICAgIGdhcDogMC42NXJlbTtcbiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgICAgIHBhZGRpbmc6IDAuNDVyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMzYsIDQ4LCA2OCwgMC4xMik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNjVyZW07XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcm93LmlzLWV4aGF1c3RlZCB7XG4gICAgICAgIG9wYWNpdHk6IDAuNjg7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZCB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDcuNHJlbTtcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpLCByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTYpKSxcbiAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDgyJSAxNCUsICNmYWNjMTUgMCAwLjQ4cmVtLCB0cmFuc3BhcmVudCAwLjVyZW0pO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAuNDVyZW0gMXJlbSByZ2JhKDE2LCA0MiwgNjcsIDAuMSk7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZCBzbWFsbCB7XG4gICAgICAgIGNvbG9yOiByZ2JhKDMxLCA0MSwgNTEsIDAuNTgpO1xuICAgICAgICBmb250LXNpemU6IDAuNjZyZW07XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctY2FyZCBwLFxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1yb3cgcCB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1jYXJkIHAge1xuICAgICAgICBhbGlnbi1zZWxmOiBlbmQ7XG4gICAgICAgIGNvbG9yOiByZ2JhKDMxLCA0MSwgNTEsIDAuNjQpO1xuICAgICAgICBmb250LXNpemU6IDAuNzJyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcm93ID4gZGl2IHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ2FwOiAwLjM1cmVtO1xuICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cblxuICAgICAgLmNocmlzdGlhbml0eS1vZmZlcmluZy1yb3cgPiBkaXYgcCB7XG4gICAgICAgIGNvbG9yOiByZ2JhKDMxLCA0MSwgNTEsIDAuNzIpO1xuICAgICAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjM7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcm93ID4gZGl2IGJ1dHRvbiB7XG4gICAgICAgIGp1c3RpZnktc2VsZjogc3RhcnQ7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIuMnJlbTtcbiAgICAgICAgcGFkZGluZzogMCAwLjdyZW07XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTYsIDQyLCA2NywgMC4xNik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgICAgICAgYmFja2dyb3VuZDogIzEwMmE0MztcbiAgICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7XG4gICAgICB9XG5cbiAgICAgIC5jaHJpc3RpYW5pdHktb2ZmZXJpbmctcm93ID4gZGl2IGJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlMmU4ZjA7XG4gICAgICAgIGNvbG9yOiByZ2JhKDMxLCA0MSwgNTEsIDAuNTgpO1xuICAgICAgfVxuXG4gICAgICBidXR0b24ge1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgICAgIG9wYWNpdHk6IDAuNTU7XG4gICAgICB9XG5cbiAgICAgIGJ1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgICAgICAgb3V0bGluZTogMC4xODc1cmVtIHNvbGlkIHJnYmEoMzcsIDk5LCAyMzUsIDAuMjQpO1xuICAgICAgICBvdXRsaW5lLW9mZnNldDogMC4xMjVyZW07XG4gICAgICB9XG5cbiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkge1xuICAgICAgICAuY2hyaXN0aWFuaXR5LXNoZWxsIHtcbiAgICAgICAgICBwYWRkaW5nOiAwLjU1cmVtIDA7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAwO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LWhlYWRlcixcbiAgICAgICAgLmNocmlzdGlhbml0eS1wbGF5ZXJfX3N1bW1hcnksXG4gICAgICAgIC5jaHJpc3RpYW5pdHktc2hhcmVkLXpvbmUsXG4gICAgICAgIC5jaHJpc3RpYW5pdHktYWN0aW9ucyB7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktbWF0Y2gtc3RyaXAge1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcikgYXV0byBtaW5tYXgoMCwgMWZyKTtcbiAgICAgICAgICBnYXA6IDAuMzVyZW07XG4gICAgICAgICAgcGFkZGluZzogMC4zNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktbWF0Y2gtcGxheWVyIHtcbiAgICAgICAgICBnYXA6IDAuMzVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LW1hdGNoLXBsYXllciBzbWFsbCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktc2NvcmVib2FyZCB7XG4gICAgICAgICAgbWluLXdpZHRoOiAzLjY1cmVtO1xuICAgICAgICAgIHBhZGRpbmc6IDAgMC4zNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktc2NvcmVib2FyZCBzdHJvbmcge1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS4wNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktdGFibGUge1xuICAgICAgICAgIGdhcDogMC4zNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktcGxheWVyLXNpZGUge1xuICAgICAgICAgIHBhZGRpbmc6IDAuM3JlbSAwLjI1cmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNocmlzdGlhbml0eS1iYXR0bGUtem9uZSB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgbWlubWF4KDMuMzVyZW0sIDFmcikpO1xuICAgICAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LWhhbmQtZmFuIHtcbiAgICAgICAgICBtaW4taGVpZ2h0OiAxMC41NXJlbTtcbiAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogMnJlbTtcbiAgICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktaGFuZC1zaGVsZiB7XG4gICAgICAgICAgbWluLWhlaWdodDogMTEuNzVyZW07XG4gICAgICAgICAgbWFyZ2luLXRvcDogLTFyZW07XG4gICAgICAgICAgcGFkZGluZy10b3A6IDEuMzVyZW07XG4gICAgICAgICAgcGFkZGluZy1ib3R0b206IDAuOXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktaGFuZC1zaGVsZi0tb3Bwb25lbnQge1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDYuNjVyZW07XG4gICAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICAgIHBhZGRpbmctdG9wOiAwLjRyZW07XG4gICAgICAgICAgcGFkZGluZy1ib3R0b206IDAuODVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LXBsYXllci1yYWNrIHtcbiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg0LjdyZW0sIDUuOXJlbSkgbWlubWF4KDQuOHJlbSwgMWZyKSBtaW5tYXgoMy43cmVtLCA1cmVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktc2hhcmVkLXpvbmUge1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCgzLjdyZW0sIDFmcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNocmlzdGlhbml0eS16b25lLWNhcmQsXG4gICAgICAgIC5jaHJpc3RpYW5pdHktem9uZS1waWxlIHtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA2LjE1cmVtO1xuICAgICAgICAgIHBhZGRpbmc6IDAuNThyZW0gMC40NnJlbSAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LW9mZmVyaW5nLXBpbGUge1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDYuODVyZW07XG4gICAgICAgICAgcGFkZGluZzogMC44OHJlbSAwLjQ2cmVtIDAuNTVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LWNhcmQtcHJldmlldy1jYXJkIHtcbiAgICAgICAgICB3aWR0aDogY2xhbXAoNC4ycmVtLCAyMHZ3LCA1LjdyZW0pO1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IGNsYW1wKDUuOHJlbSwgMjZ2dywgNy40cmVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jaHJpc3RpYW5pdHktbGVhZGVyLWNhcmQge1xuICAgICAgICAgIHdpZHRoOiBjbGFtcCg0LjU1cmVtLCAyMHZ3LCA1LjdyZW0pO1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IGNsYW1wKDYuMTVyZW0sIDI3dncsIDcuNnJlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAuY2hyaXN0aWFuaXR5LW9mZmVyaW5nLXJvdyB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNC41cmVtLCA1LjVyZW0pIG1pbm1heCgwLCAxZnIpO1xuICAgICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNocmlzdGlhbml0eS1oYW5kLWZhbi0tb3Bwb25lbnQge1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDUuNzVyZW07XG4gICAgICAgICAgcGFkZGluZy1ib3R0b206IDAuN3JlbTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENocmlzdGlhbml0eUdhbWVDb21wb25lbnQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBnYW1lID0gc2lnbmFsPENocmlzdGlhbml0eUdhbWVTdGF0ZT4oc3RydWN0dXJlZENsb25lKFNUQVJUSU5HX0dBTUUpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkSGFuZENhcmQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZEF0dGFja2VyID0gc2lnbmFsPENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZFByZXZpZXcgPSBzaWduYWw8Q2hyaXN0aWFuaXR5Q2FyZFByZXZpZXcgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZpZXdUaWx0ID0gc2lnbmFsPENocmlzdGlhbml0eVByZXZpZXdUaWx0Pih7IHJvdGF0ZVg6IDUsIHJvdGF0ZVk6IC01LCBzaGlmdFg6IDAsIHNoaWZ0WTogMCB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdmVyZWRIYW5kSW5kZXggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93SGlzdG9yeSA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBvZmZlcmluZ3NTZWF0ID0gc2lnbmFsPENocmlzdGlhbml0eVNlYXQgfCBudWxsPihudWxsKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nYW1lKCkucGxheWVycy5QMSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBvcHBvbmVudCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZ2FtZSgpLnBsYXllcnMuUDIpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudFBsYXllciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZ2FtZSgpLnBsYXllcnNbdGhpcy5nYW1lKCkudHVybk93bmVyXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc093blR1cm4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdhbWUoKS50dXJuT3duZXIgPT09ICdQMScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzT3Bwb25lbnRHdWFyZHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wcG9uZW50KCkuYmF0dGxlWm9uZS5sZW5ndGggPiAwKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wcG9uZW50SGFuZENvdW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHBvbmVudCgpLmhhbmRDb3VudCA/PyB0aGlzLm9wcG9uZW50KCkuaGFuZD8ubGVuZ3RoID8/IDApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRDYXJkRGVmaW5pdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRIYW5kQ2FyZCgpO1xuICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuY2FyZERlZmluaXRpb24oc2VsZWN0ZWQpIDogbnVsbDtcbiAgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdGF0dXNUZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGF0dGFja2VyID0gdGhpcy5zZWxlY3RlZEF0dGFja2VyKCk7XG4gICAgY29uc3QgaGFuZENhcmQgPSB0aGlzLnNlbGVjdGVkQ2FyZERlZmluaXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXNPd25UdXJuKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnQoJ2NocmlzdGlhbml0eVdhaXRUdXJuJyk7XG4gICAgfVxuICAgIGlmIChhdHRhY2tlcikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3Bwb25lbnRHdWFyZHMoKSA/IHRoaXMudCgnY2hyaXN0aWFuaXR5Q2hvb3NlQ2hhcmFjdGVyVGFyZ2V0JykgOiB0aGlzLnQoJ2NocmlzdGlhbml0eUNob29zZVRhcmdldCcpO1xuICAgIH1cbiAgICBpZiAoaGFuZENhcmQpIHtcbiAgICAgIGlmICghdGhpcy5jYW5QbGF5KGhhbmRDYXJkKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50KCdjaHJpc3RpYW5pdHlOZWVkT2ZmZXJpbmdzJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFuZENhcmQudHlwZSA9PT0gJ29mZmVyaW5nJyA/IHRoaXMudCgnY2hyaXN0aWFuaXR5UGxhY2VPZmZlcmluZycpIDogdGhpcy50KCdjaHJpc3RpYW5pdHlDaG9vc2VTbG90Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnQoJ2NocmlzdGlhbml0eUNob29zZUNhcmQnKTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoJ01pbmlHYW1lcycsIE1JTklfR0FNRVNfSTE4Tik7XG4gIH1cblxuICBwcm90ZWN0ZWQgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnTWluaUdhbWVzJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FyZERlZmluaXRpb24oY2FyZElkOiBzdHJpbmcpOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB7XG4gICAgcmV0dXJuIFNUQVJURVJfQ0FSRFNbY2FyZElkXSA/PyBTVEFSVEVSX0NBUkRTWydwX3Njb3V0J107XG4gIH1cblxuICBwcm90ZWN0ZWQgYmF0dGxlU2xvdHMoc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCk6IEFycmF5PHsgdHJhY2tJZDogc3RyaW5nOyBjYXJkPzogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UgfT4ge1xuICAgIGNvbnN0IGNhcmRzID0gdGhpcy5nYW1lKCkucGxheWVyc1tzZWF0XS5iYXR0bGVab25lO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA0IH0sIChfLCBpbmRleCkgPT4gKHtcbiAgICAgIHRyYWNrSWQ6IGNhcmRzW2luZGV4XT8uaW5zdGFuY2VJZCA/PyBgJHtzZWF0fS1lbXB0eS0ke2luZGV4fWAsXG4gICAgICBjYXJkOiBjYXJkc1tpbmRleF0sXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGRlbkhhbmRDYXJkcyhjb3VudDogbnVtYmVyKTogdW5rbm93bltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmFuVHJhbnNmb3JtKGluZGV4OiBudW1iZXIsIHRvdGFsOiBudW1iZXIsIG9wcG9uZW50OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAodG90YWwgPD0gMSkgcmV0dXJuICdub25lJztcbiAgICBjb25zdCBjZW50ZXIgPSAodG90YWwgLSAxKSAvIDI7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaW5kZXggLSBjZW50ZXI7XG4gICAgY29uc3Qgcm90YXRlID0gb2Zmc2V0ICogKG9wcG9uZW50ID8gOCA6IDUpO1xuICAgIGNvbnN0IGxpZnQgPSBNYXRoLmFicyhvZmZzZXQpICogMC4yNTtcbiAgICBjb25zdCBob3ZlckxpZnQgPSBvcHBvbmVudCA/IDAgOiB0aGlzLmhhbmRXYXZlTGlmdChpbmRleCk7XG4gICAgY29uc3Qgc2NhbGUgPSBvcHBvbmVudCA/IDEgOiB0aGlzLmhhbmRXYXZlU2NhbGUoaW5kZXgpO1xuICAgIGNvbnN0IGZhbkxpZnQgPSBvcHBvbmVudCA/IE1hdGguYWJzKG9mZnNldCkgKiAwLjM0IDogbGlmdCArIGhvdmVyTGlmdDtcbiAgICBjb25zdCBmYW5TcHJlYWQgPSBvcHBvbmVudCA/IG9mZnNldCAqIDAuMDggOiAwO1xuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7ZmFuU3ByZWFkfXJlbSwgJHtmYW5MaWZ0fXJlbSkgcm90YXRlKCR7cm90YXRlfWRlZykgc2NhbGUoJHtzY2FsZX0pYDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kQ2FyZFpJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBob3ZlcmVkID0gdGhpcy5ob3ZlcmVkSGFuZEluZGV4KCk7XG4gICAgaWYgKGhvdmVyZWQgPT09IG51bGwpIHJldHVybiAyO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoaW5kZXggLSBob3ZlcmVkKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMiwgOCAtIGRpc3RhbmNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRIb3ZlcmVkSGFuZEluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVyZWRIYW5kSW5kZXguc2V0KGluZGV4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhckhvdmVyZWRIYW5kSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlcmVkSGFuZEluZGV4LnNldChudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWxlYXNlSG92ZXJlZEhhbmQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJykge1xuICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbGVhckhvdmVyZWRIYW5kSW5kZXgoKSwgMTgwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRXYXZlTGlmdChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBob3ZlcmVkID0gdGhpcy5ob3ZlcmVkSGFuZEluZGV4KCk7XG4gICAgaWYgKGhvdmVyZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoaW5kZXggLSBob3ZlcmVkKTtcbiAgICBpZiAoZGlzdGFuY2UgPT09IDApIHJldHVybiAtMS4xNTtcbiAgICBpZiAoZGlzdGFuY2UgPT09IDEpIHJldHVybiAtMC41ODtcbiAgICBpZiAoZGlzdGFuY2UgPT09IDIpIHJldHVybiAtMC4yMjtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZFdhdmVTY2FsZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBob3ZlcmVkID0gdGhpcy5ob3ZlcmVkSGFuZEluZGV4KCk7XG4gICAgaWYgKGhvdmVyZWQgPT09IG51bGwpIHJldHVybiAxO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoaW5kZXggLSBob3ZlcmVkKTtcbiAgICBpZiAoZGlzdGFuY2UgPT09IDApIHJldHVybiAxLjA2O1xuICAgIGlmIChkaXN0YW5jZSA9PT0gMSkgcmV0dXJuIDEuMDM7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZHlPZmZlcmluZ3MocGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBsYXllci5vZmZlcmluZ3MucmVkdWNlKCh0b3RhbCwgb2ZmZXJpbmcpID0+IHRvdGFsICsgKG9mZmVyaW5nLnJlYWR5ID8gb2ZmZXJpbmcudmFsdWUgOiAwKSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG90YWxPZmZlcmluZ3MocGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBsYXllci5vZmZlcmluZ3MucmVkdWNlKCh0b3RhbCwgb2ZmZXJpbmcpID0+IHRvdGFsICsgb2ZmZXJpbmcudmFsdWUsIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhblBsYXkoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNPd25UdXJuKCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnKSByZXR1cm4gIXRoaXMucGxheWVyKCkub2ZmZXJpbmdQbGF5ZWRUaGlzVHVybjtcbiAgICByZXR1cm4gdGhpcy5yZWFkeU9mZmVyaW5ncyh0aGlzLnBsYXllcigpKSA+PSBjYXJkLmNvc3QgJiYgdGhpcy5wbGF5ZXIoKS5iYXR0bGVab25lLmxlbmd0aCA8IDQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuUGxheVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEhhbmRDYXJkKCk7XG4gICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgdGhpcy5jYW5QbGF5KHRoaXMuY2FyZERlZmluaXRpb24oc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RlZEFjdGlvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkQ2FyZERlZmluaXRpb24oKTtcbiAgICBpZiAoIXNlbGVjdGVkKSByZXR1cm4gdGhpcy50KCdjaHJpc3RpYW5pdHlQbGF5Q2FyZCcpO1xuICAgIHJldHVybiBzZWxlY3RlZC50eXBlID09PSAnb2ZmZXJpbmcnID8gdGhpcy50KCdjaHJpc3RpYW5pdHlQbGF5T2ZmZXJpbmcnKSA6IHRoaXMudCgnY2hyaXN0aWFuaXR5UGxheUNhcmQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RlZEFjdGlvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZENhcmREZWZpbml0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3RlZCB8fCAhdGhpcy5jYW5QbGF5KHNlbGVjdGVkKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHNlbGVjdGVkLnR5cGUgPT09ICdjaGFyYWN0ZXInO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhblBsYWNlU2VsZWN0ZWRDaGFyYWN0ZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkQ2FyZERlZmluaXRpb24oKTtcbiAgICByZXR1cm4gISFzZWxlY3RlZCAmJiBzZWxlY3RlZC50eXBlID09PSAnY2hhcmFjdGVyJyAmJiB0aGlzLmNhblBsYXkoc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhblBsYWNlU2VsZWN0ZWRPZmZlcmluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRDYXJkRGVmaW5pdGlvbigpO1xuICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLnR5cGUgPT09ICdvZmZlcmluZycgJiYgdGhpcy5jYW5QbGF5KHNlbGVjdGVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RIYW5kQ2FyZChjYXJkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2tlci5zZXQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZEhhbmRDYXJkLnNldCh0aGlzLnNlbGVjdGVkSGFuZENhcmQoKSA9PT0gY2FyZElkID8gbnVsbCA6IGNhcmRJZCk7XG4gICAgdGhpcy5pbnNwZWN0SGFuZENhcmQoY2FyZElkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwbGF5U2VsZWN0ZWRDYXJkKHNsb3RJbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNhcmRJZCA9IHRoaXMuc2VsZWN0ZWRIYW5kQ2FyZCgpO1xuICAgIGlmICghY2FyZElkKSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IHRoaXMuY2FyZERlZmluaXRpb24oY2FyZElkKTtcbiAgICBpZiAoIXRoaXMuY2FuUGxheShjYXJkKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5nYW1lLnVwZGF0ZShnYW1lID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoZ2FtZSk7XG4gICAgICBjb25zdCBwbGF5ZXIgPSBuZXh0LnBsYXllcnMuUDE7XG4gICAgICBjb25zdCBoYW5kSW5kZXggPSBwbGF5ZXIuaGFuZD8uaW5kZXhPZihjYXJkSWQpID8/IC0xO1xuICAgICAgaWYgKGhhbmRJbmRleCA8IDAgfHwgIXBsYXllci5oYW5kKSByZXR1cm4gZ2FtZTtcbiAgICAgIHBsYXllci5oYW5kLnNwbGljZShoYW5kSW5kZXgsIDEpO1xuICAgICAgaWYgKGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJykge1xuICAgICAgICBwbGF5ZXIub2ZmZXJpbmdzLnB1c2goe1xuICAgICAgICAgIGluc3RhbmNlSWQ6IGBwMV9vZmZlcmluZ18ke25leHQucmV2aXNpb24gKyAxfWAsXG4gICAgICAgICAgY2FyZElkOiBjYXJkLmlkLFxuICAgICAgICAgIG5hbWU6IGNhcmQubmFtZSxcbiAgICAgICAgICBvd25lcjogJ1AxJyxcbiAgICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogY2FyZC5saWZlLFxuICAgICAgICAgIGFiaWxpdHlOYW1lOiBjYXJkLmFiaWxpdHlOYW1lLFxuICAgICAgICAgIGFiaWxpdHlUZXh0OiBjYXJkLmFiaWxpdHlUZXh0LFxuICAgICAgICAgIGFiaWxpdHlDb3N0OiBjYXJkLmFiaWxpdHlDb3N0LFxuICAgICAgICB9KTtcbiAgICAgICAgcGxheWVyLm9mZmVyaW5nUGxheWVkVGhpc1R1cm4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zcGVuZE9mZmVyaW5ncyhwbGF5ZXIsIGNhcmQuY29zdCk7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gTWF0aC5taW4oc2xvdEluZGV4ID8/IHBsYXllci5iYXR0bGVab25lLmxlbmd0aCwgcGxheWVyLmJhdHRsZVpvbmUubGVuZ3RoKTtcbiAgICAgICAgcGxheWVyLmJhdHRsZVpvbmUuc3BsaWNlKGluc2VydEluZGV4LCAwLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogYHAxXyR7bmV4dC5yZXZpc2lvbiArIDF9XyR7cGxheWVyLmJhdHRsZVpvbmUubGVuZ3RofWAsXG4gICAgICAgICAgY2FyZElkOiBjYXJkLmlkLFxuICAgICAgICAgIG5hbWU6IGNhcmQubmFtZSxcbiAgICAgICAgICBvd25lcjogJ1AxJyxcbiAgICAgICAgICBjb250cm9sbGVyOiAnUDEnLFxuICAgICAgICAgIGF0dGFjazogY2FyZC5hdHRhY2ssXG4gICAgICAgICAgY3VycmVudEhwOiBjYXJkLmxpZmUsXG4gICAgICAgICAgbWF4SHA6IGNhcmQubGlmZSxcbiAgICAgICAgICBjYW5BdHRhY2s6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG5leHQucmV2aXNpb24rKztcbiAgICAgIG5leHQubG9nID0gW1xuICAgICAgICBjYXJkLnR5cGUgPT09ICdvZmZlcmluZycgPyBgJHtjYXJkLm5hbWV9IHF1ZWRhIGxpc3RhIGNvbW8gb2ZyZW5kYS5gIDogYCR7Y2FyZC5uYW1lfSBlbnRyYSBlbiBiYXRhbGxhLmAsXG4gICAgICAgIC4uLm5leHQubG9nLFxuICAgICAgXS5zbGljZSgwLCA0KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRIYW5kQ2FyZC5zZXQobnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlT2ZmZXJpbmdQaWxlKHNlYXQ6IENocmlzdGlhbml0eVNlYXQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5PZmZlcmluZ3Moc2VhdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0QXR0YWNrZXIoY2FyZDogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkSGFuZENhcmQuc2V0KG51bGwpO1xuICAgIHRoaXMuaW5zcGVjdENoYXJhY3RlcihjYXJkKTtcbiAgICBpZiAoIXRoaXMuaXNPd25UdXJuKCkgfHwgIWNhcmQuY2FuQXR0YWNrKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZEF0dGFja2VyLnNldCh0aGlzLnNlbGVjdGVkQXR0YWNrZXIoKT8uaW5zdGFuY2VJZCA9PT0gY2FyZC5pbnN0YW5jZUlkID8gbnVsbCA6IGNhcmQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZU9wcG9uZW50Q2hhcmFjdGVyKGNhcmQ6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlKTogdm9pZCB7XG4gICAgdGhpcy5pbnNwZWN0Q2hhcmFjdGVyKGNhcmQpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNrZXIoKSkge1xuICAgICAgdGhpcy5hdHRhY2tDaGFyYWN0ZXIoY2FyZCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZU9wcG9uZW50TGVhZGVyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5zcGVjdExlYWRlcignUDInKTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFja2VyKCkgJiYgIXRoaXMuaGFzT3Bwb25lbnRHdWFyZHMoKSkge1xuICAgICAgdGhpcy5hdHRhY2tMZWFkZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXR0YWNrTGVhZGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGF0dGFja2VyID0gdGhpcy5zZWxlY3RlZEF0dGFja2VyKCk7XG4gICAgaWYgKCFhdHRhY2tlcikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhhc09wcG9uZW50R3VhcmRzKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldCh7XG4gICAgICAgIHRpdGxlOiB0aGlzLm9wcG9uZW50KCkubGVhZGVyTmFtZSxcbiAgICAgICAgZXllYnJvdzogdGhpcy50KCdjaHJpc3RpYW5pdHlMZWFkZXJDYXJkJyksXG4gICAgICAgIG1ldGE6IGAke3RoaXMub3Bwb25lbnQoKS5sZWFkZXJIcH0vJHt0aGlzLm9wcG9uZW50KCkubGVhZGVyTWF4SHB9YCxcbiAgICAgICAgYm9keTogdGhpcy50KCdjaHJpc3RpYW5pdHlMZWFkZXJQcm90ZWN0ZWQnKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmdhbWUudXBkYXRlKGdhbWUgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IHN0cnVjdHVyZWRDbG9uZShnYW1lKTtcbiAgICAgIGNvbnN0IGxpdmVBdHRhY2tlciA9IG5leHQucGxheWVycy5QMS5iYXR0bGVab25lLmZpbmQoY2FyZCA9PiBjYXJkLmluc3RhbmNlSWQgPT09IGF0dGFja2VyLmluc3RhbmNlSWQpO1xuICAgICAgaWYgKCFsaXZlQXR0YWNrZXIgfHwgIWxpdmVBdHRhY2tlci5jYW5BdHRhY2spIHJldHVybiBnYW1lO1xuICAgICAgbmV4dC5wbGF5ZXJzLlAyLmxlYWRlckhwID0gTWF0aC5tYXgoMCwgbmV4dC5wbGF5ZXJzLlAyLmxlYWRlckhwIC0gbGl2ZUF0dGFja2VyLmF0dGFjayk7XG4gICAgICBsaXZlQXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gICAgICBuZXh0LnJldmlzaW9uKys7XG4gICAgICBuZXh0LmxvZyA9IFtgJHtsaXZlQXR0YWNrZXIubmFtZX0gYXRhY2EgYWwgbGlkZXIgcml2YWwuYCwgLi4ubmV4dC5sb2ddLnNsaWNlKDAsIDQpO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RlZEF0dGFja2VyLnNldChudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhdHRhY2tDaGFyYWN0ZXIodGFyZ2V0OiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSk6IHZvaWQge1xuICAgIGNvbnN0IGF0dGFja2VyID0gdGhpcy5zZWxlY3RlZEF0dGFja2VyKCk7XG4gICAgaWYgKCFhdHRhY2tlcikgcmV0dXJuO1xuICAgIHRoaXMuZ2FtZS51cGRhdGUoZ2FtZSA9PiB7XG4gICAgICBjb25zdCBuZXh0ID0gc3RydWN0dXJlZENsb25lKGdhbWUpO1xuICAgICAgY29uc3QgbGl2ZUF0dGFja2VyID0gbmV4dC5wbGF5ZXJzLlAxLmJhdHRsZVpvbmUuZmluZChjYXJkID0+IGNhcmQuaW5zdGFuY2VJZCA9PT0gYXR0YWNrZXIuaW5zdGFuY2VJZCk7XG4gICAgICBjb25zdCBsaXZlVGFyZ2V0ID0gbmV4dC5wbGF5ZXJzLlAyLmJhdHRsZVpvbmUuZmluZChjYXJkID0+IGNhcmQuaW5zdGFuY2VJZCA9PT0gdGFyZ2V0Lmluc3RhbmNlSWQpO1xuICAgICAgaWYgKCFsaXZlQXR0YWNrZXIgfHwgIWxpdmVUYXJnZXQgfHwgIWxpdmVBdHRhY2tlci5jYW5BdHRhY2spIHJldHVybiBnYW1lO1xuICAgICAgbGl2ZVRhcmdldC5jdXJyZW50SHAgLT0gbGl2ZUF0dGFja2VyLmF0dGFjaztcbiAgICAgIGxpdmVBdHRhY2tlci5jdXJyZW50SHAgLT0gbGl2ZVRhcmdldC5hdHRhY2s7XG4gICAgICBsaXZlQXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gICAgICB0aGlzLmNsZWFudXBEZXN0cm95ZWQobmV4dC5wbGF5ZXJzLlAxLCBuZXh0KTtcbiAgICAgIHRoaXMuY2xlYW51cERlc3Ryb3llZChuZXh0LnBsYXllcnMuUDIsIG5leHQpO1xuICAgICAgbmV4dC5yZXZpc2lvbisrO1xuICAgICAgbmV4dC5sb2cgPSBbYCR7bGl2ZUF0dGFja2VyLm5hbWV9IGNvbWJhdGUgY29udHJhICR7bGl2ZVRhcmdldC5uYW1lfS5gLCAuLi5uZXh0LmxvZ10uc2xpY2UoMCwgNCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGVkQXR0YWNrZXIuc2V0KG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVuZFR1cm4oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEhhbmRDYXJkLnNldChudWxsKTtcbiAgICB0aGlzLnNlbGVjdGVkQXR0YWNrZXIuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldChudWxsKTtcbiAgICB0aGlzLmdhbWUudXBkYXRlKGdhbWUgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IHN0cnVjdHVyZWRDbG9uZShnYW1lKTtcbiAgICAgIG5leHQudHVybk93bmVyID0gbmV4dC50dXJuT3duZXIgPT09ICdQMScgPyAnUDInIDogJ1AxJztcbiAgICAgIG5leHQudHVybkNvdW50Kys7XG4gICAgICBjb25zdCBjdXJyZW50ID0gbmV4dC5wbGF5ZXJzW25leHQudHVybk93bmVyXTtcbiAgICAgIGN1cnJlbnQub2ZmZXJpbmdQbGF5ZWRUaGlzVHVybiA9IGZhbHNlO1xuICAgICAgY3VycmVudC5vZmZlcmluZ3MgPSBjdXJyZW50Lm9mZmVyaW5ncy5tYXAob2ZmZXJpbmcgPT4gKHsgLi4ub2ZmZXJpbmcsIHJlYWR5OiB0cnVlIH0pKTtcbiAgICAgIGN1cnJlbnQuYmF0dGxlWm9uZSA9IGN1cnJlbnQuYmF0dGxlWm9uZS5tYXAoY2FyZCA9PiAoeyAuLi5jYXJkLCBjYW5BdHRhY2s6IHRydWUgfSkpO1xuICAgICAgY29uc3QgZHJhd25DYXJkID0gbmV4dC5zaGFyZWREZWNrLnNoaWZ0KCk7XG4gICAgICBpZiAoZHJhd25DYXJkKSB7XG4gICAgICAgIGlmIChjdXJyZW50LmhhbmQpIHtcbiAgICAgICAgICBjdXJyZW50LmhhbmQucHVzaChkcmF3bkNhcmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnQuaGFuZENvdW50ID0gKGN1cnJlbnQuaGFuZENvdW50ID8/IDApICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dC5yZXZpc2lvbisrO1xuICAgICAgbmV4dC5sb2cgPSBbXG4gICAgICAgIGRyYXduQ2FyZCA/IGAke2N1cnJlbnQuZGlzcGxheU5hbWV9IHJvYmEgdW5hIGNhcnRhLmAgOiBgRWwgbWF6byBlc3RhIHZhY2lvLmAsXG4gICAgICAgIGBUdXJubyBkZSAke2N1cnJlbnQuZGlzcGxheU5hbWV9LmAsXG4gICAgICAgIC4uLm5leHQubG9nLFxuICAgICAgXS5zbGljZSgwLCA0KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0TW9jaygpOiB2b2lkIHtcbiAgICB0aGlzLmdhbWUuc2V0KHN0cnVjdHVyZWRDbG9uZShTVEFSVElOR19HQU1FKSk7XG4gICAgdGhpcy5zZWxlY3RlZEhhbmRDYXJkLnNldChudWxsKTtcbiAgICB0aGlzLnNlbGVjdGVkQXR0YWNrZXIuc2V0KG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldChudWxsKTtcbiAgICB0aGlzLnNob3dIaXN0b3J5LnNldChmYWxzZSk7XG4gICAgdGhpcy5vZmZlcmluZ3NTZWF0LnNldChudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZVByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFByZXZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMucmVzZXRQcmV2aWV3VGlsdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9wZW5PZmZlcmluZ3Moc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldChudWxsKTtcbiAgICB0aGlzLnNob3dIaXN0b3J5LnNldChmYWxzZSk7XG4gICAgdGhpcy5vZmZlcmluZ3NTZWF0LnNldChzZWF0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZU9mZmVyaW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLm9mZmVyaW5nc1NlYXQuc2V0KG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRpbHRQcmV2aWV3KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBib3VuZHMgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IChldmVudC5jbGllbnRYIC0gYm91bmRzLmxlZnQpIC8gYm91bmRzLndpZHRoIC0gMC41O1xuICAgIGNvbnN0IHkgPSAoZXZlbnQuY2xpZW50WSAtIGJvdW5kcy50b3ApIC8gYm91bmRzLmhlaWdodCAtIDAuNTtcbiAgICB0aGlzLnByZXZpZXdUaWx0LnNldCh7XG4gICAgICByb3RhdGVYOiA1IC0geSAqIDE4LFxuICAgICAgcm90YXRlWTogLTUgKyB4ICogMTgsXG4gICAgICBzaGlmdFg6IHggKiAxMCxcbiAgICAgIHNoaWZ0WTogeSAqIDEwLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0UHJldmlld1RpbHQoKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aWV3VGlsdC5zZXQoeyByb3RhdGVYOiA1LCByb3RhdGVZOiAtNSwgc2hpZnRYOiAwLCBzaGlmdFk6IDAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBEZXN0cm95ZWQocGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSwgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgZGVzdHJveWVkID0gcGxheWVyLmJhdHRsZVpvbmUuZmlsdGVyKGNhcmQgPT4gY2FyZC5jdXJyZW50SHAgPD0gMCk7XG4gICAgaWYgKCFkZXN0cm95ZWQubGVuZ3RoKSByZXR1cm47XG4gICAgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKC4uLmRlc3Ryb3llZC5tYXAoY2FyZCA9PiBjYXJkLmNhcmRJZCkpO1xuICAgIHBsYXllci5iYXR0bGVab25lID0gcGxheWVyLmJhdHRsZVpvbmUuZmlsdGVyKGNhcmQgPT4gY2FyZC5jdXJyZW50SHAgPiAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNwZWN0TGVhZGVyKHNlYXQ6IENocmlzdGlhbml0eVNlYXQpOiB2b2lkIHtcbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLmdhbWUoKS5wbGF5ZXJzW3NlYXRdO1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldCh7XG4gICAgICB0aXRsZTogcGxheWVyLmxlYWRlck5hbWUsXG4gICAgICBleWVicm93OiB0aGlzLnQoJ2NocmlzdGlhbml0eUxlYWRlckNhcmQnKSxcbiAgICAgIG1ldGE6IGAke3BsYXllci5sZWFkZXJIcH0vJHtwbGF5ZXIubGVhZGVyTWF4SHB9YCxcbiAgICAgIGJvZHk6IHNlYXQgPT09ICdQMicgJiYgdGhpcy5oYXNPcHBvbmVudEd1YXJkcygpID8gdGhpcy50KCdjaHJpc3RpYW5pdHlMZWFkZXJQcm90ZWN0ZWQnKSA6IHRoaXMudCgnY2hyaXN0aWFuaXR5TGVhZGVyQm9keScpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc3BlY3RPZmZlcmluZyhvZmZlcmluZzogQ2hyaXN0aWFuaXR5T2ZmZXJpbmdJbnN0YW5jZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldCh7XG4gICAgICB0aXRsZTogb2ZmZXJpbmcubmFtZSxcbiAgICAgIGV5ZWJyb3c6IHRoaXMudCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdDYXJkJyksXG4gICAgICBtZXRhOiBvZmZlcmluZy5yZWFkeSA/IHRoaXMudCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdSZWFkeScpIDogdGhpcy50KCdjaHJpc3RpYW5pdHlPZmZlcmluZ0V4aGF1c3RlZCcpLFxuICAgICAgYm9keTogb2ZmZXJpbmcuYWJpbGl0eVRleHQgfHwgdGhpcy50KCdjaHJpc3RpYW5pdHlPZmZlcmluZ0JvZHknKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYW5Vc2VPZmZlcmluZ0FiaWxpdHkob2ZmZXJpbmc6IENocmlzdGlhbml0eU9mZmVyaW5nSW5zdGFuY2UsIHNlYXQ6IENocmlzdGlhbml0eVNlYXQpOiBib29sZWFuIHtcbiAgICBpZiAoc2VhdCAhPT0gJ1AxJyB8fCAhdGhpcy5pc093blR1cm4oKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghb2ZmZXJpbmcucmVhZHkgfHwgIW9mZmVyaW5nLmFiaWxpdHlOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucmVhZHlPZmZlcmluZ3ModGhpcy5nYW1lKCkucGxheWVyc1tzZWF0XSkgPj0gKG9mZmVyaW5nLmFiaWxpdHlDb3N0ID8/IDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVzZU9mZmVyaW5nQWJpbGl0eShvZmZlcmluZzogQ2hyaXN0aWFuaXR5T2ZmZXJpbmdJbnN0YW5jZSwgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5Vc2VPZmZlcmluZ0FiaWxpdHkob2ZmZXJpbmcsIHNlYXQpKSByZXR1cm47XG4gICAgdGhpcy5nYW1lLnVwZGF0ZShnYW1lID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoZ2FtZSk7XG4gICAgICBjb25zdCBwbGF5ZXIgPSBuZXh0LnBsYXllcnNbc2VhdF07XG4gICAgICBjb25zdCBsaXZlT2ZmZXJpbmcgPSBwbGF5ZXIub2ZmZXJpbmdzLmZpbmQoY2FyZCA9PiBjYXJkLmluc3RhbmNlSWQgPT09IG9mZmVyaW5nLmluc3RhbmNlSWQpO1xuICAgICAgaWYgKCFsaXZlT2ZmZXJpbmcgfHwgIWxpdmVPZmZlcmluZy5yZWFkeSkgcmV0dXJuIGdhbWU7XG4gICAgICBjb25zdCBvZmZlcmluZ0lkID0gbGl2ZU9mZmVyaW5nLmluc3RhbmNlSWQ7XG4gICAgICB0aGlzLnNwZW5kT2ZmZXJpbmdzKHBsYXllciwgbGl2ZU9mZmVyaW5nLmFiaWxpdHlDb3N0ID8/IDApO1xuICAgICAgcGxheWVyLm9mZmVyaW5ncyA9IHBsYXllci5vZmZlcmluZ3MubWFwKGNhcmQgPT4gKGNhcmQuaW5zdGFuY2VJZCA9PT0gb2ZmZXJpbmdJZCA/IHsgLi4uY2FyZCwgcmVhZHk6IGZhbHNlIH0gOiBjYXJkKSk7XG4gICAgICBwbGF5ZXIubGVhZGVySHAgPSBNYXRoLm1heCgwLCBwbGF5ZXIubGVhZGVySHAgLSAxKTtcbiAgICAgIG5leHQucmV2aXNpb24rKztcbiAgICAgIG5leHQubG9nID0gW2Ake2xpdmVPZmZlcmluZy5uYW1lfTogJHtsaXZlT2ZmZXJpbmcuYWJpbGl0eU5hbWV9LmAsIC4uLm5leHQubG9nXS5zbGljZSgwLCA0KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc3BlY3REZWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldCh7XG4gICAgICB0aXRsZTogdGhpcy50KCdjaHJpc3RpYW5pdHlEZWNrJyksXG4gICAgICBleWVicm93OiB0aGlzLnQoJ2NocmlzdGlhbml0eVNoYXJlZFpvbmUnKSxcbiAgICAgIG1ldGE6IGAke3RoaXMuZ2FtZSgpLnNoYXJlZERlY2subGVuZ3RofWAsXG4gICAgICBib2R5OiB0aGlzLnQoJ2NocmlzdGlhbml0eURlY2tCb2R5JyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zcGVjdEhhbmRDYXJkKGNhcmRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2FyZCA9IHRoaXMuY2FyZERlZmluaXRpb24oY2FyZElkKTtcbiAgICB0aGlzLnNlbGVjdGVkUHJldmlldy5zZXQoe1xuICAgICAgdGl0bGU6IGNhcmQubmFtZSxcbiAgICAgIGV5ZWJyb3c6IGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJyA/IHRoaXMudCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdDYXJkJykgOiB0aGlzLnQoJ2NocmlzdGlhbml0eUNoYXJhY3RlckNhcmQnKSxcbiAgICAgIG1ldGE6IGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJyA/IGArJHtjYXJkLmxpZmV9YCA6IGAke3RoaXMudCgnY2hyaXN0aWFuaXR5Q29zdCcpfSAke2NhcmQuY29zdH0gwrcgJHtjYXJkLmF0dGFja30vJHtjYXJkLmxpZmV9YCxcbiAgICAgIGJvZHk6IGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJyA/IHRoaXMudCgnY2hyaXN0aWFuaXR5T2ZmZXJpbmdCb2R5JykgOiB0aGlzLnQoJ2NocmlzdGlhbml0eUNoYXJhY3RlckJvZHknKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNwZWN0SGlzdG9yeUNhcmQoY2FyZElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dIaXN0b3J5LnNldChmYWxzZSk7XG4gICAgdGhpcy5pbnNwZWN0SGFuZENhcmQoY2FyZElkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zcGVjdENoYXJhY3RlcihjYXJkOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmV2aWV3LnNldCh7XG4gICAgICB0aXRsZTogY2FyZC5uYW1lLFxuICAgICAgZXllYnJvdzogdGhpcy50KCdjaHJpc3RpYW5pdHlDaGFyYWN0ZXJDYXJkJyksXG4gICAgICBtZXRhOiBgJHtjYXJkLmF0dGFja30vJHtjYXJkLmN1cnJlbnRIcH1gLFxuICAgICAgYm9keTogY2FyZC5jYW5BdHRhY2sgPyB0aGlzLnQoJ2NocmlzdGlhbml0eUNoYXJhY3RlclJlYWR5JykgOiB0aGlzLnQoJ2NocmlzdGlhbml0eUNoYXJhY3RlckV4aGF1c3RlZCcpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGVuZE9mZmVyaW5ncyhwbGF5ZXI6IENocmlzdGlhbml0eVBsYXllclN0YXRlLCBjb3N0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgcmVtYWluaW5nID0gY29zdDtcbiAgICBwbGF5ZXIub2ZmZXJpbmdzID0gcGxheWVyLm9mZmVyaW5ncy5tYXAob2ZmZXJpbmcgPT4ge1xuICAgICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8ICFvZmZlcmluZy5yZWFkeSkgcmV0dXJuIG9mZmVyaW5nO1xuICAgICAgcmVtYWluaW5nIC09IG9mZmVyaW5nLnZhbHVlO1xuICAgICAgcmV0dXJuIHsgLi4ub2ZmZXJpbmcsIHJlYWR5OiBmYWxzZSB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=