@dcl/asset-packs 2.3.0 → 2.3.2-20250506093725.commit-19a869d

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 (62) hide show
  1. package/bin/index.js +3744 -1611
  2. package/catalog.json +127 -1
  3. package/dist/admin-toolkit-ui/Active.d.ts +11 -0
  4. package/dist/admin-toolkit-ui/Active.js +32 -0
  5. package/dist/admin-toolkit-ui/Button.d.ts +22 -9
  6. package/dist/admin-toolkit-ui/Button.js +45 -28
  7. package/dist/admin-toolkit-ui/Card.d.ts +6 -0
  8. package/dist/admin-toolkit-ui/Card.js +22 -0
  9. package/dist/admin-toolkit-ui/Error.d.ts +9 -0
  10. package/dist/admin-toolkit-ui/Error.js +31 -0
  11. package/dist/admin-toolkit-ui/Header.d.ts +8 -0
  12. package/dist/admin-toolkit-ui/Header.js +17 -0
  13. package/dist/admin-toolkit-ui/Loading.d.ts +11 -0
  14. package/dist/admin-toolkit-ui/Loading.js +31 -0
  15. package/dist/admin-toolkit-ui/ModerationControl/AddUserInput.d.ts +7 -0
  16. package/dist/admin-toolkit-ui/ModerationControl/AddUserInput.js +67 -0
  17. package/dist/admin-toolkit-ui/ModerationControl/AdminList.d.ts +10 -0
  18. package/dist/admin-toolkit-ui/ModerationControl/AdminList.js +192 -0
  19. package/dist/admin-toolkit-ui/ModerationControl/RemoveAdminConfirmation.d.ts +8 -0
  20. package/dist/admin-toolkit-ui/ModerationControl/RemoveAdminConfirmation.js +75 -0
  21. package/dist/admin-toolkit-ui/ModerationControl/api.d.ts +12 -0
  22. package/dist/admin-toolkit-ui/ModerationControl/api.js +28 -0
  23. package/dist/admin-toolkit-ui/ModerationControl/index.d.ts +23 -0
  24. package/dist/admin-toolkit-ui/ModerationControl/index.js +37 -0
  25. package/dist/admin-toolkit-ui/SmartItemsControl.js +34 -56
  26. package/dist/admin-toolkit-ui/TextAnnouncementsControl.js +50 -59
  27. package/dist/admin-toolkit-ui/VideoControl/LiveStream/DeleteStreamKey.d.ts +7 -0
  28. package/dist/admin-toolkit-ui/VideoControl/LiveStream/DeleteStreamKey.js +62 -0
  29. package/dist/admin-toolkit-ui/{VideoControl.d.ts → VideoControl/LiveStream/GenerateStreamKey.d.ts} +2 -3
  30. package/dist/admin-toolkit-ui/VideoControl/LiveStream/GenerateStreamKey.js +41 -0
  31. package/dist/admin-toolkit-ui/VideoControl/LiveStream/ShowStreamKey.d.ts +11 -0
  32. package/dist/admin-toolkit-ui/VideoControl/LiveStream/ShowStreamKey.js +112 -0
  33. package/dist/admin-toolkit-ui/VideoControl/LiveStream/index.d.ts +10 -0
  34. package/dist/admin-toolkit-ui/VideoControl/LiveStream/index.js +62 -0
  35. package/dist/admin-toolkit-ui/VideoControl/VideoUrl.d.ts +9 -0
  36. package/dist/admin-toolkit-ui/VideoControl/VideoUrl.js +125 -0
  37. package/dist/admin-toolkit-ui/VideoControl/VolumeControl.d.ts +8 -0
  38. package/dist/admin-toolkit-ui/VideoControl/VolumeControl.js +82 -0
  39. package/dist/admin-toolkit-ui/VideoControl/api.d.ts +12 -0
  40. package/dist/admin-toolkit-ui/VideoControl/api.js +17 -0
  41. package/dist/admin-toolkit-ui/VideoControl/index.d.ts +28 -0
  42. package/dist/admin-toolkit-ui/VideoControl/index.js +107 -0
  43. package/dist/admin-toolkit-ui/VideoControl/utils.d.ts +28 -0
  44. package/dist/admin-toolkit-ui/VideoControl/utils.js +87 -0
  45. package/dist/admin-toolkit-ui/fetch-utils.d.ts +14 -0
  46. package/dist/admin-toolkit-ui/fetch-utils.js +41 -0
  47. package/dist/admin-toolkit-ui/index.d.ts +11 -0
  48. package/dist/admin-toolkit-ui/index.js +200 -272
  49. package/dist/admin-toolkit-ui/types.d.ts +0 -2
  50. package/dist/admin-toolkit-ui/types.js +1 -1
  51. package/dist/admin-toolkit-ui/utils.d.ts +10 -2
  52. package/dist/admin-toolkit-ui/utils.js +31 -51
  53. package/dist/bin/index.js +3744 -1611
  54. package/dist/definitions.d.ts +18 -17
  55. package/dist/definitions.js +12 -10
  56. package/dist/enums.d.ts +5 -0
  57. package/dist/enums.js +7 -1
  58. package/dist/id.d.ts +2 -4
  59. package/dist/scene-entrypoint.js +1 -1
  60. package/dist/triggers.js +15 -10
  61. package/package.json +6 -6
  62. package/dist/admin-toolkit-ui/VideoControl.js +0 -297
@@ -1,297 +0,0 @@
1
- import ReactEcs, { Label, UiEntity, Input, Dropdown } from '@dcl/react-ecs';
2
- import { Color4 } from '@dcl/sdk/math';
3
- import { getComponents } from '../definitions';
4
- import { getExplorerComponents } from '../components';
5
- import { getScaleUIFactor } from '../ui';
6
- import { nextTickFunctions } from './index';
7
- import { Button } from './Button';
8
- import { CONTENT_URL } from './constants';
9
- const ICONS = {
10
- VIDEO_CONTROL: `${CONTENT_URL}/admin_toolkit/assets/icons/video-control.png`,
11
- PREVIOUS_BUTTON: `${CONTENT_URL}/admin_toolkit/assets/icons/video-control-previous-button.png`,
12
- FORWARD_BUTTON: `${CONTENT_URL}/admin_toolkit/assets/icons/video-control-forward-button.png`,
13
- PLAY_BUTTON: `${CONTENT_URL}/admin_toolkit/assets/icons/video-control-play-button.png`,
14
- VOLUME_MINUS_BUTTON: `${CONTENT_URL}/admin_toolkit/assets/icons/video-control-volume-minus-button.png`,
15
- VOLUME_PLUS_BUTTON: `${CONTENT_URL}/admin_toolkit/assets/icons/video-control-volume-plus-button.png`,
16
- };
17
- const DROPDOWN_BACKGROUND = `${CONTENT_URL}/admin_toolkit/backgrounds/dropdown-background.png`;
18
- const VOLUME_STEP = 0.1;
19
- const MAX_VOLUME = 1;
20
- const DEFAULT_VOLUME = 1;
21
- const COLORS = {
22
- WHITE: Color4.White(),
23
- GRAY: Color4.create(160 / 255, 155 / 255, 168 / 255, 1),
24
- };
25
- function getAdminToolkitVideoControl(engine) {
26
- const { AdminTools } = getComponents(engine);
27
- const adminToolkitEntities = Array.from(engine.getEntitiesWith(AdminTools));
28
- return adminToolkitEntities.length > 0
29
- ? adminToolkitEntities[0][1].videoControl
30
- : null;
31
- }
32
- function getVideoPlayers(engine) {
33
- const adminToolkitVideoControl = getAdminToolkitVideoControl(engine);
34
- if (!adminToolkitVideoControl ||
35
- !adminToolkitVideoControl.videoPlayers ||
36
- adminToolkitVideoControl.videoPlayers.length === 0)
37
- return [];
38
- return Array.from(adminToolkitVideoControl.videoPlayers);
39
- }
40
- function createVideoPlayerControls(engine, state) {
41
- const videoControl = getAdminToolkitVideoControl(engine);
42
- return {
43
- play: () => updateVideoPlayerProps(engine, state, 'playing', true),
44
- pause: () => updateVideoPlayerProps(engine, state, 'playing', false),
45
- restart: () => {
46
- updateVideoPlayerProps(engine, state, 'playing', false);
47
- nextTickFunctions.push(() => {
48
- updateVideoPlayerProps(engine, state, 'position', -1);
49
- });
50
- nextTickFunctions.push(() => {
51
- updateVideoPlayerProps(engine, state, 'playing', true);
52
- });
53
- nextTickFunctions.push(() => {
54
- updateVideoPlayerProps(engine, state, 'position', undefined);
55
- });
56
- },
57
- previous: () => {
58
- console.log('TODO: Previous Track clicked');
59
- },
60
- next: () => {
61
- console.log('TODO: Next Track clicked');
62
- },
63
- setVolume: (volume) => {
64
- if (videoControl?.disableVideoPlayersSound) {
65
- return;
66
- }
67
- updateVideoPlayerProps(engine, state, 'volume', volume);
68
- },
69
- setSource: (url) => updateVideoPlayerProps(engine, state, 'src', url),
70
- };
71
- }
72
- function updateVideoPlayerProps(engine, state, property, value) {
73
- const { VideoPlayer } = getExplorerComponents(engine);
74
- const videoControl = getAdminToolkitVideoControl(engine);
75
- const players = getVideoPlayers(engine);
76
- if (property === 'playing' &&
77
- value === true &&
78
- videoControl?.disableVideoPlayersSound) {
79
- players.forEach((player) => {
80
- const videoSource = VideoPlayer.getMutableOrNull(player.entity);
81
- if (!videoSource)
82
- return;
83
- updateVideoSourceProperty(videoSource, 'volume', 0);
84
- updateVideoPlayerControlState(engine, state, player.entity, 'volume', 0);
85
- });
86
- }
87
- const selectedPlayerEntity = players[state.videoControl.selectedVideoPlayer ?? 0].entity;
88
- const selectedPlayer = VideoPlayer.getMutableOrNull(selectedPlayerEntity);
89
- if (!selectedPlayer)
90
- return;
91
- updateVideoSourceProperty(selectedPlayer, property, value);
92
- updateVideoPlayerControlState(engine, state, selectedPlayerEntity, property, value);
93
- }
94
- function updateVideoSourceProperty(videoSource, property, value) {
95
- if (property === 'volume') {
96
- if (!value) {
97
- videoSource.volume = 0;
98
- return;
99
- }
100
- const steps = Math.round((videoSource.volume ?? DEFAULT_VOLUME) * 10);
101
- const newSteps = Math.max(0, Math.min(10, steps + value * 10));
102
- videoSource.volume = newSteps / 10;
103
- }
104
- else {
105
- videoSource[property] = value;
106
- }
107
- }
108
- function updateVideoPlayerControlState(engine, state, selectedPlayerEntity, property, value) {
109
- const { VideoControlState } = getComponents(engine);
110
- const videoControlState = VideoControlState.getMutable(state.adminToolkitUiEntity);
111
- const videoPlayerControlState = videoControlState.videoPlayers?.find((player) => player.entity === selectedPlayerEntity);
112
- if (!!videoPlayerControlState) {
113
- updateVideoSourceProperty(videoPlayerControlState, property, value);
114
- }
115
- }
116
- function VideoPlayerSelector({ engine, state, }) {
117
- const videoPlayers = getVideoPlayers(engine);
118
- const scaleFactor = getScaleUIFactor(engine);
119
- if (videoPlayers.length <= 1)
120
- return null;
121
- if (videoPlayers.length > 4) {
122
- return (ReactEcs.createElement(UiEntity, { uiTransform: {
123
- flexDirection: 'row',
124
- margin: { bottom: 16 * scaleFactor },
125
- } },
126
- ReactEcs.createElement(Dropdown, { options: videoPlayers.map((player) => player.customName), selectedIndex: state.videoControl.selectedVideoPlayer ?? 0, onChange: (idx) => (state.videoControl.selectedVideoPlayer = idx), textAlign: "middle-left", fontSize: 14 * scaleFactor, uiTransform: {
127
- margin: { right: 8 * scaleFactor },
128
- minWidth: 150 * scaleFactor,
129
- }, uiBackground: { color: Color4.White() } })));
130
- }
131
- return (ReactEcs.createElement(UiEntity, { uiTransform: {
132
- flexDirection: 'row',
133
- margin: { bottom: 16 * scaleFactor },
134
- } }, videoPlayers.map((player, idx) => {
135
- const isPlayerSelected = (state.videoControl.selectedVideoPlayer ?? 0) === idx;
136
- const playerName = player.customName ?? `#${idx + 1}`;
137
- return (ReactEcs.createElement(Button, { id: `video_control_player_${idx}`, key: player.entity, value: `<b>${playerName}</b>`, fontSize: 14 * scaleFactor, variant: isPlayerSelected ? 'primary' : 'secondary', color: isPlayerSelected ? Color4.Black() : Color4.White(), onMouseDown: () => {
138
- state.videoControl.selectedVideoPlayer = idx;
139
- }, uiTransform: {
140
- alignItems: 'center',
141
- justifyContent: 'center',
142
- alignSelf: 'center',
143
- margin: { right: 8 * scaleFactor },
144
- }, labelTransform: {
145
- padding: 4 * scaleFactor,
146
- } }));
147
- })));
148
- }
149
- function useSelectedVideoPlayer(engine, state) {
150
- const { VideoPlayer } = getExplorerComponents(engine);
151
- const videoPlayers = getVideoPlayers(engine);
152
- if (videoPlayers.length === 0)
153
- return null;
154
- return VideoPlayer.getOrNull(videoPlayers[state.videoControl.selectedVideoPlayer ?? 0].entity);
155
- }
156
- function VideoControlVolume({ engine, state, }) {
157
- const scaleFactor = getScaleUIFactor(engine);
158
- const controls = createVideoPlayerControls(engine, state);
159
- const selectedVideoPlayer = useSelectedVideoPlayer(engine, state);
160
- const videoControl = getAdminToolkitVideoControl(engine);
161
- const isSoundDisabled = videoControl?.disableVideoPlayersSound;
162
- const volumePercentage = `${Math.round((selectedVideoPlayer?.volume ?? DEFAULT_VOLUME) * 100)}%`;
163
- return !isSoundDisabled ? (ReactEcs.createElement(UiEntity, { uiTransform: {
164
- flexDirection: 'column',
165
- } },
166
- ReactEcs.createElement(Label, { value: 'Video Volume', fontSize: 16 * scaleFactor, color: COLORS.WHITE, uiTransform: {
167
- margin: { top: 0, right: 0, bottom: 10 * scaleFactor, left: 0 },
168
- } }),
169
- ReactEcs.createElement(UiEntity, { uiTransform: {
170
- flexDirection: 'row',
171
- } },
172
- ReactEcs.createElement(Button, { id: "video_control_volume_minus", value: "Minus", fontSize: 14 * scaleFactor, uiTransform: {
173
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
174
- minWidth: 69 * scaleFactor,
175
- alignItems: 'center',
176
- justifyContent: 'center',
177
- padding: 0,
178
- }, icon: ICONS.VOLUME_MINUS_BUTTON, onlyIcon: true, iconTransform: {
179
- width: 35 * scaleFactor,
180
- height: 35 * scaleFactor,
181
- }, onMouseDown: () => controls.setVolume(-VOLUME_STEP), disabled: !selectedVideoPlayer }),
182
- ReactEcs.createElement(Label, { value: volumePercentage, fontSize: 18 * scaleFactor, color: COLORS.GRAY, uiTransform: {
183
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
184
- minWidth: 69 * scaleFactor,
185
- alignItems: 'center',
186
- justifyContent: 'center',
187
- padding: 0,
188
- } }),
189
- ReactEcs.createElement(Button, { id: "video_control_volume_plus", value: "Plus", fontSize: 14 * scaleFactor, icon: ICONS.VOLUME_PLUS_BUTTON, onlyIcon: true, iconTransform: {
190
- width: 35 * scaleFactor,
191
- height: 35 * scaleFactor,
192
- }, uiTransform: {
193
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
194
- minWidth: 69 * scaleFactor,
195
- alignItems: 'center',
196
- justifyContent: 'center',
197
- padding: 0,
198
- }, onMouseDown: () => controls.setVolume(VOLUME_STEP), disabled: !selectedVideoPlayer }),
199
- ReactEcs.createElement(Button, { id: "video_control_volume_mute", value: "<b>Mute</b>", fontSize: 18 * scaleFactor, labelTransform: { margin: '0 20' }, uiTransform: {
200
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
201
- minWidth: 69 * scaleFactor,
202
- alignItems: 'center',
203
- justifyContent: 'center',
204
- padding: 0,
205
- }, onMouseDown: () => controls.setVolume(0), disabled: !selectedVideoPlayer })))) : null;
206
- }
207
- export function VideoControl({ engine, state, }) {
208
- const controls = createVideoPlayerControls(engine, state);
209
- const selectedVideoPlayer = useSelectedVideoPlayer(engine, state);
210
- const scaleFactor = getScaleUIFactor(engine);
211
- return (ReactEcs.createElement(UiEntity, { uiTransform: {
212
- width: '100%',
213
- height: '100%',
214
- flexDirection: 'column',
215
- } },
216
- ReactEcs.createElement(UiEntity, { uiTransform: {
217
- flexDirection: 'row',
218
- margin: { bottom: 10 * scaleFactor },
219
- height: 30 * scaleFactor,
220
- } },
221
- ReactEcs.createElement(UiEntity, { uiTransform: { width: 30 * scaleFactor, height: 30 * scaleFactor }, uiBackground: {
222
- textureMode: 'stretch',
223
- texture: {
224
- src: ICONS.VIDEO_CONTROL,
225
- },
226
- } }),
227
- ReactEcs.createElement(Label, { value: "<b>Video Control</b>", uiTransform: { margin: { bottom: 8, left: 20 } }, fontSize: 24 * scaleFactor, color: Color4.White() })),
228
- ReactEcs.createElement(Label, { value: "<b>Current Screen</b>", fontSize: 16 * scaleFactor, color: Color4.White(), uiTransform: { margin: { bottom: 16 * scaleFactor } } }),
229
- ReactEcs.createElement(VideoPlayerSelector, { engine: engine, state: state }),
230
- ReactEcs.createElement(Input, { onSubmit: (value) => {
231
- state.videoControl.shareScreenUrl = value;
232
- handleShareScreenUrl(engine, state, value);
233
- }, onChange: ($) => (state.videoControl.shareScreenUrl = $), fontSize: 16 * scaleFactor, placeholder: "Paste your video URL", placeholderColor: Color4.create(160 / 255, 155 / 255, 168 / 255, 1), color: Color4.Black(), uiBackground: { color: Color4.White() }, uiTransform: {
234
- width: '100%',
235
- height: 80 * scaleFactor,
236
- } }),
237
- ReactEcs.createElement(UiEntity, { uiTransform: {
238
- width: '100%',
239
- height: 40 * scaleFactor,
240
- flexDirection: 'row',
241
- justifyContent: 'flex-end',
242
- margin: { top: 10 * scaleFactor },
243
- } },
244
- ReactEcs.createElement(Button, { id: "video_control_share_screen_clear", value: "<b>Clear Screen</b>", variant: "text", fontSize: 16 * scaleFactor, color: Color4.White(), uiTransform: { margin: { right: 8 * scaleFactor } }, onMouseDown: () => {
245
- state.videoControl.shareScreenUrl = undefined;
246
- } }),
247
- ReactEcs.createElement(Button, { id: "video_control_share_screen_share", value: "<b>Share</b>", labelTransform: { margin: '0 20' }, fontSize: 16 * scaleFactor, onMouseDown: () => {
248
- handleShareScreenUrl(engine, state, state.videoControl.shareScreenUrl);
249
- }, disabled: !selectedVideoPlayer })),
250
- ReactEcs.createElement(Label, { value: "Video Playback", fontSize: 16 * scaleFactor, color: Color4.White(), uiTransform: { margin: { bottom: 10 * scaleFactor } } }),
251
- ReactEcs.createElement(UiEntity, { uiTransform: {
252
- flexDirection: 'row',
253
- width: '100%',
254
- margin: { bottom: 10 * scaleFactor },
255
- } },
256
- ReactEcs.createElement(Button, { id: "video_control_play", value: "<b>Play</b>", fontSize: 18 * scaleFactor, labelTransform: { margin: { right: 20 } }, uiTransform: {
257
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
258
- minWidth: 69 * scaleFactor,
259
- alignItems: 'center',
260
- justifyContent: 'center',
261
- padding: 0,
262
- }, icon: ICONS.PLAY_BUTTON, iconTransform: {
263
- width: 35 * scaleFactor,
264
- height: 35 * scaleFactor,
265
- }, onMouseDown: () => {
266
- controls.play();
267
- }, disabled: !selectedVideoPlayer }),
268
- ReactEcs.createElement(Button, { id: "video_control_pause", value: "<b>Pause</b>", fontSize: 18 * scaleFactor, labelTransform: { margin: '0 20' }, uiTransform: {
269
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
270
- minWidth: 69 * scaleFactor,
271
- alignItems: 'center',
272
- justifyContent: 'center',
273
- padding: 0,
274
- }, onMouseDown: () => {
275
- controls.pause();
276
- }, disabled: !selectedVideoPlayer }),
277
- ReactEcs.createElement(Button, { id: "video_control_restart", value: "<b>Restart</b>", labelTransform: { margin: '0 20' }, fontSize: 18 * scaleFactor, uiTransform: {
278
- margin: { top: 0, right: 16 * scaleFactor, bottom: 0, left: 0 },
279
- minWidth: 69 * scaleFactor,
280
- alignItems: 'center',
281
- justifyContent: 'center',
282
- padding: 0,
283
- }, onMouseDown: () => {
284
- controls.restart();
285
- }, disabled: !selectedVideoPlayer })),
286
- ReactEcs.createElement(VideoControlVolume, { engine: engine, state: state })));
287
- }
288
- function handleShareScreenUrl(engine, state, url) {
289
- if (!url)
290
- return;
291
- const controls = createVideoPlayerControls(engine, state);
292
- controls.setSource(url);
293
- nextTickFunctions.push(() => {
294
- controls.play();
295
- });
296
- }
297
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlkZW9Db250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkbWluLXRvb2xraXQtdWkvVmlkZW9Db250cm9sLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUl6QyxNQUFNLEtBQUssR0FBRztJQUNaLGFBQWEsRUFBRSxHQUFHLFdBQVcsK0NBQStDO0lBQzVFLGVBQWUsRUFBRSxHQUFHLFdBQVcsK0RBQStEO0lBQzlGLGNBQWMsRUFBRSxHQUFHLFdBQVcsOERBQThEO0lBQzVGLFdBQVcsRUFBRSxHQUFHLFdBQVcsMkRBQTJEO0lBQ3RGLG1CQUFtQixFQUFFLEdBQUcsV0FBVyxtRUFBbUU7SUFDdEcsa0JBQWtCLEVBQUUsR0FBRyxXQUFXLGtFQUFrRTtDQUM1RixDQUFBO0FBRVYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLFdBQVcsb0RBQW9ELENBQUE7QUFFOUYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFBO0FBQ3ZCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQTtBQUNwQixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUE7QUFFeEIsTUFBTSxNQUFNLEdB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QyxRQUFRLEVBQUUsRUFBRSxHQUFHLFdBQVcsRUFDMUIsV0FBVyxFQUFFO29CQUNYLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO29CQUMvRCxRQUFRLEVBQUUsRUFBRSxHQUFHLFdBQVc7b0JBQzFCLFVBQVUsRUFBRSxRQUFRO29CQUNwQixjQUFjLEVBQUUsUUFBUTtvQkFDeEIsT0FBTyxFQUFFLENBQUM7aUJBQ1gsRUFDRCxXQUFXLEVBQUUsR0FBRyxFQUFFO29CQUNoQixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBQ3BCLENBQUMsRUFDRCxRQUFRLEVBQUUsQ0FBQyxtQkFBbUIsR0FDOUIsQ0F1Qk87UUFFWCx1QkFBQyxrQkFBa0IsSUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUksQ0FDM0MsQ0FDWixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsTUFBZSxFQUFFLEtBQVksRUFBRSxHQUFZO0lBQ3ZFLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTTtJQUVoQixNQUFNLFFBQVEsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDekQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN2QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQzFCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNqQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIElFbmdpbmUsIFBCVmlkZW9QbGF5ZXIgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCBSZWFjdEVjcywgeyBMYWJlbCwgVWlFbnRpdHksIElucHV0LCBEcm9wZG93biB9IGZyb20gJ0BkY2wvcmVhY3QtZWNzJ1xuaW1wb3J0IHsgQ29sb3I0IH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcbmltcG9ydCB7IGdldENvbXBvbmVudHMgfSBmcm9tICcuLi9kZWZpbml0aW9ucydcbmltcG9ydCB7IGdldEV4cGxvcmVyQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvbXBvbmVudHMnXG5pbXBvcnQgeyBnZXRTY2FsZVVJRmFjdG9yIH0gZnJvbSAnLi4vdWknXG5pbXBvcnQgeyBuZXh0VGlja0Z1bmN0aW9ucyB9IGZyb20gJy4vaW5kZXgnXG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbidcbmltcG9ydCB7IENPTlRFTlRfVVJMIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gJy4vdHlwZXMnXG5cbi8vIENvbnN0YW50c1xuY29uc3QgSUNPTlMgPSB7XG4gIFZJREVPX0NPTlRST0w6IGAke0NPTlRFTlRfVVJMfS9hZG1pbl90b29sa2l0L2Fzc2V0cy9pY29ucy92aWRlby1jb250cm9sLnBuZ2AsXG4gIFBSRVZJT1VTX0JVVFRPTjogYCR7Q09OVEVOVF9VUkx9L2FkbWluX3Rvb2xraXQvYXNzZXRzL2ljb25zL3ZpZGVvLWNvbnRyb2wtcHJldmlvdXMtYnV0dG9uLnBuZ2AsXG4gIEZPUldBUkRfQlVUVE9OOiBgJHtDT05URU5UX1VSTH0vYWRtaW5fdG9vbGtpdC9hc3NldHMvaWNvbnMvdmlkZW8tY29udHJvbC1mb3J3YXJkLWJ1dHRvbi5wbmdgLFxuICBQTEFZX0JVVFRPTjogYCR7Q09OVEVOVF9VUkx9L2FkbWluX3Rvb2xraXQvYXNzZXRzL2ljb25zL3ZpZGVvLWNvbnRyb2wtcGxheS1idXR0b24ucG5nYCxcbiAgVk9MVU1FX01JTlVTX0JVVFRPTjogYCR7Q09OVEVOVF9VUkx9L2FkbWluX3Rvb2xraXQvYXNzZXRzL2ljb25zL3ZpZGVvLWNvbnRyb2wtdm9sdW1lLW1pbnVzLWJ1dHRvbi5wbmdgLFxuICBWT0xVTUVfUExVU19CVVRUT046IGAke0NPTlRFTlRfVVJMfS9hZG1pbl90b29sa2l0L2Fzc2V0cy9pY29ucy92aWRlby1jb250cm9sLXZvbHVtZS1wbHVzLWJ1dHRvbi5wbmdgLFxufSBhcyBjb25zdFxuXG5jb25zdCBEUk9QRE9XTl9CQUNLR1JPVU5EID0gYCR7Q09OVEVOVF9VUkx9L2FkbWluX3Rvb2xraXQvYmFja2dyb3VuZHMvZHJvcGRvd24tYmFja2dyb3VuZC5wbmdgXG5cbmNvbnN0IFZPTFVNRV9TVEVQID0gMC4xXG5jb25zdCBNQVhfVk9MVU1FID0gMVxuY29uc3QgREVGQVVMVF9WT0xVTUUgPSAxXG5cbmNvbnN0IENPTE9SUyA9IHtcbiAgV0hJVEU6IENvbG9yNC5XaGl0ZSgpLFxuICBHUkFZOiBDb2xvcjQuY3JlYXRlKDE2MCAvIDI1NSwgMTU1IC8gMjU1LCAxNjggLyAyNTUsIDEpLFxufSBhcyBjb25zdFxuXG4vLyBUeXBlc1xuaW50ZXJmYWNlIFZpZGVvUGxheWVyQ29udHJvbHMge1xuICBwbGF5OiAoKSA9PiB2b2lkXG4gIHBhdXNlOiAoKSA9PiB2b2lkXG4gIHJlc3RhcnQ6ICgpID0+IHZvaWRcbiAgcHJldmlvdXM6ICgpID0+IHZvaWRcbiAgbmV4dDogKCkgPT4gdm9pZFxuICBzZXRWb2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gdm9pZFxuICBzZXRTb3VyY2U6ICh1cmw6IHN0cmluZykgPT4gdm9pZFxufVxuXG5mdW5jdGlvbiBnZXRBZG1pblRvb2xraXRWaWRlb0NvbnRyb2woZW5naW5lOiBJRW5naW5lKSB7XG4gIGNvbnN0IHsgQWRtaW5Ub29scyB9ID0gZ2V0Q29tcG9uZW50cyhlbmdpbmUpXG4gIGNvbnN0IGFkbWluVG9vbGtpdEVudGl0aWVzID0gQXJyYXkuZnJvbShlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKEFkbWluVG9vbHMpKVxuICByZXR1cm4gYWRtaW5Ub29sa2l0RW50aXRpZXMubGVuZ3RoID4gMFxuICAgID8gYWRtaW5Ub29sa2l0RW50aXRpZXNbMF1bMV0udmlkZW9Db250cm9sXG4gICAgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGdldFZpZGVvUGxheWVycyhlbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgYWRtaW5Ub29sa2l0VmlkZW9Db250cm9sID0gZ2V0QWRtaW5Ub29sa2l0VmlkZW9Db250cm9sKGVuZ2luZSlcblxuICBpZiAoXG4gICAgIWFkbWluVG9vbGtpdFZpZGVvQ29udHJvbCB8fFxuICAgICFhZG1pblRvb2xraXRWaWRlb0NvbnRyb2wudmlkZW9QbGF5ZXJzIHx8XG4gICAgYWRtaW5Ub29sa2l0VmlkZW9Db250cm9sLnZpZGVvUGxheWVycy5sZW5ndGggPT09IDBcbiAgKVxuICAgIHJldHVybiBbXVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGFkbWluVG9vbGtpdFZpZGVvQ29udHJvbC52aWRlb1BsYXllcnMpXG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbnNcbmZ1bmN0aW9uIGNyZWF0ZVZpZGVvUGxheWVyQ29udHJvbHMoXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc3RhdGU6IFN0YXRlLFxuKTogVmlkZW9QbGF5ZXJDb250cm9scyB7XG4gIGNvbnN0IHZpZGVvQ29udHJvbCA9IGdldEFkbWluVG9vbGtpdFZpZGVvQ29udHJvbChlbmdpbmUpXG5cbiAgcmV0dXJuIHtcbiAgICBwbGF5OiAoKSA9PiB1cGRhdGVWaWRlb1BsYXllclByb3BzKGVuZ2luZSwgc3RhdGUsICdwbGF5aW5nJywgdHJ1ZSksXG4gICAgcGF1c2U6ICgpID0+IHVwZGF0ZVZpZGVvUGxheWVyUHJvcHMoZW5naW5lLCBzdGF0ZSwgJ3BsYXlpbmcnLCBmYWxzZSksXG4gICAgcmVzdGFydDogKCkgPT4ge1xuICAgICAgdXBkYXRlVmlkZW9QbGF5ZXJQcm9wcyhlbmdpbmUsIHN0YXRlLCAncGxheWluZycsIGZhbHNlKVxuICAgICAgbmV4dFRpY2tGdW5jdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVZpZGVvUGxheWVyUHJvcHMoZW5naW5lLCBzdGF0ZSwgJ3Bvc2l0aW9uJywgLTEpXG4gICAgICB9KVxuICAgICAgbmV4dFRpY2tGdW5jdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVZpZGVvUGxheWVyUHJvcHMoZW5naW5lLCBzdGF0ZSwgJ3BsYXlpbmcnLCB0cnVlKVxuICAgICAgfSlcbiAgICAgIG5leHRUaWNrRnVuY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICB1cGRhdGVWaWRlb1BsYXllclByb3BzKGVuZ2luZSwgc3RhdGUsICdwb3NpdGlvbicsIHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSxcbiAgICBwcmV2aW91czogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1RPRE86IFByZXZpb3VzIFRyYWNrIGNsaWNrZWQnKVxuICAgIH0sXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1RPRE86IE5leHQgVHJhY2sgY2xpY2tlZCcpXG4gICAgfSxcbiAgICBzZXRWb2x1bWU6ICh2b2x1bWUpID0+IHtcbiAgICAgIC8vIERvbid0IGFsbG93IHZvbHVtZSBjaGFuZ2VzIGlmIHNvdW5kIGlzIGRpc2FibGVkXG4gICAgICBpZiAodmlkZW9Db250cm9sPy5kaXNhYmxlVmlkZW9QbGF5ZXJzU291bmQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB1cGRhdGVWaWRlb1BsYXllclByb3BzKGVuZ2luZSwgc3RhdGUsICd2b2x1bWUnLCB2b2x1bWUpXG4gICAgfSxcbiAgICBzZXRTb3VyY2U6ICh1cmwpID0+IHVwZGF0ZVZpZGVvUGxheWVyUHJvcHMoZW5naW5lLCBzdGF0ZSwgJ3NyYycsIHVybCksXG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVmlkZW9QbGF5ZXJQcm9wczxLIGV4dGVuZHMga2V5b2YgUEJWaWRlb1BsYXllcj4oXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc3RhdGU6IFN0YXRlLFxuICBwcm9wZXJ0eTogSyxcbiAgdmFsdWU6IFBCVmlkZW9QbGF5ZXJbS10sXG4pIHtcbiAgY29uc3QgeyBWaWRlb1BsYXllciB9ID0gZ2V0RXhwbG9yZXJDb21wb25lbnRzKGVuZ2luZSlcbiAgY29uc3QgdmlkZW9Db250cm9sID0gZ2V0QWRtaW5Ub29sa2l0VmlkZW9Db250cm9sKGVuZ2luZSlcbiAgY29uc3QgcGxheWVycyA9IGdldFZpZGVvUGxheWVycyhlbmdpbmUpXG5cbiAgLy8gSWYgc291bmQgaXMgZGlzYWJsZWQgYW5kIHdlJ3JlIHVwZGF0aW5nIHRoZSAncGxheWluZycgcHJvcGVydHkgdG8gdHJ1ZSxcbiAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdm9sdW1lIGlzIDBcbiAgaWYgKFxuICAgIHByb3BlcnR5ID09PSAncGxheWluZycgJiZcbiAgICB2YWx1ZSA9PT0gdHJ1ZSAmJlxuICAgIHZpZGVvQ29udHJvbD8uZGlzYWJsZVZpZGVvUGxheWVyc1NvdW5kXG4gICkge1xuICAgIHBsYXllcnMuZm9yRWFjaCgocGxheWVyKSA9PiB7XG4gICAgICBjb25zdCB2aWRlb1NvdXJjZSA9IFZpZGVvUGxheWVyLmdldE11dGFibGVPck51bGwocGxheWVyLmVudGl0eSBhcyBFbnRpdHkpXG4gICAgICBpZiAoIXZpZGVvU291cmNlKSByZXR1cm5cbiAgICAgIHVwZGF0ZVZpZGVvU291cmNlUHJvcGVydHkodmlkZW9Tb3VyY2UsICd2b2x1bWUnLCAwKVxuICAgICAgdXBkYXRlVmlkZW9QbGF5ZXJDb250cm9sU3RhdGUoXG4gICAgICAgIGVuZ2luZSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBsYXllci5lbnRpdHkgYXMgRW50aXR5LFxuICAgICAgICAndm9sdW1lJyxcbiAgICAgICAgMCxcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gVE9ETzogTmVlZHMgdG8gYmUgcmVkZWZpbmVkIHRoZSBsaW5rIGFsbCBmZWF0dXJlXG4gIC8vIGNvbnN0IGxpbmtBbGxWaWRlb1BsYXllcnMgPVxuICAvLyAgIHN0YXRlLnZpZGVvQ29udHJvbC5saW5rQWxsVmlkZW9QbGF5ZXJzID8/IHZpZGVvQ29udHJvbD8ubGlua0FsbFZpZGVvUGxheWVyc1xuICAvLyBpZiAobGlua0FsbFZpZGVvUGxheWVycykge1xuICAvLyAgIC8vIEFwcGx5IHRvIGFsbCBwbGF5ZXJzXG4gIC8vICAgcGxheWVycy5mb3JFYWNoKChwbGF5ZXIpID0+IHtcbiAgLy8gICAgIGNvbnN0IHZpZGVvU291cmNlID0gVmlkZW9QbGF5ZXIuZ2V0TXV0YWJsZU9yTnVsbChwbGF5ZXIuZW50aXR5IGFzIEVudGl0eSlcbiAgLy8gICAgIGlmICghdmlkZW9Tb3VyY2UpIHJldHVyblxuICAvLyAgICAgdXBkYXRlVmlkZW9Tb3VyY2VQcm9wZXJ0eSh2aWRlb1NvdXJjZSwgcHJvcGVydHksIHZhbHVlKVxuXG4gIC8vICAgICB1cGRhdGVWaWRlb1BsYXllckNvbnRyb2xTdGF0ZShcbiAgLy8gICAgICAgZW5naW5lLFxuICAvLyAgICAgICBzdGF0ZSxcbiAgLy8gICAgICAgcGxheWVyLmVudGl0eSBhcyBFbnRpdHksXG4gIC8vICAgICAgIHByb3BlcnR5LFxuICAvLyAgICAgICB2YWx1ZSxcbiAgLy8gICAgIClcbiAgLy8gICB9KVxuICAvLyAgIHJldHVyblxuICAvLyB9XG5cbiAgLy8gQXBwbHkgdG8gc2VsZWN0ZWQgcGxheWVyIG9ubHlcbiAgY29uc3Qgc2VsZWN0ZWRQbGF5ZXJFbnRpdHkgPSBwbGF5ZXJzW1xuICAgIHN0YXRlLnZpZGVvQ29udHJvbC5zZWxlY3RlZFZpZGVvUGxheWVyID8/IDBcbiAgXS5lbnRpdHkgYXMgRW50aXR5XG4gIGNvbnN0IHNlbGVjdGVkUGxheWVyID0gVmlkZW9QbGF5ZXIuZ2V0TXV0YWJsZU9yTnVsbChzZWxlY3RlZFBsYXllckVudGl0eSlcbiAgaWYgKCFzZWxlY3RlZFBsYXllcikgcmV0dXJuXG5cbiAgdXBkYXRlVmlkZW9Tb3VyY2VQcm9wZXJ0eShzZWxlY3RlZFBsYXllciwgcHJvcGVydHksIHZhbHVlKVxuXG4gIHVwZGF0ZVZpZGVvUGxheWVyQ29udHJvbFN0YXRlKFxuICAgIGVuZ2luZSxcbiAgICBzdGF0ZSxcbiAgICBzZWxlY3RlZFBsYXllckVudGl0eSxcbiAgICBwcm9wZXJ0eSxcbiAgICB2YWx1ZSxcbiAgKVxufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIGEgdmlkZW8gc291cmNlIHByb3BlcnR5XG5mdW5jdGlvbiB1cGRhdGVWaWRlb1NvdXJjZVByb3BlcnR5PEsgZXh0ZW5kcyBrZXlvZiBQQlZpZGVvUGxheWVyPihcbiAgdmlkZW9Tb3VyY2U6IFBCVmlkZW9QbGF5ZXIsXG4gIHByb3BlcnR5OiBLLFxuICB2YWx1ZTogUEJWaWRlb1BsYXllcltLXSxcbikge1xuICBpZiAocHJvcGVydHkgPT09ICd2b2x1bWUnKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdmlkZW9Tb3VyY2Uudm9sdW1lID0gMFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcHMgPSBNYXRoLnJvdW5kKCh2aWRlb1NvdXJjZS52b2x1bWUgPz8gREVGQVVMVF9WT0xVTUUpICogMTApXG4gICAgY29uc3QgbmV3U3RlcHMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMCwgc3RlcHMgKyAodmFsdWUgYXMgbnVtYmVyKSAqIDEwKSlcbiAgICB2aWRlb1NvdXJjZS52b2x1bWUgPSBuZXdTdGVwcyAvIDEwXG4gIH0gZWxzZSB7XG4gICAgdmlkZW9Tb3VyY2VbcHJvcGVydHldID0gdmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVWaWRlb1BsYXllckNvbnRyb2xTdGF0ZTxLIGV4dGVuZHMga2V5b2YgUEJWaWRlb1BsYXllcj4oXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc3RhdGU6IFN0YXRlLFxuICBzZWxlY3RlZFBsYXllckVudGl0eTogRW50aXR5LFxuICBwcm9wZXJ0eTogSyxcbiAgdmFsdWU6IFBCVmlkZW9QbGF5ZXJbS10sXG4pIHtcbiAgY29uc3QgeyBWaWRlb0NvbnRyb2xTdGF0ZSB9ID0gZ2V0Q29tcG9uZW50cyhlbmdpbmUpXG4gIGNvbnN0IHZpZGVvQ29udHJvbFN0YXRlID0gVmlkZW9Db250cm9sU3RhdGUuZ2V0TXV0YWJsZShcbiAgICBzdGF0ZS5hZG1pblRvb2xraXRVaUVudGl0eSxcbiAgKVxuICBjb25zdCB2aWRlb1BsYXllckNvbnRyb2xTdGF0ZSA9IHZpZGVvQ29udHJvbFN0YXRlLnZpZGVvUGxheWVycz8uZmluZChcbiAgICAocGxheWVyKSA9PiAocGxheWVyLmVudGl0eSBhcyBFbnRpdHkpID09PSBzZWxlY3RlZFBsYXllckVudGl0eSxcbiAgKVxuICBpZiAoISF2aWRlb1BsYXllckNvbnRyb2xTdGF0ZSkge1xuICAgIHVwZGF0ZVZpZGVvU291cmNlUHJvcGVydHkodmlkZW9QbGF5ZXJDb250cm9sU3RhdGUsIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxufVxuXG4vLyBDb21wb25lbnRzXG5mdW5jdGlvbiBWaWRlb1BsYXllclNlbGVjdG9yKHtcbiAgZW5naW5lLFxuICBzdGF0ZSxcbn06IHtcbiAgZW5naW5lOiBJRW5naW5lXG4gIHN0YXRlOiBTdGF0ZVxufSkge1xuICBjb25zdCB2aWRlb1BsYXllcnMgPSBnZXRWaWRlb1BsYXllcnMoZW5naW5lKVxuICBjb25zdCBzY2FsZUZhY3RvciA9IGdldFNjYWxlVUlGYWN0b3IoZW5naW5lKVxuXG4gIGlmICh2aWRlb1BsYXllcnMubGVuZ3RoIDw9IDEpIHJldHVybiBudWxsXG5cbiAgaWYgKHZpZGVvUGxheWVycy5sZW5ndGggPiA0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgIG1hcmdpbjogeyBib3R0b206IDE2ICogc2NhbGVGYWN0b3IgfSxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPERyb3Bkb3duXG4gICAgICAgICAgb3B0aW9ucz17dmlkZW9QbGF5ZXJzLm1hcCgocGxheWVyKSA9PiBwbGF5ZXIuY3VzdG9tTmFtZSl9XG4gICAgICAgICAgc2VsZWN0ZWRJbmRleD17c3RhdGUudmlkZW9Db250cm9sLnNlbGVjdGVkVmlkZW9QbGF5ZXIgPz8gMH1cbiAgICAgICAgICBvbkNoYW5nZT17KGlkeCkgPT4gKHN0YXRlLnZpZGVvQ29udHJvbC5zZWxlY3RlZFZpZGVvUGxheWVyID0gaWR4KX1cbiAgICAgICAgICB0ZXh0QWxpZ249XCJtaWRkbGUtbGVmdFwiXG4gICAgICAgICAgZm9udFNpemU9ezE0ICogc2NhbGVGYWN0b3J9XG4gICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIG1hcmdpbjogeyByaWdodDogOCAqIHNjYWxlRmFjdG9yIH0sXG4gICAgICAgICAgICBtaW5XaWR0aDogMTUwICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgfX1cbiAgICAgICAgICB1aUJhY2tncm91bmQ9e3sgY29sb3I6IENvbG9yNC5XaGl0ZSgpIH19XG4gICAgICAgIC8+XG4gICAgICAgIHsvKiBUT0RPOiBOZWVkcyB0byBiZSByZWRlZmluZWQgdGhlIGxpbmsgYWxsIGZlYXR1cmUuICovfVxuICAgICAgICB7LyogPEJ1dHRvblxuICAgICAgICAgIGlkPVwidmlkZW9fY29udHJvbF9saW5rX2FsbFwiXG4gICAgICAgICAgdmFsdWU9XCI8Yj5MaW5rIEFsbDwvYj5cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICBmb250U2l6ZT17MTQgKiBzY2FsZUZhY3Rvcn1cbiAgICAgICAgICBjb2xvcj17Q29sb3I0LldoaXRlKCl9XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnZpZGVvQ29udHJvbC5saW5rQWxsVmlkZW9QbGF5ZXJzID0gdHJ1ZVxuICAgICAgICAgICAgc3RhdGUudmlkZW9Db250cm9sLnNlbGVjdGVkVmlkZW9QbGF5ZXIgPSB1bmRlZmluZWRcbiAgICAgICAgICB9fVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBtYXJnaW46IHsgdG9wOiAwLCByaWdodDogMTYgKiBzY2FsZUZhY3RvciwgYm90dG9tOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgICBtaW5XaWR0aDogNjkgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPiAqL31cbiAgICAgIDwvVWlFbnRpdHk+XG4gICAgKVxuICB9XG5cbiAgLy8gRm9yIDQgb3IgZmV3ZXIgcGxheWVycywgc2hvdyBudW1iZXJlZCBidXR0b25zXG4gIHJldHVybiAoXG4gICAgPFVpRW50aXR5XG4gICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgbWFyZ2luOiB7IGJvdHRvbTogMTYgKiBzY2FsZUZhY3RvciB9LFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7dmlkZW9QbGF5ZXJzLm1hcCgocGxheWVyLCBpZHgpID0+IHtcbiAgICAgICAgY29uc3QgaXNQbGF5ZXJTZWxlY3RlZCA9XG4gICAgICAgICAgKHN0YXRlLnZpZGVvQ29udHJvbC5zZWxlY3RlZFZpZGVvUGxheWVyID8/IDApID09PSBpZHhcbiAgICAgICAgY29uc3QgcGxheWVyTmFtZSA9IHBsYXllci5jdXN0b21OYW1lID8/IGAjJHtpZHggKyAxfWBcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICBpZD17YHZpZGVvX2NvbnRyb2xfcGxheWVyXyR7aWR4fWB9XG4gICAgICAgICAgICBrZXk9e3BsYXllci5lbnRpdHl9XG4gICAgICAgICAgICB2YWx1ZT17YDxiPiR7cGxheWVyTmFtZX08L2I+YH1cbiAgICAgICAgICAgIGZvbnRTaXplPXsxNCAqIHNjYWxlRmFjdG9yfVxuICAgICAgICAgICAgdmFyaWFudD17aXNQbGF5ZXJTZWxlY3RlZCA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknfVxuICAgICAgICAgICAgY29sb3I9e2lzUGxheWVyU2VsZWN0ZWQgPyBDb2xvcjQuQmxhY2soKSA6IENvbG9yNC5XaGl0ZSgpfVxuICAgICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgICAgc3RhdGUudmlkZW9Db250cm9sLnNlbGVjdGVkVmlkZW9QbGF5ZXIgPSBpZHhcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBhbGlnblNlbGY6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBtYXJnaW46IHsgcmlnaHQ6IDggKiBzY2FsZUZhY3RvciB9LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGxhYmVsVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIHBhZGRpbmc6IDQgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgfSl9XG4gICAgICB7LyogVE9ETzogTmVlZHMgdG8gYmUgcmVkZWZpbmVkIHRoZSBsaW5rIGFsbCBmZWF0dXJlLiAqL31cbiAgICAgIHsvKiA8QnV0dG9uXG4gICAgICAgIGlkPVwidmlkZW9fY29udHJvbF9saW5rX2FsbFwiXG4gICAgICAgIHZhbHVlPVwiPGI+TGluayBBbGw8L2I+XCJcbiAgICAgICAgZm9udFNpemU9ezE0ICogc2NhbGVGYWN0b3J9XG4gICAgICAgIHZhcmlhbnQ9e1xuICAgICAgICAgIHN0YXRlLnZpZGVvQ29udHJvbC5saW5rQWxsVmlkZW9QbGF5ZXJzID8gJ3ByaW1hcnknIDogJ3NlY29uZGFyeSdcbiAgICAgICAgfVxuICAgICAgICBjb2xvcj17XG4gICAgICAgICAgc3RhdGUudmlkZW9Db250cm9sLmxpbmtBbGxWaWRlb1BsYXllcnNcbiAgICAgICAgICAgID8gQ29sb3I0LkJsYWNrKClcbiAgICAgICAgICAgIDogQ29sb3I0LldoaXRlKClcbiAgICAgICAgfVxuICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgIHN0YXRlLnZpZGVvQ29udHJvbC5saW5rQWxsVmlkZW9QbGF5ZXJzID0gdHJ1ZVxuICAgICAgICAgIHN0YXRlLnZpZGVvQ29udHJvbC5zZWxlY3RlZFZpZGVvUGxheWVyID0gdW5kZWZpbmVkXG4gICAgICAgIH19XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgbWFyZ2luOiB7IHRvcDogMCwgcmlnaHQ6IDE2ICogc2NhbGVGYWN0b3IsIGJvdHRvbTogMCwgbGVmdDogMCB9LFxuICAgICAgICAgIG1pbldpZHRoOiA2OSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICB9fVxuICAgICAgLz4gKi99XG4gICAgPC9VaUVudGl0eT5cbiAgKVxufVxuXG5mdW5jdGlvbiB1c2VTZWxlY3RlZFZpZGVvUGxheWVyKGVuZ2luZTogSUVuZ2luZSwgc3RhdGU6IFN0YXRlKSB7XG4gIGNvbnN0IHsgVmlkZW9QbGF5ZXIgfSA9IGdldEV4cGxvcmVyQ29tcG9uZW50cyhlbmdpbmUpXG4gIGNvbnN0IHZpZGVvUGxheWVycyA9IGdldFZpZGVvUGxheWVycyhlbmdpbmUpXG5cbiAgaWYgKHZpZGVvUGxheWVycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG5cbiAgLy8gVE9ETzogTmVlZHMgdG8gYmUgcmVkZWZpbmVkIHRoZSBsaW5rIGFsbCBmZWF0dXJlXG4gIC8vIGNvbnN0IHZpZGVvQ29udHJvbCA9IGdldEFkbWluVG9vbGtpdFZpZGVvQ29udHJvbChlbmdpbmUpXG4gIC8vIGNvbnN0IGxpbmtBbGxWaWRlb1BsYXllcnMgPVxuICAvLyAgIHN0YXRlLnZpZGVvQ29udHJvbC5saW5rQWxsVmlkZW9QbGF5ZXJzID8/IHZpZGVvQ29udHJvbD8ubGlua0FsbFZpZGVvUGxheWVyc1xuXG4gIC8vIGlmIChsaW5rQWxsVmlkZW9QbGF5ZXJzKSB7XG4gIC8vICAgcmV0dXJuIFZpZGVvUGxheWVyLmdldE9yTnVsbCh2aWRlb1BsYXllcnNbMF0uZW50aXR5IGFzIEVudGl0eSlcbiAgLy8gfVxuXG4gIHJldHVybiBWaWRlb1BsYXllci5nZXRPck51bGwoXG4gICAgdmlkZW9QbGF5ZXJzW3N0YXRlLnZpZGVvQ29udHJvbC5zZWxlY3RlZFZpZGVvUGxheWVyID8/IDBdLmVudGl0eSBhcyBFbnRpdHksXG4gIClcbn1cblxuZnVuY3Rpb24gVmlkZW9Db250cm9sVm9sdW1lKHtcbiAgZW5naW5lLFxuICBzdGF0ZSxcbn06IHtcbiAgZW5naW5lOiBJRW5naW5lXG4gIHN0YXRlOiBTdGF0ZVxufSkge1xuICBjb25zdCBzY2FsZUZhY3RvciA9IGdldFNjYWxlVUlGYWN0b3IoZW5naW5lKVxuICBjb25zdCBjb250cm9scyA9IGNyZWF0ZVZpZGVvUGxheWVyQ29udHJvbHMoZW5naW5lLCBzdGF0ZSlcbiAgY29uc3Qgc2VsZWN0ZWRWaWRlb1BsYXllciA9IHVzZVNlbGVjdGVkVmlkZW9QbGF5ZXIoZW5naW5lLCBzdGF0ZSlcbiAgY29uc3QgdmlkZW9Db250cm9sID0gZ2V0QWRtaW5Ub29sa2l0VmlkZW9Db250cm9sKGVuZ2luZSlcbiAgY29uc3QgaXNTb3VuZERpc2FibGVkID0gdmlkZW9Db250cm9sPy5kaXNhYmxlVmlkZW9QbGF5ZXJzU291bmRcbiAgY29uc3Qgdm9sdW1lUGVyY2VudGFnZSA9IGAke01hdGgucm91bmQoKHNlbGVjdGVkVmlkZW9QbGF5ZXI/LnZvbHVtZSA/PyBERUZBVUxUX1ZPTFVNRSkgKiAxMDApfSVgXG5cbiAgcmV0dXJuICFpc1NvdW5kRGlzYWJsZWQgPyAoXG4gICAgPFVpRW50aXR5XG4gICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPExhYmVsXG4gICAgICAgIHZhbHVlPXsnVmlkZW8gVm9sdW1lJ31cbiAgICAgICAgZm9udFNpemU9ezE2ICogc2NhbGVGYWN0b3J9XG4gICAgICAgIGNvbG9yPXtDT0xPUlMuV0hJVEV9XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgbWFyZ2luOiB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMTAgKiBzY2FsZUZhY3RvciwgbGVmdDogMCB9LFxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBpZD1cInZpZGVvX2NvbnRyb2xfdm9sdW1lX21pbnVzXCJcbiAgICAgICAgICB2YWx1ZT1cIk1pbnVzXCJcbiAgICAgICAgICBmb250U2l6ZT17MTQgKiBzY2FsZUZhY3Rvcn1cbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgbWFyZ2luOiB7IHRvcDogMCwgcmlnaHQ6IDE2ICogc2NhbGVGYWN0b3IsIGJvdHRvbTogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgbWluV2lkdGg6IDY5ICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBpY29uPXtJQ09OUy5WT0xVTUVfTUlOVVNfQlVUVE9OfVxuICAgICAgICAgIG9ubHlJY29uPXt0cnVlfVxuICAgICAgICAgIGljb25UcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIHdpZHRoOiAzNSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IGNvbnRyb2xzLnNldFZvbHVtZSgtVk9MVU1FX1NURVApfVxuICAgICAgICAgIGRpc2FibGVkPXshc2VsZWN0ZWRWaWRlb1BsYXllcn1cbiAgICAgICAgLz5cbiAgICAgICAgPExhYmVsXG4gICAgICAgICAgdmFsdWU9e3ZvbHVtZVBlcmNlbnRhZ2V9XG4gICAgICAgICAgZm9udFNpemU9ezE4ICogc2NhbGVGYWN0b3J9XG4gICAgICAgICAgY29sb3I9e0NPTE9SUy5HUkFZfVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBtYXJnaW46IHsgdG9wOiAwLCByaWdodDogMTYgKiBzY2FsZUZhY3RvciwgYm90dG9tOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgICBtaW5XaWR0aDogNjkgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgaWQ9XCJ2aWRlb19jb250cm9sX3ZvbHVtZV9wbHVzXCJcbiAgICAgICAgICB2YWx1ZT1cIlBsdXNcIlxuICAgICAgICAgIGZvbnRTaXplPXsxNCAqIHNjYWxlRmFjdG9yfVxuICAgICAgICAgIGljb249e0lDT05TLlZPTFVNRV9QTFVTX0JVVFRPTn1cbiAgICAgICAgICBvbmx5SWNvbj17dHJ1ZX1cbiAgICAgICAgICBpY29uVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICB3aWR0aDogMzUgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIGhlaWdodDogMzUgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICB9fVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBtYXJnaW46IHsgdG9wOiAwLCByaWdodDogMTYgKiBzY2FsZUZhY3RvciwgYm90dG9tOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgICBtaW5XaWR0aDogNjkgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiBjb250cm9scy5zZXRWb2x1bWUoVk9MVU1FX1NURVApfVxuICAgICAgICAgIGRpc2FibGVkPXshc2VsZWN0ZWRWaWRlb1BsYXllcn1cbiAgICAgICAgLz5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIGlkPVwidmlkZW9fY29udHJvbF92b2x1bWVfbXV0ZVwiXG4gICAgICAgICAgdmFsdWU9XCI8Yj5NdXRlPC9iPlwiXG4gICAgICAgICAgZm9udFNpemU9ezE4ICogc2NhbGVGYWN0b3J9XG4gICAgICAgICAgbGFiZWxUcmFuc2Zvcm09e3sgbWFyZ2luOiAnMCAyMCcgfX1cbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgbWFyZ2luOiB7IHRvcDogMCwgcmlnaHQ6IDE2ICogc2NhbGVGYWN0b3IsIGJvdHRvbTogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgbWluV2lkdGg6IDY5ICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4gY29udHJvbHMuc2V0Vm9sdW1lKDApfVxuICAgICAgICAgIGRpc2FibGVkPXshc2VsZWN0ZWRWaWRlb1BsYXllcn1cbiAgICAgICAgLz5cbiAgICAgIDwvVWlFbnRpdHk+XG4gICAgPC9VaUVudGl0eT5cbiAgKSA6IG51bGxcbn1cblxuLy8gTWFpbiBjb21wb25lbnRcbmV4cG9ydCBmdW5jdGlvbiBWaWRlb0NvbnRyb2woe1xuICBlbmdpbmUsXG4gIHN0YXRlLFxufToge1xuICBlbmdpbmU6IElFbmdpbmVcbiAgc3RhdGU6IFN0YXRlXG59KSB7XG4gIGNvbnN0IGNvbnRyb2xzID0gY3JlYXRlVmlkZW9QbGF5ZXJDb250cm9scyhlbmdpbmUsIHN0YXRlKVxuICBjb25zdCBzZWxlY3RlZFZpZGVvUGxheWVyID0gdXNlU2VsZWN0ZWRWaWRlb1BsYXllcihlbmdpbmUsIHN0YXRlKVxuICBjb25zdCBzY2FsZUZhY3RvciA9IGdldFNjYWxlVUlGYWN0b3IoZW5naW5lKVxuXG4gIHJldHVybiAoXG4gICAgPFVpRW50aXR5XG4gICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICBtYXJnaW46IHsgYm90dG9tOiAxMCAqIHNjYWxlRmFjdG9yIH0sXG4gICAgICAgICAgaGVpZ2h0OiAzMCAqIHNjYWxlRmFjdG9yLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICB1aVRyYW5zZm9ybT17eyB3aWR0aDogMzAgKiBzY2FsZUZhY3RvciwgaGVpZ2h0OiAzMCAqIHNjYWxlRmFjdG9yIH19XG4gICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICBzcmM6IElDT05TLlZJREVPX0NPTlRST0wsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxMYWJlbFxuICAgICAgICAgIHZhbHVlPVwiPGI+VmlkZW8gQ29udHJvbDwvYj5cIlxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7IG1hcmdpbjogeyBib3R0b206IDgsIGxlZnQ6IDIwIH0gfX1cbiAgICAgICAgICBmb250U2l6ZT17MjQgKiBzY2FsZUZhY3Rvcn1cbiAgICAgICAgICBjb2xvcj17Q29sb3I0LldoaXRlKCl9XG4gICAgICAgIC8+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICA8TGFiZWxcbiAgICAgICAgdmFsdWU9XCI8Yj5DdXJyZW50IFNjcmVlbjwvYj5cIlxuICAgICAgICBmb250U2l6ZT17MTYgKiBzY2FsZUZhY3Rvcn1cbiAgICAgICAgY29sb3I9e0NvbG9yNC5XaGl0ZSgpfVxuICAgICAgICB1aVRyYW5zZm9ybT17eyBtYXJnaW46IHsgYm90dG9tOiAxNiAqIHNjYWxlRmFjdG9yIH0gfX1cbiAgICAgIC8+XG5cbiAgICAgIDxWaWRlb1BsYXllclNlbGVjdG9yIGVuZ2luZT17ZW5naW5lfSBzdGF0ZT17c3RhdGV9IC8+XG5cbiAgICAgIDxJbnB1dFxuICAgICAgICBvblN1Ym1pdD17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgc3RhdGUudmlkZW9Db250cm9sLnNoYXJlU2NyZWVuVXJsID0gdmFsdWVcbiAgICAgICAgICBoYW5kbGVTaGFyZVNjcmVlblVybChlbmdpbmUsIHN0YXRlLCB2YWx1ZSlcbiAgICAgICAgfX1cbiAgICAgICAgb25DaGFuZ2U9eygkKSA9PiAoc3RhdGUudmlkZW9Db250cm9sLnNoYXJlU2NyZWVuVXJsID0gJCl9XG4gICAgICAgIGZvbnRTaXplPXsxNiAqIHNjYWxlRmFjdG9yfVxuICAgICAgICBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgdmlkZW8gVVJMXCJcbiAgICAgICAgcGxhY2Vob2xkZXJDb2xvcj17Q29sb3I0LmNyZWF0ZSgxNjAgLyAyNTUsIDE1NSAvIDI1NSwgMTY4IC8gMjU1LCAxKX1cbiAgICAgICAgY29sb3I9e0NvbG9yNC5CbGFjaygpfVxuICAgICAgICB1aUJhY2tncm91bmQ9e3sgY29sb3I6IENvbG9yNC5XaGl0ZSgpIH19XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6IDgwICogc2NhbGVGYWN0b3IsXG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIGhlaWdodDogNDAgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJyxcbiAgICAgICAgICBtYXJnaW46IHsgdG9wOiAxMCAqIHNjYWxlRmFjdG9yIH0sXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBpZD1cInZpZGVvX2NvbnRyb2xfc2hhcmVfc2NyZWVuX2NsZWFyXCJcbiAgICAgICAgICB2YWx1ZT1cIjxiPkNsZWFyIFNjcmVlbjwvYj5cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICBmb250U2l6ZT17MTYgKiBzY2FsZUZhY3Rvcn1cbiAgICAgICAgICBjb2xvcj17Q29sb3I0LldoaXRlKCl9XG4gICAgICAgICAgdWlUcmFuc2Zvcm09e3sgbWFyZ2luOiB7IHJpZ2h0OiA4ICogc2NhbGVGYWN0b3IgfSB9fVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS52aWRlb0NvbnRyb2wuc2hhcmVTY3JlZW5VcmwgPSB1bmRlZmluZWRcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgaWQ9XCJ2aWRlb19jb250cm9sX3NoYXJlX3NjcmVlbl9zaGFyZVwiXG4gICAgICAgICAgdmFsdWU9XCI8Yj5TaGFyZTwvYj5cIlxuICAgICAgICAgIGxhYmVsVHJhbnNmb3JtPXt7IG1hcmdpbjogJzAgMjAnIH19XG4gICAgICAgICAgZm9udFNpemU9ezE2ICogc2NhbGVGYWN0b3J9XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVNoYXJlU2NyZWVuVXJsKFxuICAgICAgICAgICAgICBlbmdpbmUsXG4gICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICBzdGF0ZS52aWRlb0NvbnRyb2wuc2hhcmVTY3JlZW5VcmwsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfX1cbiAgICAgICAgICBkaXNhYmxlZD17IXNlbGVjdGVkVmlkZW9QbGF5ZXJ9XG4gICAgICAgIC8+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICA8TGFiZWxcbiAgICAgICAgdmFsdWU9XCJWaWRlbyBQbGF5YmFja1wiXG4gICAgICAgIGZvbnRTaXplPXsxNiAqIHNjYWxlRmFjdG9yfVxuICAgICAgICBjb2xvcj17Q29sb3I0LldoaXRlKCl9XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7IG1hcmdpbjogeyBib3R0b206IDEwICogc2NhbGVGYWN0b3IgfSB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBtYXJnaW46IHsgYm90dG9tOiAxMCAqIHNjYWxlRmFjdG9yIH0sXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHsvKiA8QnV0dG9uXG4gICAgICAgICAgaWQ9XCJ2aWRlb19jb250cm9sX3ByZXZpb3VzXCJcbiAgICAgICAgICB2YWx1ZT1cIlByZXZpb3VzXCJcbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgbWFyZ2luOiB7IHRvcDogMCwgcmlnaHQ6IDE2ICogc2NhbGVGYWN0b3IsIGJvdHRvbTogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgbWluV2lkdGg6IDY5ICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBpY29uPXtJQ09OUy5QUkVWSU9VU19CVVRUT059XG4gICAgICAgICAgb25seUljb249e3RydWV9XG4gICAgICAgICAgaWNvblRyYW5zZm9ybT17e1xuICAgICAgICAgICAgd2lkdGg6IDM1ICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBoZWlnaHQ6IDM1ICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbHMucHJldmlvdXMoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9e3RydWV9XG4gICAgICAgIC8+ICovfVxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgaWQ9XCJ2aWRlb19jb250cm9sX3BsYXlcIlxuICAgICAgICAgIHZhbHVlPVwiPGI+UGxheTwvYj5cIlxuICAgICAgICAgIGZvbnRTaXplPXsxOCAqIHNjYWxlRmFjdG9yfVxuICAgICAgICAgIGxhYmVsVHJhbnNmb3JtPXt7IG1hcmdpbjogeyByaWdodDogMjAgfSB9fVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBtYXJnaW46IHsgdG9wOiAwLCByaWdodDogMTYgKiBzY2FsZUZhY3RvciwgYm90dG9tOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgICBtaW5XaWR0aDogNjkgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIGljb249e0lDT05TLlBMQVlfQlVUVE9OfVxuICAgICAgICAgIGljb25UcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIHdpZHRoOiAzNSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xzLnBsYXkoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9eyFzZWxlY3RlZFZpZGVvUGxheWVyfVxuICAgICAgICAvPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgaWQ9XCJ2aWRlb19jb250cm9sX3BhdXNlXCJcbiAgICAgICAgICB2YWx1ZT1cIjxiPlBhdXNlPC9iPlwiXG4gICAgICAgICAgZm9udFNpemU9ezE4ICogc2NhbGVGYWN0b3J9XG4gICAgICAgICAgbGFiZWxUcmFuc2Zvcm09e3sgbWFyZ2luOiAnMCAyMCcgfX1cbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgbWFyZ2luOiB7IHRvcDogMCwgcmlnaHQ6IDE2ICogc2NhbGVGYWN0b3IsIGJvdHRvbTogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgbWluV2lkdGg6IDY5ICogc2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbHMucGF1c2UoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9eyFzZWxlY3RlZFZpZGVvUGxheWVyfVxuICAgICAgICAvPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgaWQ9XCJ2aWRlb19jb250cm9sX3Jlc3RhcnRcIlxuICAgICAgICAgIHZhbHVlPVwiPGI+UmVzdGFydDwvYj5cIlxuICAgICAgICAgIGxhYmVsVHJhbnNmb3JtPXt7IG1hcmdpbjogJzAgMjAnIH19XG4gICAgICAgICAgZm9udFNpemU9ezE4ICogc2NhbGVGYWN0b3J9XG4gICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIG1hcmdpbjogeyB0b3A6IDAsIHJpZ2h0OiAxNiAqIHNjYWxlRmFjdG9yLCBib3R0b206IDAsIGxlZnQ6IDAgfSxcbiAgICAgICAgICAgIG1pbldpZHRoOiA2OSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xzLnJlc3RhcnQoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9eyFzZWxlY3RlZFZpZGVvUGxheWVyfVxuICAgICAgICAvPlxuICAgICAgICB7LyogPEJ1dHRvblxuICAgICAgICAgIGlkPVwidmlkZW9fY29udHJvbF9uZXh0XCJcbiAgICAgICAgICB2YWx1ZT1cIk5leHRcIlxuICAgICAgICAgIGZvbnRTaXplPXsxOCAqIHNjYWxlRmFjdG9yfVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBtYXJnaW46IHsgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgICBtaW5XaWR0aDogNjkgKiBzY2FsZUZhY3RvcixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIGljb249e0lDT05TLkZPUldBUkRfQlVUVE9OfVxuICAgICAgICAgIG9ubHlJY29uPXt0cnVlfVxuICAgICAgICAgIGljb25UcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIHdpZHRoOiAzNSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNSAqIHNjYWxlRmFjdG9yLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xzLm5leHQoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9e3RydWV9XG4gICAgICAgIC8+ICovfVxuICAgICAgPC9VaUVudGl0eT5cblxuICAgICAgPFZpZGVvQ29udHJvbFZvbHVtZSBlbmdpbmU9e2VuZ2luZX0gc3RhdGU9e3N0YXRlfSAvPlxuICAgIDwvVWlFbnRpdHk+XG4gIClcbn1cblxuZnVuY3Rpb24gaGFuZGxlU2hhcmVTY3JlZW5VcmwoZW5naW5lOiBJRW5naW5lLCBzdGF0ZTogU3RhdGUsIHVybD86IHN0cmluZykge1xuICBpZiAoIXVybCkgcmV0dXJuXG5cbiAgY29uc3QgY29udHJvbHMgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRyb2xzKGVuZ2luZSwgc3RhdGUpXG4gIGNvbnRyb2xzLnNldFNvdXJjZSh1cmwpXG4gIG5leHRUaWNrRnVuY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgIGNvbnRyb2xzLnBsYXkoKVxuICB9KVxufVxuIl19