@edm-webplayer/webplayer-angular 0.1.19 → 0.1.20

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.
@@ -1055,613 +1055,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1055
1055
  args: [{ name: 'timeFormat', standalone: true }]
1056
1056
  }] });
1057
1057
 
1058
- const CAST_SDK_URL = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';
1059
- let castSdkPromise = null;
1060
- function loadCastSdk() {
1061
- const hasCast = typeof window !== 'undefined' && window.cast?.framework;
1062
- if (hasCast) {
1063
- return Promise.resolve();
1064
- }
1065
- if (castSdkPromise) {
1066
- return castSdkPromise;
1067
- }
1068
- castSdkPromise = new Promise((resolve, reject) => {
1069
- const cleanup = () => {
1070
- if (window.__onGCastApiAvailable === callback) {
1071
- delete window.__onGCastApiAvailable;
1072
- }
1073
- };
1074
- const callback = (isAvailable, errorInfo) => {
1075
- cleanup();
1076
- if (isAvailable) {
1077
- resolve();
1078
- }
1079
- else {
1080
- reject(errorInfo instanceof Error
1081
- ? errorInfo
1082
- : new Error('Chromecast SDK não disponível.'));
1083
- }
1084
- };
1085
- window.__onGCastApiAvailable = callback;
1086
- const scriptSelector = `script[src="${CAST_SDK_URL}"]`;
1087
- let script = document.querySelector(scriptSelector);
1088
- if (script) {
1089
- script.addEventListener('error', () => {
1090
- cleanup();
1091
- reject(new Error('Erro ao carregar o SDK do Chromecast.'));
1092
- }, { once: true });
1093
- }
1094
- else {
1095
- script = document.createElement('script');
1096
- script.type = 'text/javascript';
1097
- script.src = CAST_SDK_URL;
1098
- script.async = true;
1099
- script.defer = true;
1100
- script.addEventListener('error', () => {
1101
- cleanup();
1102
- reject(new Error('Erro ao carregar o SDK do Chromecast.'));
1103
- }, { once: true });
1104
- document.head.appendChild(script);
1105
- }
1106
- }).catch((error) => {
1107
- castSdkPromise = null;
1108
- throw error;
1109
- });
1110
- return castSdkPromise;
1111
- }
1112
- class ChromecastPlayerComponent {
1113
- globalLoading;
1114
- configService;
1115
- config;
1116
- statusMessage = 'Preparando Chromecast...';
1117
- helpMessage = 'Certifique-se de que o dispositivo Chromecast está ligado e na mesma rede.';
1118
- errorMessage = null;
1119
- isReady = false;
1120
- isCasting = false;
1121
- isLoading = false;
1122
- lastLessonTokenCache = false;
1123
- streamUrl = null;
1124
- streamMimeType = 'application/x-mpegURL';
1125
- requiresEmbedReceiver = false;
1126
- sessionListener;
1127
- castEventType;
1128
- lastFetchSignature = null;
1129
- constructor(globalLoading, configService) {
1130
- this.globalLoading = globalLoading;
1131
- this.configService = configService;
1132
- }
1133
- async ngOnInit() {
1134
- this.applyStreamSource(this.config);
1135
- const initialSessionId = this.getSessionId(window.cast?.framework?.CastContext?.getInstance?.()?.getCurrentSession?.());
1136
- await this.ensureConfigFromToken(this.resolveAccessToken(this.config), initialSessionId);
1137
- if (!this.streamUrl) {
1138
- this.errorMessage =
1139
- 'Não foi possível identificar uma mídia compatível para transmitir via Chromecast.';
1140
- this.statusMessage = '';
1141
- this.globalLoading.hide();
1142
- return;
1143
- }
1144
- try {
1145
- await loadCastSdk();
1146
- this.setupCastContext();
1147
- }
1148
- catch (error) {
1149
- this.errorMessage = this.describeError(error);
1150
- this.statusMessage = '';
1151
- }
1152
- finally {
1153
- this.globalLoading.hide();
1154
- }
1155
- }
1156
- ngOnDestroy() {
1157
- const castApi = window.cast?.framework;
1158
- if (castApi && this.sessionListener && this.castEventType) {
1159
- const context = castApi.CastContext.getInstance();
1160
- context.removeEventListener(this.castEventType, this.sessionListener);
1161
- }
1162
- }
1163
- ngOnChanges(changes) {
1164
- if (changes['config']) {
1165
- const nextConfig = changes['config'].currentValue;
1166
- this.applyStreamSource(nextConfig);
1167
- if (!changes['config'].firstChange) {
1168
- const sessionId = this.getSessionId(window.cast?.framework?.CastContext?.getInstance?.()?.getCurrentSession?.());
1169
- void this.ensureConfigFromToken(this.resolveAccessToken(nextConfig), sessionId);
1170
- }
1171
- }
1172
- }
1173
- async startCasting() {
1174
- if (!this.isReady || this.isLoading || !this.streamUrl) {
1175
- return;
1176
- }
1177
- this.errorMessage = null;
1178
- this.isLoading = true;
1179
- const castApi = window.cast?.framework;
1180
- const chromeCast = window.chrome?.cast;
1181
- if (!castApi || !chromeCast) {
1182
- this.errorMessage = 'Chromecast não está disponível neste navegador.';
1183
- this.isLoading = false;
1184
- return;
1185
- }
1186
- try {
1187
- const context = castApi.CastContext.getInstance();
1188
- let session = context.getCurrentSession();
1189
- if (!session) {
1190
- await context.requestSession();
1191
- session = context.getCurrentSession();
1192
- }
1193
- if (!session) {
1194
- throw new Error('Não foi possível iniciar a sessão do Chromecast.');
1195
- }
1196
- const sessionId = this.getSessionId(session);
1197
- const accessToken = await this.ensureAccessTokenForSession(sessionId);
1198
- const mediaInfo = new chromeCast.media.MediaInfo(this.streamUrl ?? 'data:text/plain,Receiver handles playback', this.streamMimeType);
1199
- mediaInfo.metadata = new chromeCast.media.GenericMediaMetadata();
1200
- const metadataTitle = this.config?.video_external_id ||
1201
- this.config?.embed ||
1202
- 'EDM Webplayer';
1203
- mediaInfo.metadata.title = metadataTitle;
1204
- if (this.requiresEmbedReceiver) {
1205
- try {
1206
- mediaInfo.streamType =
1207
- chromeCast.media.StreamType?.NONE ??
1208
- chromeCast.media.StreamType?.BUFFERED ??
1209
- 'NONE';
1210
- }
1211
- catch { }
1212
- }
1213
- if (accessToken) {
1214
- const customData = {
1215
- ...(typeof mediaInfo.customData === 'object' && mediaInfo.customData !== null
1216
- ? mediaInfo.customData
1217
- : {}),
1218
- accessToken,
1219
- };
1220
- if (sessionId) {
1221
- customData['chromecast_session_id'] = sessionId;
1222
- customData['session_id'] = sessionId;
1223
- }
1224
- customData['video_host'] = this.config.video_host;
1225
- const lessonId = this.resolveLessonId(this.config);
1226
- if (lessonId) {
1227
- customData['lesson_id'] = lessonId;
1228
- }
1229
- if (this.config.embed) {
1230
- customData['embed'] = this.config.embed;
1231
- }
1232
- customData['requiresEmbedReceiver'] = this.requiresEmbedReceiver;
1233
- mediaInfo.customData = customData;
1234
- await this.ensureConfigFromToken(accessToken, sessionId);
1235
- }
1236
- else {
1237
- this.errorMessage = 'Não foi possível obter o token de acesso para o Chromecast.';
1238
- return;
1239
- }
1240
- const request = new chromeCast.media.LoadRequest(mediaInfo);
1241
- request.autoplay = this.config?.autoPlay ?? true;
1242
- if (typeof this.config?.last_time === 'number') {
1243
- request.currentTime = this.config.last_time;
1244
- }
1245
- await session.loadMedia(request);
1246
- this.isCasting = true;
1247
- this.statusMessage = 'Transmissão ativa no Chromecast.';
1248
- this.errorMessage = null;
1249
- }
1250
- catch (error) {
1251
- this.errorMessage = this.describeError(error);
1252
- this.isCasting = false;
1253
- }
1254
- finally {
1255
- this.isLoading = false;
1256
- }
1257
- }
1258
- stopCasting() {
1259
- const castApi = window.cast?.framework;
1260
- if (!castApi) {
1261
- return;
1262
- }
1263
- const context = castApi.CastContext.getInstance();
1264
- const session = context.getCurrentSession();
1265
- if (!session) {
1266
- return;
1267
- }
1268
- session.endSession(true);
1269
- this.isCasting = false;
1270
- this.statusMessage = 'Transmissão encerrada.';
1271
- this.lastFetchSignature = null;
1272
- this.lastLessonTokenCache = null;
1273
- }
1274
- setupCastContext() {
1275
- const castApi = window.cast?.framework;
1276
- const chromeCast = window.chrome?.cast;
1277
- if (!castApi || !chromeCast) {
1278
- this.errorMessage =
1279
- 'Chromecast SDK carregado, porém indisponível neste ambiente.';
1280
- return;
1281
- }
1282
- const context = castApi.CastContext.getInstance();
1283
- context.setOptions({
1284
- receiverApplicationId: this.resolveReceiverApplicationId(chromeCast?.media?.DEFAULT_MEDIA_RECEIVER_APP_ID ?? 'CC1AD845'),
1285
- autoJoinPolicy: chromeCast?.AutoJoinPolicy?.ORIGIN_SCOPED ??
1286
- chromeCast?.AutoJoinPolicy ??
1287
- 'origin_scoped',
1288
- });
1289
- const listener = (event) => {
1290
- const state = event?.sessionState;
1291
- if (state === castApi.SessionState.SESSION_STARTED) {
1292
- this.isCasting = true;
1293
- this.statusMessage = 'Transmissão ativa no Chromecast.';
1294
- const currentSession = context.getCurrentSession();
1295
- const token = this.extractAccessTokenFromSession(currentSession);
1296
- const sessionId = this.getSessionId(currentSession);
1297
- if (token) {
1298
- void this.ensureConfigFromToken(token, sessionId);
1299
- }
1300
- else if (sessionId) {
1301
- void this.ensureAccessTokenForSession(sessionId).then((resolvedToken) => {
1302
- if (resolvedToken) {
1303
- void this.ensureConfigFromToken(resolvedToken, sessionId);
1304
- }
1305
- });
1306
- }
1307
- }
1308
- else if (state === castApi.SessionState.SESSION_ENDED) {
1309
- this.isCasting = false;
1310
- this.statusMessage =
1311
- 'Sessão encerrada. Clique em "Transmitir para a TV" para iniciar novamente.';
1312
- this.lastFetchSignature = null;
1313
- this.lastLessonTokenCache = null;
1314
- }
1315
- };
1316
- this.castEventType = castApi.CastContextEventType.SESSION_STATE_CHANGED;
1317
- this.sessionListener = listener;
1318
- context.addEventListener(this.castEventType, listener);
1319
- const activeSession = context.getCurrentSession();
1320
- if (activeSession) {
1321
- this.isCasting = true;
1322
- this.statusMessage = 'Transmissão ativa no Chromecast.';
1323
- const token = this.extractAccessTokenFromSession(activeSession);
1324
- const sessionId = this.getSessionId(activeSession);
1325
- if (token) {
1326
- void this.ensureConfigFromToken(token, sessionId);
1327
- }
1328
- }
1329
- else {
1330
- this.statusMessage =
1331
- 'Chromecast pronto. Clique em "Transmitir para a TV" para começar.';
1332
- }
1333
- this.isReady = true;
1334
- }
1335
- resolveReceiverApplicationId(defaultId) {
1336
- const globalId = (typeof window !== 'undefined' &&
1337
- window.__EDM_CHROMECAST_APP_ID) ||
1338
- null;
1339
- if (typeof globalId === 'string' && globalId.trim() !== '') {
1340
- return globalId.trim();
1341
- }
1342
- return defaultId;
1343
- }
1344
- applyStreamSource(config) {
1345
- const source = this.resolveStreamSource(config);
1346
- this.streamUrl = source?.url ?? null;
1347
- this.streamMimeType = source?.mimeType ?? 'application/x-mpegURL';
1348
- this.requiresEmbedReceiver = source?.requiresEmbed ?? false;
1349
- }
1350
- resolveStreamSource(config) {
1351
- if (!config) {
1352
- return null;
1353
- }
1354
- const host = config.video_host;
1355
- if (host === 'mp4') {
1356
- const direct = this.tryDecodeBase64(config.video_external_id) ??
1357
- this.tryDecodeBase64(config.video_id);
1358
- if (direct) {
1359
- return { url: direct, mimeType: 'video/mp4' };
1360
- }
1361
- return null;
1362
- }
1363
- if (host === 'hls') {
1364
- const direct = this.tryDecodeBase64(config.video_id) ??
1365
- this.tryDecodeBase64(config.video_external_id);
1366
- return direct ? { url: direct, mimeType: 'application/x-mpegURL' } : null;
1367
- }
1368
- if (host === 'panda') {
1369
- const fromEmbed = this.buildPandaHlsUrl(config.embed, config.video_external_id);
1370
- if (fromEmbed) {
1371
- return { url: fromEmbed, mimeType: 'application/x-mpegURL' };
1372
- }
1373
- const direct = this.tryDecodeBase64(config.video_external_id) ??
1374
- this.tryDecodeBase64(config.video_id);
1375
- if (direct) {
1376
- const mime = direct.toLowerCase().includes('.mp4') ||
1377
- direct.toLowerCase().includes('format=mp4')
1378
- ? 'video/mp4'
1379
- : 'application/x-mpegURL';
1380
- return { url: direct, mimeType: mime };
1381
- }
1382
- const normalizedEmbed = this.normalizeEmbedUrl(config.embed);
1383
- if (normalizedEmbed) {
1384
- return {
1385
- url: normalizedEmbed,
1386
- mimeType: 'text/html',
1387
- requiresEmbed: true,
1388
- };
1389
- }
1390
- return null;
1391
- }
1392
- return null;
1393
- }
1394
- tryDecodeBase64(value) {
1395
- if (!value) {
1396
- return null;
1397
- }
1398
- try {
1399
- return atob(value);
1400
- }
1401
- catch {
1402
- return value;
1403
- }
1404
- }
1405
- buildPandaHlsUrl(embedUrl, fallbackVideoId) {
1406
- const parsed = this.safeParseUrl(embedUrl);
1407
- const videoId = fallbackVideoId ??
1408
- parsed?.searchParams.get('v') ??
1409
- undefined;
1410
- const host = parsed?.host ?? undefined;
1411
- if (!host || !videoId) {
1412
- return null;
1413
- }
1414
- // Panda HLS URLs usually follow /hls/<videoId>/playlist.m3u8
1415
- return `https://${host}/hls/${videoId}/playlist.m3u8`;
1416
- }
1417
- normalizeEmbedUrl(raw) {
1418
- const parsed = this.safeParseUrl(raw);
1419
- if (!parsed) {
1420
- return null;
1421
- }
1422
- parsed.searchParams.set('wmode', 'opaque');
1423
- parsed.searchParams.set('chromecast', '1');
1424
- return parsed.toString();
1425
- }
1426
- resolveAccessToken(config) {
1427
- const token = config?.accessToken ??
1428
- config?.access_token ??
1429
- null;
1430
- if (typeof token === 'string' && token.trim() !== '') {
1431
- return token;
1432
- }
1433
- return null;
1434
- }
1435
- getSessionId(session) {
1436
- if (!session) {
1437
- return null;
1438
- }
1439
- try {
1440
- if (typeof session.getSessionId === 'function') {
1441
- const value = session.getSessionId();
1442
- if (typeof value === 'string' && value.trim() !== '') {
1443
- return value;
1444
- }
1445
- }
1446
- }
1447
- catch { }
1448
- const fallback = session.sessionId;
1449
- return typeof fallback === 'string' && fallback.trim() !== ''
1450
- ? fallback
1451
- : null;
1452
- }
1453
- extractAccessTokenFromSession(session) {
1454
- if (!session) {
1455
- return null;
1456
- }
1457
- const media = typeof session.getMediaSession === 'function'
1458
- ? session.getMediaSession()
1459
- : null;
1460
- const customData = media?.customData ??
1461
- (typeof session.getSessionObj === 'function'
1462
- ? session.getSessionObj()?.customData
1463
- : undefined) ??
1464
- session.customData;
1465
- if (customData && typeof customData === 'object') {
1466
- const token = customData.accessToken ??
1467
- customData.access_token;
1468
- if (typeof token === 'string' && token.trim() !== '') {
1469
- return token;
1470
- }
1471
- }
1472
- return null;
1473
- }
1474
- async ensureConfigFromToken(accessToken, sessionId) {
1475
- if (!accessToken) {
1476
- return;
1477
- }
1478
- const signature = `${accessToken}::${sessionId ?? ''}`;
1479
- if (this.lastFetchSignature === signature) {
1480
- return;
1481
- }
1482
- const resolver = window.__edmFetchPlayerConfig;
1483
- if (typeof resolver !== 'function') {
1484
- return;
1485
- }
1486
- try {
1487
- const remoteConfig = await resolver(accessToken, {
1488
- sessionId,
1489
- platform: 'chromecast',
1490
- });
1491
- if (remoteConfig) {
1492
- this.lastFetchSignature = signature;
1493
- remoteConfig.accessToken = accessToken;
1494
- this.configService.setConfig(remoteConfig);
1495
- this.config = remoteConfig;
1496
- this.applyStreamSource(this.config);
1497
- }
1498
- }
1499
- catch (error) {
1500
- console.error('Falha ao atualizar a configuração para o Chromecast.', error);
1501
- }
1502
- }
1503
- describeError(error) {
1504
- if (error instanceof Error) {
1505
- return error.message;
1506
- }
1507
- if (typeof error === 'string') {
1508
- return error;
1509
- }
1510
- return 'Ocorreu um erro inesperado ao comunicar com o Chromecast.';
1511
- }
1512
- async ensureAccessTokenForSession(sessionId) {
1513
- const fallbackToken = this.resolveAccessToken(this.config);
1514
- if (!sessionId) {
1515
- return fallbackToken;
1516
- }
1517
- const lessonId = this.resolveLessonId(this.config);
1518
- if (!lessonId) {
1519
- return fallbackToken;
1520
- }
1521
- const endpoint = this.buildChromecastTokenEndpoint(this.config, lessonId);
1522
- if (!endpoint) {
1523
- return fallbackToken;
1524
- }
1525
- const cacheKey = `${sessionId}::${lessonId}`;
1526
- if (this.lastLessonTokenCache &&
1527
- this.lastLessonTokenCache.sessionKey === cacheKey) {
1528
- return this.lastLessonTokenCache.token;
1529
- }
1530
- try {
1531
- const response = await fetch(endpoint, {
1532
- method: 'POST',
1533
- headers: {
1534
- 'Content-Type': 'application/json',
1535
- },
1536
- body: JSON.stringify({ chromecast_session_id: sessionId }),
1537
- credentials: 'include',
1538
- });
1539
- if (!response.ok) {
1540
- throw new Error(`HTTP ${response.status}`);
1541
- }
1542
- const data = await response.json();
1543
- const token = data?.access_token ??
1544
- data?.accessToken ??
1545
- null;
1546
- if (typeof token === 'string' && token.trim() !== '') {
1547
- this.lastLessonTokenCache = { sessionKey: cacheKey, token };
1548
- return token;
1549
- }
1550
- }
1551
- catch (error) {
1552
- console.error('Falha ao obter token para Chromecast.', error);
1553
- }
1554
- return fallbackToken;
1555
- }
1556
- resolveLessonId(config) {
1557
- if (!config)
1558
- return null;
1559
- if (config.lesson_id !== undefined && config.lesson_id !== null) {
1560
- const value = String(config.lesson_id).trim();
1561
- if (value !== '')
1562
- return value;
1563
- }
1564
- const progressUrl = config.progress_url;
1565
- const parsed = this.safeParseUrl(progressUrl);
1566
- const lessonId = parsed?.searchParams.get('lesson_id');
1567
- return lessonId ?? null;
1568
- }
1569
- buildChromecastTokenEndpoint(config, lessonId) {
1570
- if (!config)
1571
- return null;
1572
- const runningLocally = typeof window !== 'undefined' &&
1573
- /^(localhost|127\.0\.0\.1)/.test(window.location.hostname);
1574
- if (runningLocally) {
1575
- return `/api/v1/app/lessons/${lessonId}/access-token-chromecast`;
1576
- }
1577
- const progressUrl = config.progress_url;
1578
- const parsed = this.safeParseUrl(progressUrl);
1579
- if (!parsed)
1580
- return null;
1581
- const origin = parsed.origin.replace(/^http:/, 'https:');
1582
- return `${origin}/api/v1/app/lessons/${lessonId}/access-token-chromecast`;
1583
- }
1584
- safeParseUrl(raw) {
1585
- if (!raw)
1586
- return null;
1587
- try {
1588
- return new URL(raw);
1589
- }
1590
- catch {
1591
- try {
1592
- return new URL(decodeURIComponent(raw));
1593
- }
1594
- catch {
1595
- return null;
1596
- }
1597
- }
1598
- }
1599
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ChromecastPlayerComponent, deps: [{ token: GlobalLoadingService }, { token: WebplayerConfigService }], target: i0.ɵɵFactoryTarget.Component });
1600
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: ChromecastPlayerComponent, isStandalone: true, selector: "app-chromecast-player", inputs: { config: "config" }, usesOnChanges: true, ngImport: i0, template: `
1601
- <section class="chromecast">
1602
- <header>
1603
- <h1>Chromecast</h1>
1604
- <p *ngIf="statusMessage">{{ statusMessage }}</p>
1605
- </header>
1606
-
1607
- <div class="actions">
1608
- <button
1609
- type="button"
1610
- (click)="startCasting()"
1611
- [disabled]="!isReady || isLoading"
1612
- >
1613
- {{ isCasting ? 'Reiniciar transmissão' : 'Transmitir para a TV' }}
1614
- </button>
1615
- <button
1616
- type="button"
1617
- class="secondary"
1618
- (click)="stopCasting()"
1619
- [disabled]="!isCasting"
1620
- >
1621
- Encerrar transmissão
1622
- </button>
1623
- </div>
1624
-
1625
- <p *ngIf="errorMessage" class="error">{{ errorMessage }}</p>
1626
- <p *ngIf="helpMessage" class="help">{{ helpMessage }}</p>
1627
- </section>
1628
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.chromecast{color:#fff;background:#121212;width:100%;height:100%;padding:2rem;box-sizing:border-box;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:1.5rem}header h1{margin:0;font-size:clamp(1.5rem,2vw,2.25rem)}header p{margin:.5rem 0 0;font-size:1rem;opacity:.85}.actions{display:flex;gap:.75rem;flex-wrap:wrap}button{border:none;padding:.75rem 1.5rem;border-radius:999px;font-size:1rem;cursor:pointer;background:#e3fb63;color:#1b1b1b;transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease}button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 12px #e3fb634d}button:disabled{opacity:.6;cursor:not-allowed}button.secondary{background:transparent;border:1px solid rgba(255,255,255,.35);color:#fffc}.error{color:#ff7d7d;margin:0}.help{margin:0;font-size:.95rem;opacity:.8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
1629
- }
1630
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ChromecastPlayerComponent, decorators: [{
1631
- type: Component,
1632
- args: [{ selector: 'app-chromecast-player', standalone: true, imports: [CommonModule], template: `
1633
- <section class="chromecast">
1634
- <header>
1635
- <h1>Chromecast</h1>
1636
- <p *ngIf="statusMessage">{{ statusMessage }}</p>
1637
- </header>
1638
-
1639
- <div class="actions">
1640
- <button
1641
- type="button"
1642
- (click)="startCasting()"
1643
- [disabled]="!isReady || isLoading"
1644
- >
1645
- {{ isCasting ? 'Reiniciar transmissão' : 'Transmitir para a TV' }}
1646
- </button>
1647
- <button
1648
- type="button"
1649
- class="secondary"
1650
- (click)="stopCasting()"
1651
- [disabled]="!isCasting"
1652
- >
1653
- Encerrar transmissão
1654
- </button>
1655
- </div>
1656
-
1657
- <p *ngIf="errorMessage" class="error">{{ errorMessage }}</p>
1658
- <p *ngIf="helpMessage" class="help">{{ helpMessage }}</p>
1659
- </section>
1660
- `, styles: [":host{display:block;width:100%;height:100%}.chromecast{color:#fff;background:#121212;width:100%;height:100%;padding:2rem;box-sizing:border-box;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:1.5rem}header h1{margin:0;font-size:clamp(1.5rem,2vw,2.25rem)}header p{margin:.5rem 0 0;font-size:1rem;opacity:.85}.actions{display:flex;gap:.75rem;flex-wrap:wrap}button{border:none;padding:.75rem 1.5rem;border-radius:999px;font-size:1rem;cursor:pointer;background:#e3fb63;color:#1b1b1b;transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease}button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 12px #e3fb634d}button:disabled{opacity:.6;cursor:not-allowed}button.secondary{background:transparent;border:1px solid rgba(255,255,255,.35);color:#fffc}.error{color:#ff7d7d;margin:0}.help{margin:0;font-size:.95rem;opacity:.8}\n"] }]
1661
- }], ctorParameters: () => [{ type: GlobalLoadingService }, { type: WebplayerConfigService }], propDecorators: { config: [{
1662
- type: Input
1663
- }] } });
1664
-
1665
1058
  class WebplayerModule {
1666
1059
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: WebplayerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1667
1060
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: WebplayerModule, imports: [CommonModule,
@@ -1670,21 +1063,18 @@ class WebplayerModule {
1670
1063
  PlyrPlayerComponent,
1671
1064
  PandaPlayerComponent,
1672
1065
  ScaleupPlayerComponent,
1673
- ChromecastPlayerComponent,
1674
1066
  TimeFormatPipe], exports: [WebplayerComponent,
1675
1067
  PlayerLoaderComponent,
1676
1068
  PlyrPlayerComponent,
1677
1069
  PandaPlayerComponent,
1678
1070
  ScaleupPlayerComponent,
1679
- ChromecastPlayerComponent,
1680
1071
  TimeFormatPipe] });
1681
1072
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: WebplayerModule, imports: [CommonModule,
1682
1073
  WebplayerComponent,
1683
1074
  PlayerLoaderComponent,
1684
1075
  PlyrPlayerComponent,
1685
1076
  PandaPlayerComponent,
1686
- ScaleupPlayerComponent,
1687
- ChromecastPlayerComponent] });
1077
+ ScaleupPlayerComponent] });
1688
1078
  }
1689
1079
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: WebplayerModule, decorators: [{
1690
1080
  type: NgModule,
@@ -1696,7 +1086,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1696
1086
  PlyrPlayerComponent,
1697
1087
  PandaPlayerComponent,
1698
1088
  ScaleupPlayerComponent,
1699
- ChromecastPlayerComponent,
1700
1089
  TimeFormatPipe,
1701
1090
  ],
1702
1091
  exports: [
@@ -1705,7 +1094,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1705
1094
  PlyrPlayerComponent,
1706
1095
  PandaPlayerComponent,
1707
1096
  ScaleupPlayerComponent,
1708
- ChromecastPlayerComponent,
1709
1097
  TimeFormatPipe,
1710
1098
  ]
1711
1099
  }]
@@ -1715,5 +1103,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1715
1103
  * Generated bundle index. Do not edit.
1716
1104
  */
1717
1105
 
1718
- export { ChromecastPlayerComponent, PandaPlayerComponent, PlayerLoaderComponent, PlyrPlayerComponent, ScaleupPlayerComponent, TimeFormatPipe, WEPLAYER_CONFIG, WebplayerComponent, WebplayerConfigService, WebplayerModule, WebplayerProgressService };
1106
+ export { PandaPlayerComponent, PlayerLoaderComponent, PlyrPlayerComponent, ScaleupPlayerComponent, TimeFormatPipe, WEPLAYER_CONFIG, WebplayerComponent, WebplayerConfigService, WebplayerModule, WebplayerProgressService };
1719
1107
  //# sourceMappingURL=edm-webplayer-webplayer-angular.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"edm-webplayer-webplayer-angular.mjs","sources":["../../../projects/webplayer-angular/src/webplayer.types.ts","../../../projects/webplayer-angular/src/webplayer-config.service.ts","../../../projects/webplayer-angular/src/progress.service.ts","../../../projects/webplayer-angular/src/players/plyr-player/plyr-player.component.ts","../../../projects/webplayer-angular/src/players/panda-player/panda-player.component.ts","../../../projects/webplayer-angular/src/players/scaleup-player/scaleup-player.component.ts","../../../projects/webplayer-angular/src/global.service.ts","../../../projects/webplayer-angular/src/player-loader/player-loader.component.ts","../../../projects/webplayer-angular/src/webplayer.component.ts","../../../projects/webplayer-angular/src/utils/time-format.pipe.ts","../../../projects/webplayer-angular/src/players/chromecast-player/chromecast-player.component.ts","../../../projects/webplayer-angular/src/webplayer.module.ts","../../../projects/webplayer-angular/src/edm-webplayer-webplayer-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface WebplayerConfig {\n video_host: 'youtube' | 'vimeo' | 'mp4' | 'hls' | 'panda' | 'scaleup';\n video_id: string | null;\n library_id?: string | number | null;\n video_external_id?: string | null;\n last_time?: number | null;\n last_percent?: number;\n embed?: string | null;\n watermark?: string;\n progress_url?: string;\n is_live?: boolean; // is the video live\n mirror?: boolean; // mirror the video\n autoPlay?: boolean; // auto play the video\n accessToken?: string; // token para compartilhar com o Chromecast\n lesson_id?: string | number | null;\n ui?: {\n colors?: {\n bg?: string;\n alert?: string;\n 'font-bt'?: string;\n 'text-color'?: string;\n 'progress-view-off'?: string;\n };\n };\n}\n\nexport const WEPLAYER_CONFIG = new InjectionToken<WebplayerConfig>('webplayer.config');\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { WebplayerConfig, WEPLAYER_CONFIG } from './webplayer.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WebplayerConfigService {\n private configSubject: BehaviorSubject<WebplayerConfig | null>;\n\n public get config$(): Observable<WebplayerConfig | null> {\n return this.configSubject.asObservable();\n }\n\n constructor(@Optional() @Inject(WEPLAYER_CONFIG) providedConfig: WebplayerConfig) {\n this.configSubject = new BehaviorSubject<WebplayerConfig | null>(providedConfig);\n }\n\n setConfig(config: Partial<WebplayerConfig>) {\n const currentConfig = this.configSubject.getValue();\n const newConfig = { ...(currentConfig || {}), ...config } as WebplayerConfig;\n this.configSubject.next(newConfig);\n }\n\n getConfig(): WebplayerConfig | null {\n return this.configSubject.getValue();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface WebplayerProgress {\n currentTime: number;\n duration: number;\n percent: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WebplayerProgressService {\n\n public progress$ = new Subject<WebplayerProgress>();\n public ended$ = new Subject<void>();\n\n private key(videoKey: string) { return `webplayer:${videoKey}`; }\n\n saveProgress(videoKey: string, time: number) {\n try {\n localStorage.setItem(this.key(videoKey), String(Math.floor(time)));\n } catch {}\n }\n\n getProgress(videoKey: string): number {\n try {\n return Number(localStorage.getItem(this.key(videoKey)) || 0);\n } catch {\n return 0;\n }\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n Output,\n EventEmitter\n} from \"@angular/core\";\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport * as Plyr from 'plyr';\nimport \"plyr/dist/plyr.css\";\nimport Hls from \"hls.js\";\nimport { WebplayerConfig } from \"../../webplayer.types\";\nimport { WebplayerProgressService } from \"../../progress.service\";\n\n@Component({\n selector: \"app-plyr-player\",\n template: `<video #video playsinline></video>`,\n standalone: true,\n imports: [CommonModule],\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n --plyr-color-main: var(--theme-alert, #19a6d9);\n --plyr-color-hover: var(--theme-alert, #2dbbff);\n --plyr-progress-buffer-background: var(--theme-progress-view-off, rgba(255, 255, 255, 0.25));\n --plyr-control-background: var(--theme-bg, rgba(0, 0, 0, 0.8));\n --plyr-control-color: var(--theme-text-color, #fff);\n --plyr-control-button-color: var(--theme-font-bt, #fff);\n }\n :host ::ng-deep .plyr__controls {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__controls button {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__progress__buffer {\n background-color: var(--plyr-progress-buffer-background) !important;\n }\n :host ::ng-deep .plyr,\n :host ::ng-deep .plyr__video-wrapper,\n :host ::ng-deep .plyr__video-embed,\n :host ::ng-deep .plyr__video-embed > iframe,\n :host ::ng-deep video {\n width: 100% !important;\n height: 100% !important;\n aspect-ratio: auto !important;\n top: 0 !important;\n left: 0 !important;\n }\n :host ::ng-deep .mirror {\n transform: scaleX(-1) !important;\n -webkit-transform: scaleX(-1) !important;\n }\n :host ::ng-deep .plyr--video .plyr__control.plyr__tab-focus,\n :host ::ng-deep .plyr--video .plyr__control:hover,\n :host ::ng-deep .plyr--video .plyr__control[aria-expanded=true] {\n background: var(--plyr-color-hover) !important;\n color: var(--plyr-control-button-color) !important;\n }\n\n :host ::ng-deep .plyr--full-ui input[type=range] {\n color: var(--plyr-color-main) !important;\n }\n\n :host ::ng-deep .plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before {\n background: var(--plyr-color-main) !important;\n }\n\n :host ::ng-deep .plyr__menu__container {\n background: var(--plyr-control-background) !important;\n }\n\n :host ::ng-deep .ytp-more-videos-view .ytp-suggestions{\n pointer-events: none !important;\n }\n `,\n ],\n})\nexport class PlyrPlayerComponent\n implements AfterViewInit, OnDestroy, OnChanges, OnInit\n{\n @ViewChild(\"video\", { static: true }) videoRef!: ElementRef<HTMLVideoElement>;\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private plyr!: any;\n private hls?: Hls;\n\n constructor(\n private progressService: WebplayerProgressService,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n ngOnInit() {\n console.log(this.config);\n if (this.config?.ui?.colors) {\n this.applyTheme(this.config.ui.colors);\n }\n }\n\n ngAfterViewInit() {\n this.setupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes[\"config\"] && this.plyr) {\n this.setupPlayer();\n }\n }\n\n private applyTheme(colors: { [key: string]: string }) {\n const STYLE_ID = 'webplayer-theme-vars';\n let styleEl = this.document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = this.document.createElement('style');\n styleEl.id = STYLE_ID;\n this.document.head.appendChild(styleEl);\n }\n\n const rootStyle = this.document.documentElement.style;\n const allPairs: Array<[string, string]> = [];\n\n for (const key in colors) {\n if (Object.prototype.hasOwnProperty.call(colors, key)) {\n const cssVarName = `--theme-${key.replace('progresss-', 'progress-')}`;\n const cssVarValue = String(colors[key]);\n allPairs.push([cssVarName, cssVarValue]);\n try { rootStyle.setProperty(cssVarName, cssVarValue); } catch {}\n }\n }\n\n const cssRule = `:root{\n${allPairs.map(([n,v]) => ` ${n}: ${v};`).join('\\n')}\n}`;\n styleEl.textContent = cssRule;\n }\n\n private setupPlayer() {\n if (!this.videoRef) return;\n\n this.hls?.destroy();\n this.plyr?.destroy();\n const speedOptions = [1, 1.25, 1.5, 2]\n this.plyr = new (Plyr as any).default(this.videoRef.nativeElement, {\n controls: [\n \"play-large\",\n \"play\",\n \"progress\",\n \"current-time\",\n \"duration\",\n \"mute\",\n \"volume\",\n \"captions\",\n \"settings\",\n \"pip\",\n \"airplay\",\n \"fullscreen\",\n ],\n youtube: { rel: 0, modestbranding: 1, noCookie: true },\n vimeo: { byline: false, portrait: false, title: false, playsinline: false },\n fullscreen: { enabled: true, fallback: true, iosNative: true, container: null },\n i18n: {\n speed: 'Velocidade',\n },\n speed: {\n selected: 1,\n options: speedOptions\n },\n clickToPlay: true,\n hideControls: false,\n keyboard: { focused: true, global: false },\n muted: false,\n });\n\n this.bindProgressEvents();\n this.loadSource(this.videoRef.nativeElement).then(() => {\n this.setupStartTime();\n });\n\n // Dispara o evento ready quando o player estiver pronto\n this.plyr.on(\"ready\", () => {\n this.ready.emit();\n });\n }\n\n private setupStartTime() {\n const apply = () => {\n const dur = this.plyr.duration || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) this.plyr.currentTime = start;\n this.plyr.off(\"ready\", apply as any);\n };\n this.plyr.on(\"ready\", apply as any);\n }\n\n private bindProgressEvents() {\n const THROTTLE_MS = 300;\n let lastEmit = 0;\n\n const emitProgress = () => {\n const t = this.plyr.currentTime || 0;\n const d = this.plyr.duration || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n };\n\n const onTimeUpdate = () => {\n const now = performance.now();\n if (now - lastEmit >= THROTTLE_MS) {\n lastEmit = now;\n emitProgress();\n }\n parent.postMessage('currentTime:' + (this.plyr.currentTime || 0), \"*\");\n console.log('event: current_time ' + (this.plyr.currentTime || 0));\n };\n this.plyr?.on?.(\"play\", () => {\n parent.postMessage('playing_video', \"*\");\n\n });\n this.plyr?.on?.(\"timeupdate\", onTimeUpdate);\n this.plyr?.on?.(\"pause\", () => {\n emitProgress();\n console.log('event: pause')\n parent.postMessage('paused_video', \"*\");\n });\n this.plyr?.on?.(\"ended\", () => {\n emitProgress();\n parent.postMessage('event: ended', \"*\");\n this.progressService.ended$.next();\n });\n }\n\n private unmuteAfterDelay(\n video?: HTMLVideoElement,\n delayMs = 2000,\n volume = 1\n ) {\n if (!this.config.autoPlay) return;\n setTimeout(() => {\n try {\n if (this.plyr) {\n this.plyr.muted = false;\n this.plyr.volume = volume;\n }\n } catch {}\n try {\n if (video) {\n video.muted = false;\n if (typeof video.volume === \"number\") video.volume = volume;\n }\n } catch {}\n }, delayMs);\n }\n\n private loadSource(\n video: HTMLVideoElement,\n ): Promise<void> {\n\n const setDisabledTopPageClick = () => {\n setTimeout(() => {\n const wrapper = document.querySelector(\n \".plyr__video-wrapper\"\n ) as HTMLElement;\n if (wrapper) {\n const blocker = document.createElement(\"div\");\n blocker.style.position = \"absolute\";\n blocker.style.top = \"0\";\n blocker.style.left = \"0\";\n blocker.style.width = \"100%\";\n blocker.style.height = \"200px\";\n blocker.style.zIndex = \"5\";\n blocker.style.background = \"transparent\";\n blocker.style.pointerEvents = \"auto\";\n wrapper.appendChild(blocker);\n\n const blocker2 = document.createElement(\"div\");\n blocker2.style.position = \"absolute\";\n blocker2.style.bottom = \"80px\";\n blocker2.style.left = \"0\";\n blocker2.style.width = \"100%\";\n blocker2.style.height = \"100px\";\n blocker2.style.zIndex = \"5\";\n blocker2.style.background = \"transparent\";\n blocker2.style.pointerEvents = \"auto\";\n wrapper.appendChild(blocker2);\n }\n\n }, 2500);\n };\n\n return new Promise((resolve) => {\n if (!this.config) {\n return resolve();\n }\n\n if (this.hls) {\n this.hls.destroy();\n this.hls = undefined;\n }\n\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n if (!isMobile) {\n setDisabledTopPageClick();\n }\n\n if (this.config.video_host === \"youtube\" || this.config.video_host === \"vimeo\") {\n const onReady = () => {\n this.plyr.off(\"ready\", onReady);\n const start = this.resolveStartTime(\n this.config.last_time,\n this.config.last_percent,\n this.plyr.duration\n );\n if (start > 0) this.plyr.currentTime = start;\n \n if (this.config.autoPlay || this.config.is_live) {\n setTimeout(() => {\n this.plyr.play();\n }, 1500);\n }\n parent.postMessage('playerIsReadyToPlay', \"*\");\n parent.postMessage('duration:' + this.plyr.duration, \"*\");\n console.log('event: current_time ' + this.plyr.currentTime);\n console.log('event: duration ' + this.plyr.duration);\n console.log('event: ready');\n\n if(this.config.is_live) {\n this.plyr?.on('playing', function() {\n console.log('event: playing_live');\n parent.postMessage('event: playing_live', '*');\n });\n }\n\n if (this.config.mirror) {\n setTimeout(() => {\n document\n .querySelector(`.plyr__video-embed iframe`) // eslint-disable-line\n ?.classList.add(\"mirror\");\n }, 1000);\n }\n };\n this.plyr.on(\"ready\", onReady);\n }\n\n if (this.config.video_host === \"youtube\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_id, provider: \"youtube\" }],\n };\n } else if (this.config.video_host === \"vimeo\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_id, provider: \"vimeo\" }],\n };\n } else if (this.config.video_host === \"mp4\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_external_id, type: \"video/mp4\" }],\n };\n } else if (this.config.video_host === \"hls\") {\n let sourceX = \"\";\n try {\n sourceX = atob(this.config.video_id || '');\n } catch (e) {\n sourceX = this.config.video_id || '';\n }\n const canNative = video.canPlayType(\"application/vnd.apple.mpegurl\");\n\n if (canNative) {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: sourceX, type: \"application/vnd.apple.mpegurl\" }],\n };\n const onLoadedMeta = () => {\n const dur = this.plyr.duration || video.duration || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) { try { this.plyr.currentTime = start; } catch { try { video.currentTime = start; } catch {} } \n }\n if (this.config.autoPlay) {\n try { video.muted = true; } catch {}\n setTimeout(() => {\n try { this.plyr.play(); } catch { try { video.play(); } catch {} }\n this.unmuteAfterDelay(video);\n }, 250);\n }\n video.removeEventListener(\"loadedmetadata\", onLoadedMeta);\n };\n video.addEventListener(\"loadedmetadata\", onLoadedMeta);\n } else if (Hls.isSupported()) {\n this.hls = new Hls({ enableWorker: true, lowLatencyMode: true });\n this.hls.attachMedia(video);\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls!.loadSource(sourceX);\n });\n this.hls.on(Hls.Events.MANIFEST_PARSED, () => {\n const dur = video.duration || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) { try { video.currentTime = start; } catch {} }\n if (this.config.autoPlay) {\n video.muted = true;\n video.play().catch(() => {});\n this.unmuteAfterDelay(video);\n }\n });\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls!.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls!.recoverMediaError();\n break;\n default:\n try { this.hls!.destroy(); } catch {} break;\n }\n }\n });\n } else {\n this.plyr.source = { type: \"video\", sources: [{ src: sourceX }] };\n }\n }\n resolve();\n });\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number,\n opts: { minStartSec?: number; endGuardSec?: number } = {}\n ): number {\n const minStartSec = opts.minStartSec ?? 3;\n const endGuardSec = opts.endGuardSec ?? 2;\n const dur = Number(duration) || 0;\n if (dur <= 0) return 0;\n\n const hasTime = last_time !== undefined && last_time !== null && last_time !== \"\";\n if (hasTime) {\n let t = Number(last_time);\n if (!isFinite(t) || t < 0) t = 0;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n const hasPercent =\n last_percent !== undefined && last_percent !== null && last_percent !== \"\";\n if (hasPercent) {\n let p = Number(last_percent);\n if (!isFinite(p) || p < 0) p = 0;\n if (p > 1) p = p / 100;\n let t = dur * p;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n return 0;\n }\n\n ngOnDestroy() {\n this.hls?.destroy();\n this.plyr?.destroy();\n }\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\n\ndeclare global {\n interface Window {\n pandascripttag?: any[];\n PandaPlayer?: any;\n }\n}\n\n@Component({\n selector: 'app-panda-player',\n template: '', // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep .panda-player,\n :host ::ng-deep iframe[src*=\"pandavideo.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `]\n})\nexport class PandaPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private pandaPlayer?: any;\n private pandaContainer?: HTMLDivElement;\n private pandaProgressThrottle = 0;\n private primaryColor?: string;\n private controlsColor?: string;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService,\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== 'panda') {\n return;\n }\n this.applyTheme();\n this.loadPandaPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.pandaPlayer) {\n this.loadPandaPlayer();\n }\n }\n\n private applyTheme() {\n if (this.config?.ui?.colors) {\n this.primaryColor = this.config.ui.colors['progress-view-off'];\n this.controlsColor = this.config.ui.colors['text-color'];\n }\n }\n\n private loadPandaPlayer() {\n if (!this.config.embed) {\n return;\n }\n\n this.ensurePandaScript().then(() => {\n const host: HTMLElement = this.elementRef.nativeElement;\n console.log('Panda Player Config:', this.config, host);\n if (!this.pandaContainer) {\n this.pandaContainer = document.createElement(\"div\");\n this.pandaContainer.style.width = \"100%\";\n this.pandaContainer.style.height = \"100%\";\n this.pandaContainer.id = `panda-${this.config.video_id || Math.random().toString(36).slice(2)}`;\n host.appendChild(this.pandaContainer);\n }\n\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n\n const videoId = this.config.video_external_id || (this.config.embed ? this.extractPandaVideoId(this.config.embed) : undefined);\n const libraryId = (this.config.embed ? this.extractPandaLibraryId(this.config.embed) : undefined);\n\n window.pandascripttag = window.pandascripttag || [];\n window.pandascripttag.push(() => {\n this.pandaPlayer = new (window as any).PandaPlayer(\n this.pandaContainer!.id,\n {\n video_external_id: videoId,\n library_id: libraryId,\n onReady: () => {\n if (this.primaryColor) {\n try { this.pandaPlayer.setColor('primary', this.primaryColor); } catch {}\n }\n if (this.controlsColor) {\n try { this.pandaPlayer.setColor('secondary', this.controlsColor); } catch {}\n }\n\n const dur = this.pandaPlayer?.getDuration?.() || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) {\n try { this.pandaPlayer.setCurrentTime(start); } catch {}\n }\n if (this.config.autoPlay) {\n try { this.pandaPlayer.play(); } catch {}\n }\n this.ready.emit();\n },\n playerConfigs: {\n autoplay: !!this.config.autoPlay,\n smartAutoplay: !!this.config.autoPlay,\n },\n \n }\n );\n\n this.pandaPlayer.onEvent((event: any) => {\n this.handlePandaEvent(event);\n });\n });\n });\n }\n\n ngOnDestroy() {\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n try {\n this.pandaContainer?.remove?.();\n } catch {}\n }\n\n private async ensurePandaScript(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (window.PandaPlayer) return resolve();\n const existing = document.querySelector(\n 'script[src^=\"https://player.pandavideo.com.br/api.v2.js\"]'\n ) as HTMLScriptElement;\n if (existing) {\n existing.addEventListener(\"load\", () => resolve());\n if ((existing as any).readyState === \"complete\") resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.src = \"https://player.pandavideo.com.br/api.v2.js\";\n script.async = true;\n script.onload = () => resolve();\n document.head.appendChild(script);\n });\n }\n\n private extractPandaVideoId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const v = u.searchParams.get(\"v\") || undefined;\n return v || undefined;\n } catch {\n return undefined;\n }\n }\n\n private extractPandaLibraryId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const { hostname } = u;\n const firstLabel = hostname.split(\".\")[0] || \"\";\n const maybeLib = firstLabel.startsWith(\"player-\")\n ? firstLabel.slice(\"player-\".length)\n : firstLabel;\n return maybeLib || undefined;\n } catch {\n return undefined;\n }\n }\n\n private handlePandaEvent(evt: any) {\n const type = evt?.message || evt?.type;\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (type === \"panda_timeupdate\") {\n if (now - this.pandaProgressThrottle >= THROTTLE_MS) {\n this.pandaProgressThrottle = now;\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n }\n }\n\n if (type === \"panda_pause\") {\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n }\n\n if (type === \"panda_ended\") {\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n this.progressService.ended$.next();\n }\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number,\n opts: { minStartSec?: number; endGuardSec?: number } = {}\n ): number {\n const minStartSec = opts.minStartSec ?? 3;\n const endGuardSec = opts.endGuardSec ?? 2;\n\n const dur = Number(duration) || 0;\n if (dur <= 0) return 0;\n\n const hasTime =\n last_time !== undefined && last_time !== null && last_time !== \"\";\n if (hasTime) {\n let t = Number(last_time);\n if (!isFinite(t) || t < 0) t = 0;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n const hasPercent =\n last_percent !== undefined &&\n last_percent !== null &&\n last_percent !== \"\";\n if (hasPercent) {\n let p = Number(last_percent);\n if (!isFinite(p) || p < 0) p = 0;\n if (p > 1) p = p / 100;\n let t = dur * p;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n return 0;\n }\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\n\n@Component({\n selector: 'app-scaleup-player',\n template: '', // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep iframe[src*=\"scaleup.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `]\n})\nexport class ScaleupPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n private scaleupIframe?: HTMLIFrameElement;\n private scaleupMessageHandler?: (e: MessageEvent) => void;\n private scaleupProgressThrottle = 0;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== 'scaleup') {\n return;\n }\n this.loadScaleupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.scaleupIframe) {\n this.loadScaleupPlayer();\n }\n }\n\n private loadScaleupPlayer() {\n const videoId = this.config.video_id;\n const lastTime = Math.max(0, Math.floor(Number(this.config.last_time) || 0));\n const eventsList =\n \"controlsdisabled,controlsenabled,dispose,durationchange,ended,enterFullWindow,enterpictureinpicture,error,exitFullWindow,firstplay,fullscreenchange,leavepictureinpicture,loadedmetadata,loadstart,pause,play,playerreset,playerresize,playing,posterchange,progress,ratechange,ready,resize,seeked,seeking,textdata,timeupdate,useractive,userinactive,volumechange,waiting\";\n const scaleupSrc = `https://player.scaleup.com.br/embed/${videoId}?seekTo=${lastTime}&events=${eventsList}&autoplay=${this.config.autoPlay}`;\n\n const host: HTMLElement = this.elementRef.nativeElement;\n \n if (this.scaleupIframe) {\n this.scaleupIframe.remove();\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = scaleupSrc;\n iframe.allow = \"autoplay; fullscreen; encrypted-media; picture-in-picture\";\n iframe.referrerPolicy = \"origin-when-cross-origin\";\n iframe.frameBorder = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.position = \"absolute\";\n iframe.style.top = \"0\";\n iframe.style.left = \"0\";\n\n host.appendChild(iframe);\n this.scaleupIframe = iframe;\n\n // Emite evento ready quando o iframe carregar\n iframe.onload = () => {\n this.ready.emit();\n };\n\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n this.scaleupMessageHandler = (e: MessageEvent) => {\n try {\n const originOk =\n typeof e.origin === \"string\" &&\n e.origin.includes(\"scaleup.com.br\");\n if (!originOk) return;\n\n const data =\n typeof e.data === \"string\"\n ? (() => {\n try {\n return JSON.parse(e.data);\n } catch {\n return undefined;\n }\n })()\n : e.data;\n if (!data || typeof data !== \"object\") return;\n\n const type = (\n data.event ||\n data.type ||\n data.message ||\n data.eventName ||\n \"\"\n )\n .toString()\n .toLowerCase();\n if (!type) return;\n\n const t = Number(\n (data.currentTime ?? data.time ?? data.position) || 0\n );\n const d = Number((data.duration ?? data.totalDuration) || 0);\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (\n type.includes(\"timeupdate\") ||\n type === \"playing\" ||\n type === \"progress\"\n ) {\n if (now - this.scaleupProgressThrottle >= THROTTLE_MS) {\n this.scaleupProgressThrottle = now;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n }\n }\n if (type === \"pause\" || type === \"paused\") {\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n }\n if (type === \"ended\" || type === \"end\" || type === \"complete\") {\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n this.progressService.ended$.next();\n }\n } catch {}\n };\n window.addEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n ngOnDestroy() {\n try {\n this.scaleupIframe?.remove();\n } catch {}\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n this.scaleupMessageHandler = undefined;\n }\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalLoadingService {\n private loadingElement: HTMLElement | null;\n\n constructor(@Inject(DOCUMENT) private document: Document) {\n this.loadingElement = this.document.getElementById('global-loading');\n }\n\n public hide() {\n if (this.loadingElement) {\n this.loadingElement.style.opacity = '0';\n setTimeout(() => {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'none';\n }\n }, 500); // Duração da transição do CSS\n }\n }\n\n public show() {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'flex';\n this.loadingElement.style.opacity = '1';\n }\n }\n}","import { CommonModule } from \"@angular/common\";\nimport { Component, Inject, Input } from \"@angular/core\";\n\nimport { PlyrPlayerComponent } from \"../players/plyr-player/plyr-player.component\";\nimport { PandaPlayerComponent } from \"../players/panda-player/panda-player.component\";\nimport { ScaleupPlayerComponent } from \"../players/scaleup-player/scaleup-player.component\";\n\nimport { WebplayerConfig, WEPLAYER_CONFIG } from \"../webplayer.types\";\nimport { GlobalLoadingService } from \"../global.service\";\n\n@Component({\n selector: \"app-player-loader\",\n template: `\n <div style=\"width: 100%; height: 100%;\">\n <div [ngSwitch]=\"config?.video_host\" style=\"width: 100%; height: 100%;\">\n <app-plyr-player\n *ngSwitchCase=\"'hls'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'mp4'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'youtube'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'vimeo'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-panda-player\n *ngSwitchCase=\"'panda'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-panda-player>\n <app-scaleup-player\n *ngSwitchCase=\"'scaleup'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-scaleup-player>\n <div *ngSwitchDefault>\n <p>Player não suportado ou configuração não fornecida.</p>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [\n CommonModule,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n ],\n})\nexport class PlayerLoaderComponent {\n @Input() config!: WebplayerConfig | any;\n playerType: \"plyr\" | \"panda\" | \"scaleup\" | null = null;\n\n constructor(\n @Inject(WEPLAYER_CONFIG) private defaultConfig: WebplayerConfig,\n private globalLoading: GlobalLoadingService\n ) {\n this.config = { ...this.defaultConfig, ...this.config };\n this.playerType = this.getPlayerType(this.config.videoUrl);\n }\n\n private getPlayerType(videoUrl: string): \"plyr\" | \"panda\" | \"scaleup\" | null {\n if (videoUrl?.includes(\"panda\")) return \"panda\";\n if (videoUrl?.includes(\"scaleup\")) return \"scaleup\";\n if (\n videoUrl?.includes(\"vimeo\") ||\n videoUrl?.includes(\"youtube\") ||\n videoUrl?.includes(\".m3u8\") ||\n videoUrl?.includes(\".mp4\")\n )\n return \"plyr\";\n return \"plyr\";\n }\n\n onPlayerReady() {\n this.globalLoading.hide();\n }\n}\n","import { Component, Output, EventEmitter, OnDestroy, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { WebplayerConfig } from './webplayer.types';\nimport { WebplayerConfigService } from './webplayer-config.service';\nimport { WebplayerProgress, WebplayerProgressService } from './progress.service';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\n\n@Component({\n selector: 'edm-webplayer',\n template: `\n <app-player-loader [config]=\"config\" *ngIf=\"config\"></app-player-loader>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [CommonModule, PlayerLoaderComponent],\n})\nexport class WebplayerComponent implements OnInit, OnDestroy {\n @Output('playProgress') progress = new EventEmitter<WebplayerProgress>();\n @Output('playEnded') ended = new EventEmitter<void>();\n\n config: WebplayerConfig | null = null;\n private subscriptions = new Subscription();\n\n constructor(\n private configService: WebplayerConfigService,\n private progressService: WebplayerProgressService\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.add(\n this.configService.config$.subscribe(config => {\n this.config = config;\n })\n );\n\n this.subscriptions.add(\n this.progressService.progress$.subscribe(p => this.progress.emit(p))\n );\n\n this.subscriptions.add(\n this.progressService.ended$.subscribe(() => this.ended.emit())\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'timeFormat', standalone: true })\nexport class TimeFormatPipe implements PipeTransform {\n transform(seconds: number | null | undefined): string {\n const val = typeof seconds === 'number' && isFinite(seconds) ? seconds : 0;\n const sec = Math.floor(val % 60).toString().padStart(2, '0');\n const min = Math.floor(val / 60).toString().padStart(2, '0');\n const hrs = Math.floor(val / 3600);\n if (hrs > 0) {\n const mm = Math.floor((val % 3600) / 60).toString().padStart(2, '0');\n return `${hrs}:${mm}:${sec}`;\n }\n return `${min}:${sec}`;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { GlobalLoadingService } from '../../global.service';\nimport { WebplayerConfigService } from '../../webplayer-config.service';\n\ndeclare global {\n interface Window {\n __onGCastApiAvailable?: (isAvailable: boolean, errorInfo?: unknown) => void;\n cast?: any;\n chrome?: any;\n }\n}\n\nconst CAST_SDK_URL =\n 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';\n\nlet castSdkPromise: Promise<void> | null = null;\n\nfunction loadCastSdk(): Promise<void> {\n const hasCast = typeof window !== 'undefined' && window.cast?.framework;\n if (hasCast) {\n return Promise.resolve();\n }\n\n if (castSdkPromise) {\n return castSdkPromise;\n }\n\n castSdkPromise = new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (window.__onGCastApiAvailable === callback) {\n delete window.__onGCastApiAvailable;\n }\n };\n\n const callback = (isAvailable: boolean, errorInfo?: unknown) => {\n cleanup();\n if (isAvailable) {\n resolve();\n } else {\n reject(\n errorInfo instanceof Error\n ? errorInfo\n : new Error('Chromecast SDK não disponível.')\n );\n }\n };\n\n window.__onGCastApiAvailable = callback;\n\n const scriptSelector = `script[src=\"${CAST_SDK_URL}\"]`;\n let script = document.querySelector(scriptSelector) as\n | HTMLScriptElement\n | null;\n\n if (script) {\n script.addEventListener(\n 'error',\n () => {\n cleanup();\n reject(new Error('Erro ao carregar o SDK do Chromecast.'));\n },\n { once: true }\n );\n } else {\n script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = CAST_SDK_URL;\n script.async = true;\n script.defer = true;\n script.addEventListener(\n 'error',\n () => {\n cleanup();\n reject(new Error('Erro ao carregar o SDK do Chromecast.'));\n },\n { once: true }\n );\n document.head.appendChild(script);\n }\n }).catch((error) => {\n castSdkPromise = null;\n throw error;\n });\n\n return castSdkPromise;\n}\n\n@Component({\n selector: 'app-chromecast-player',\n standalone: true,\n imports: [CommonModule],\n template: `\n <section class=\"chromecast\">\n <header>\n <h1>Chromecast</h1>\n <p *ngIf=\"statusMessage\">{{ statusMessage }}</p>\n </header>\n\n <div class=\"actions\">\n <button\n type=\"button\"\n (click)=\"startCasting()\"\n [disabled]=\"!isReady || isLoading\"\n >\n {{ isCasting ? 'Reiniciar transmissão' : 'Transmitir para a TV' }}\n </button>\n <button\n type=\"button\"\n class=\"secondary\"\n (click)=\"stopCasting()\"\n [disabled]=\"!isCasting\"\n >\n Encerrar transmissão\n </button>\n </div>\n\n <p *ngIf=\"errorMessage\" class=\"error\">{{ errorMessage }}</p>\n <p *ngIf=\"helpMessage\" class=\"help\">{{ helpMessage }}</p>\n </section>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .chromecast {\n color: #fff;\n background: #121212;\n width: 100%;\n height: 100%;\n padding: 2rem;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n gap: 1.5rem;\n }\n\n header h1 {\n margin: 0;\n font-size: clamp(1.5rem, 2vw, 2.25rem);\n }\n\n header p {\n margin: 0.5rem 0 0;\n font-size: 1rem;\n opacity: 0.85;\n }\n\n .actions {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n }\n\n button {\n border: none;\n padding: 0.75rem 1.5rem;\n border-radius: 999px;\n font-size: 1rem;\n cursor: pointer;\n background: #e3fb63;\n color: #1b1b1b;\n transition: transform 0.2s ease, box-shadow 0.2s ease,\n opacity 0.2s ease;\n }\n\n button:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(227, 251, 99, 0.3);\n }\n\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n button.secondary {\n background: transparent;\n border: 1px solid rgba(255, 255, 255, 0.35);\n color: rgba(255, 255, 255, 0.8);\n }\n\n .error {\n color: #ff7d7d;\n margin: 0;\n }\n\n .help {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.8;\n }\n `,\n ],\n})\nexport class ChromecastPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n\n statusMessage = 'Preparando Chromecast...';\n helpMessage = 'Certifique-se de que o dispositivo Chromecast está ligado e na mesma rede.';\n errorMessage: string | null = null;\n\n isReady = false;\n isCasting = false;\n isLoading = false;\n lastLessonTokenCache: any | boolean = false;\n\n private streamUrl: string | null = null;\n private streamMimeType = 'application/x-mpegURL';\n private requiresEmbedReceiver = false;\n private sessionListener?: (event: any) => void;\n private castEventType: any;\n private lastFetchSignature: string | null = null;\n\n constructor(\n private globalLoading: GlobalLoadingService,\n private configService: WebplayerConfigService\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.applyStreamSource(this.config);\n const initialSessionId = this.getSessionId(\n window.cast?.framework?.CastContext?.getInstance?.()?.getCurrentSession?.()\n );\n await this.ensureConfigFromToken(\n this.resolveAccessToken(this.config),\n initialSessionId\n );\n\n if (!this.streamUrl) {\n this.errorMessage =\n 'Não foi possível identificar uma mídia compatível para transmitir via Chromecast.';\n this.statusMessage = '';\n this.globalLoading.hide();\n return;\n }\n\n try {\n await loadCastSdk();\n this.setupCastContext();\n } catch (error) {\n this.errorMessage = this.describeError(error);\n this.statusMessage = '';\n } finally {\n this.globalLoading.hide();\n }\n }\n\n ngOnDestroy(): void {\n const castApi = window.cast?.framework;\n if (castApi && this.sessionListener && this.castEventType) {\n const context = castApi.CastContext.getInstance();\n context.removeEventListener(this.castEventType, this.sessionListener);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config']) {\n const nextConfig = changes['config'].currentValue as WebplayerConfig | null;\n this.applyStreamSource(nextConfig);\n if (!changes['config'].firstChange) {\n const sessionId = this.getSessionId(\n window.cast?.framework?.CastContext?.getInstance?.()?.getCurrentSession?.()\n );\n void this.ensureConfigFromToken(\n this.resolveAccessToken(nextConfig),\n sessionId\n );\n }\n }\n }\n\n async startCasting(): Promise<void> {\n if (!this.isReady || this.isLoading || !this.streamUrl) {\n return;\n }\n\n this.errorMessage = null;\n this.isLoading = true;\n\n const castApi = window.cast?.framework;\n const chromeCast = window.chrome?.cast;\n\n if (!castApi || !chromeCast) {\n this.errorMessage = 'Chromecast não está disponível neste navegador.';\n this.isLoading = false;\n return;\n }\n\n try {\n const context = castApi.CastContext.getInstance();\n let session = context.getCurrentSession();\n\n if (!session) {\n await context.requestSession();\n session = context.getCurrentSession();\n }\n\n if (!session) {\n throw new Error('Não foi possível iniciar a sessão do Chromecast.');\n }\n\n const sessionId = this.getSessionId(session);\n const accessToken = await this.ensureAccessTokenForSession(sessionId);\n const mediaInfo = new chromeCast.media.MediaInfo(\n this.streamUrl ?? 'data:text/plain,Receiver handles playback',\n this.streamMimeType\n );\n\n mediaInfo.metadata = new chromeCast.media.GenericMediaMetadata();\n const metadataTitle =\n this.config?.video_external_id ||\n this.config?.embed ||\n 'EDM Webplayer';\n mediaInfo.metadata.title = metadataTitle;\n if (this.requiresEmbedReceiver) {\n try {\n mediaInfo.streamType =\n chromeCast.media.StreamType?.NONE ??\n chromeCast.media.StreamType?.BUFFERED ??\n 'NONE';\n } catch {}\n }\n\n if (accessToken) {\n const customData: Record<string, unknown> = {\n ...(typeof mediaInfo.customData === 'object' && mediaInfo.customData !== null\n ? mediaInfo.customData\n : {}),\n accessToken,\n };\n if (sessionId) {\n customData['chromecast_session_id'] = sessionId;\n customData['session_id'] = sessionId;\n }\n customData['video_host'] = this.config.video_host;\n const lessonId = this.resolveLessonId(this.config);\n if (lessonId) {\n customData['lesson_id'] = lessonId;\n }\n if (this.config.embed) {\n customData['embed'] = this.config.embed;\n }\n customData['requiresEmbedReceiver'] = this.requiresEmbedReceiver;\n mediaInfo.customData = customData;\n await this.ensureConfigFromToken(accessToken, sessionId);\n } else {\n this.errorMessage = 'Não foi possível obter o token de acesso para o Chromecast.';\n return;\n }\n\n const request = new chromeCast.media.LoadRequest(mediaInfo);\n request.autoplay = this.config?.autoPlay ?? true;\n\n if (typeof this.config?.last_time === 'number') {\n request.currentTime = this.config.last_time;\n }\n\n await session.loadMedia(request);\n\n this.isCasting = true;\n this.statusMessage = 'Transmissão ativa no Chromecast.';\n this.errorMessage = null;\n } catch (error) {\n this.errorMessage = this.describeError(error);\n this.isCasting = false;\n } finally {\n this.isLoading = false;\n }\n }\n\n stopCasting(): void {\n const castApi = window.cast?.framework;\n if (!castApi) {\n return;\n }\n\n const context = castApi.CastContext.getInstance();\n const session = context.getCurrentSession();\n\n if (!session) {\n return;\n }\n\n session.endSession(true);\n this.isCasting = false;\n this.statusMessage = 'Transmissão encerrada.';\n this.lastFetchSignature = null;\n this.lastLessonTokenCache = null;\n }\n\n private setupCastContext(): void {\n const castApi = window.cast?.framework;\n const chromeCast = window.chrome?.cast;\n\n if (!castApi || !chromeCast) {\n this.errorMessage =\n 'Chromecast SDK carregado, porém indisponível neste ambiente.';\n return;\n }\n\n const context = castApi.CastContext.getInstance();\n context.setOptions({\n receiverApplicationId: this.resolveReceiverApplicationId(\n chromeCast?.media?.DEFAULT_MEDIA_RECEIVER_APP_ID ?? 'CC1AD845'\n ),\n autoJoinPolicy:\n chromeCast?.AutoJoinPolicy?.ORIGIN_SCOPED ??\n chromeCast?.AutoJoinPolicy ??\n 'origin_scoped',\n });\n\n const listener = (event: any) => {\n const state = event?.sessionState;\n if (state === castApi.SessionState.SESSION_STARTED) {\n this.isCasting = true;\n this.statusMessage = 'Transmissão ativa no Chromecast.';\n const currentSession = context.getCurrentSession();\n const token = this.extractAccessTokenFromSession(currentSession);\n const sessionId = this.getSessionId(currentSession);\n if (token) {\n void this.ensureConfigFromToken(token, sessionId);\n } else if (sessionId) {\n void this.ensureAccessTokenForSession(sessionId).then((resolvedToken) => {\n if (resolvedToken) {\n void this.ensureConfigFromToken(resolvedToken, sessionId);\n }\n });\n }\n } else if (state === castApi.SessionState.SESSION_ENDED) {\n this.isCasting = false;\n this.statusMessage =\n 'Sessão encerrada. Clique em \"Transmitir para a TV\" para iniciar novamente.';\n this.lastFetchSignature = null;\n this.lastLessonTokenCache = null;\n }\n };\n\n this.castEventType = castApi.CastContextEventType.SESSION_STATE_CHANGED;\n this.sessionListener = listener;\n context.addEventListener(this.castEventType, listener);\n\n const activeSession = context.getCurrentSession();\n if (activeSession) {\n this.isCasting = true;\n this.statusMessage = 'Transmissão ativa no Chromecast.';\n const token = this.extractAccessTokenFromSession(activeSession);\n const sessionId = this.getSessionId(activeSession);\n if (token) {\n void this.ensureConfigFromToken(token, sessionId);\n }\n } else {\n this.statusMessage =\n 'Chromecast pronto. Clique em \"Transmitir para a TV\" para começar.';\n }\n\n this.isReady = true;\n }\n\n private resolveReceiverApplicationId(defaultId: string): string {\n const globalId =\n (typeof window !== 'undefined' &&\n (window as any).__EDM_CHROMECAST_APP_ID) ||\n null;\n\n if (typeof globalId === 'string' && globalId.trim() !== '') {\n return globalId.trim();\n }\n\n return defaultId;\n }\n\n private applyStreamSource(config: WebplayerConfig | null | undefined): void {\n const source = this.resolveStreamSource(config);\n this.streamUrl = source?.url ?? null;\n this.streamMimeType = source?.mimeType ?? 'application/x-mpegURL';\n this.requiresEmbedReceiver = source?.requiresEmbed ?? false;\n }\n\n private resolveStreamSource(\n config: WebplayerConfig | null | undefined\n ): { url: string; mimeType: string; requiresEmbed?: boolean } | null {\n if (!config) {\n return null;\n }\n\n const host = config.video_host;\n if (host === 'mp4') {\n const direct =\n this.tryDecodeBase64(config.video_external_id) ??\n this.tryDecodeBase64(config.video_id);\n if (direct) {\n return { url: direct, mimeType: 'video/mp4' };\n }\n return null;\n }\n\n if (host === 'hls') {\n const direct =\n this.tryDecodeBase64(config.video_id) ??\n this.tryDecodeBase64(config.video_external_id);\n return direct ? { url: direct, mimeType: 'application/x-mpegURL' } : null;\n }\n\n if (host === 'panda') {\n const fromEmbed = this.buildPandaHlsUrl(\n config.embed,\n config.video_external_id\n );\n if (fromEmbed) {\n return { url: fromEmbed, mimeType: 'application/x-mpegURL' };\n }\n\n const direct =\n this.tryDecodeBase64(config.video_external_id) ??\n this.tryDecodeBase64(config.video_id);\n if (direct) {\n const mime =\n direct.toLowerCase().includes('.mp4') ||\n direct.toLowerCase().includes('format=mp4')\n ? 'video/mp4'\n : 'application/x-mpegURL';\n return { url: direct, mimeType: mime };\n }\n\n const normalizedEmbed = this.normalizeEmbedUrl(config.embed);\n if (normalizedEmbed) {\n return {\n url: normalizedEmbed,\n mimeType: 'text/html',\n requiresEmbed: true,\n };\n }\n return null;\n }\n\n return null;\n }\n\n private tryDecodeBase64(value?: string | null): string | null {\n if (!value) {\n return null;\n }\n try {\n return atob(value);\n } catch {\n return value;\n }\n }\n\n private buildPandaHlsUrl(\n embedUrl?: string | null,\n fallbackVideoId?: string | null\n ): string | null {\n const parsed = this.safeParseUrl(embedUrl);\n const videoId =\n fallbackVideoId ??\n parsed?.searchParams.get('v') ??\n undefined;\n\n const host = parsed?.host ?? undefined;\n if (!host || !videoId) {\n return null;\n }\n\n // Panda HLS URLs usually follow /hls/<videoId>/playlist.m3u8\n return `https://${host}/hls/${videoId}/playlist.m3u8`;\n }\n\n private normalizeEmbedUrl(raw?: string | null): string | null {\n const parsed = this.safeParseUrl(raw);\n if (!parsed) {\n return null;\n }\n parsed.searchParams.set('wmode', 'opaque');\n parsed.searchParams.set('chromecast', '1');\n return parsed.toString();\n }\n\n private resolveAccessToken(\n config: WebplayerConfig | null | undefined\n ): string | null {\n const token =\n config?.accessToken ??\n (config as unknown as { access_token?: string })?.access_token ??\n null;\n\n if (typeof token === 'string' && token.trim() !== '') {\n return token;\n }\n\n return null;\n }\n\n private getSessionId(session: any): string | null {\n if (!session) {\n return null;\n }\n\n try {\n if (typeof session.getSessionId === 'function') {\n const value = session.getSessionId();\n if (typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n } catch {}\n\n const fallback = (session as { sessionId?: string }).sessionId;\n return typeof fallback === 'string' && fallback.trim() !== ''\n ? fallback\n : null;\n }\n\n private extractAccessTokenFromSession(session: any): string | null {\n if (!session) {\n return null;\n }\n\n const media =\n typeof session.getMediaSession === 'function'\n ? session.getMediaSession()\n : null;\n const customData =\n (media?.customData as Record<string, unknown>) ??\n (typeof session.getSessionObj === 'function'\n ? session.getSessionObj()?.customData\n : undefined) ??\n (session as { customData?: unknown }).customData;\n\n if (customData && typeof customData === 'object') {\n const token =\n (customData as { accessToken?: string }).accessToken ??\n (customData as { access_token?: string }).access_token;\n if (typeof token === 'string' && token.trim() !== '') {\n return token;\n }\n }\n\n return null;\n }\n\n private async ensureConfigFromToken(\n accessToken: string | null | undefined,\n sessionId?: string | null\n ): Promise<void> {\n if (!accessToken) {\n return;\n }\n\n const signature = `${accessToken}::${sessionId ?? ''}`;\n if (this.lastFetchSignature === signature) {\n return;\n }\n\n const resolver = (window as any).__edmFetchPlayerConfig as\n | ((\n token: string,\n options?: { sessionId?: string | null; platform?: string }\n ) => Promise<WebplayerConfig | null>)\n | undefined;\n\n if (typeof resolver !== 'function') {\n return;\n }\n\n try {\n const remoteConfig = await resolver(accessToken, {\n sessionId,\n platform: 'chromecast',\n });\n if (remoteConfig) {\n this.lastFetchSignature = signature;\n remoteConfig.accessToken = accessToken;\n this.configService.setConfig(remoteConfig);\n this.config = remoteConfig;\n this.applyStreamSource(this.config);\n }\n } catch (error) {\n console.error(\n 'Falha ao atualizar a configuração para o Chromecast.',\n error\n );\n }\n }\n\n private describeError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return 'Ocorreu um erro inesperado ao comunicar com o Chromecast.';\n }\n\n private async ensureAccessTokenForSession(\n sessionId: string | null\n ): Promise<string | null> {\n const fallbackToken = this.resolveAccessToken(this.config);\n if (!sessionId) {\n return fallbackToken;\n }\n\n const lessonId = this.resolveLessonId(this.config);\n if (!lessonId) {\n return fallbackToken;\n }\n\n const endpoint = this.buildChromecastTokenEndpoint(this.config, lessonId);\n if (!endpoint) {\n return fallbackToken;\n }\n\n const cacheKey = `${sessionId}::${lessonId}`;\n if (\n this.lastLessonTokenCache &&\n this.lastLessonTokenCache.sessionKey === cacheKey\n ) {\n return this.lastLessonTokenCache.token;\n }\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ chromecast_session_id: sessionId }),\n credentials: 'include',\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json();\n const token =\n (data?.access_token as string | undefined) ??\n (data?.accessToken as string | undefined) ??\n null;\n\n if (typeof token === 'string' && token.trim() !== '') {\n this.lastLessonTokenCache = { sessionKey: cacheKey, token };\n return token;\n }\n } catch (error) {\n console.error('Falha ao obter token para Chromecast.', error);\n }\n\n return fallbackToken;\n }\n\n private resolveLessonId(\n config: WebplayerConfig | null | undefined\n ): string | null {\n if (!config) return null;\n if (config.lesson_id !== undefined && config.lesson_id !== null) {\n const value = String(config.lesson_id).trim();\n if (value !== '') return value;\n }\n\n const progressUrl = config.progress_url;\n const parsed = this.safeParseUrl(progressUrl);\n const lessonId = parsed?.searchParams.get('lesson_id');\n return lessonId ?? null;\n }\n\n private buildChromecastTokenEndpoint(\n config: WebplayerConfig | null | undefined,\n lessonId: string\n ): string | null {\n if (!config) return null;\n const runningLocally =\n typeof window !== 'undefined' &&\n /^(localhost|127\\.0\\.0\\.1)/.test(window.location.hostname);\n if (runningLocally) {\n return `/api/v1/app/lessons/${lessonId}/access-token-chromecast`;\n }\n const progressUrl = config.progress_url;\n const parsed = this.safeParseUrl(progressUrl);\n if (!parsed) return null;\n const origin = parsed.origin.replace(/^http:/, 'https:');\n return `${origin}/api/v1/app/lessons/${lessonId}/access-token-chromecast`;\n }\n\n private safeParseUrl(raw?: string | null): URL | null {\n if (!raw) return null;\n try {\n return new URL(raw);\n } catch {\n try {\n return new URL(decodeURIComponent(raw));\n } catch {\n return null;\n }\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerComponent } from './webplayer.component';\nimport { TimeFormatPipe } from './utils/time-format.pipe';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\nimport { PlyrPlayerComponent } from './players/plyr-player/plyr-player.component';\nimport { PandaPlayerComponent } from './players/panda-player/panda-player.component';\nimport { ScaleupPlayerComponent } from './players/scaleup-player/scaleup-player.component';\nimport { ChromecastPlayerComponent } from './players/chromecast-player/chromecast-player.component';\n\n@NgModule({\n imports: [\n CommonModule,\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n ChromecastPlayerComponent,\n TimeFormatPipe,\n ],\n exports: [\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n ChromecastPlayerComponent,\n TimeFormatPipe,\n ]\n})\nexport class WebplayerModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebplayerProgressService","i1.GlobalLoadingService","i1.WebplayerConfigService","i2.WebplayerProgressService","i2.WebplayerConfigService","i3"],"mappings":"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"}
1
+ {"version":3,"file":"edm-webplayer-webplayer-angular.mjs","sources":["../../../projects/webplayer-angular/src/webplayer.types.ts","../../../projects/webplayer-angular/src/webplayer-config.service.ts","../../../projects/webplayer-angular/src/progress.service.ts","../../../projects/webplayer-angular/src/players/plyr-player/plyr-player.component.ts","../../../projects/webplayer-angular/src/players/panda-player/panda-player.component.ts","../../../projects/webplayer-angular/src/players/scaleup-player/scaleup-player.component.ts","../../../projects/webplayer-angular/src/global.service.ts","../../../projects/webplayer-angular/src/player-loader/player-loader.component.ts","../../../projects/webplayer-angular/src/webplayer.component.ts","../../../projects/webplayer-angular/src/utils/time-format.pipe.ts","../../../projects/webplayer-angular/src/webplayer.module.ts","../../../projects/webplayer-angular/src/edm-webplayer-webplayer-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface WebplayerConfig {\n video_host: 'youtube' | 'vimeo' | 'mp4' | 'hls' | 'panda' | 'scaleup';\n video_id: string | null;\n library_id?: string | number | null;\n video_external_id?: string | null;\n last_time?: number | null;\n last_percent?: number;\n embed?: string | null;\n watermark?: string;\n progress_url?: string;\n is_live?: boolean; // is the video live\n mirror?: boolean; // mirror the video\n autoPlay?: boolean; // auto play the video\n ui?: {\n colors?: {\n bg?: string;\n alert?: string;\n 'font-bt'?: string;\n 'text-color'?: string;\n 'progress-view-off'?: string;\n };\n };\n}\n\nexport const WEPLAYER_CONFIG = new InjectionToken<WebplayerConfig>('webplayer.config');","import { Injectable, Inject, Optional } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { WebplayerConfig, WEPLAYER_CONFIG } from './webplayer.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WebplayerConfigService {\n private configSubject: BehaviorSubject<WebplayerConfig | null>;\n\n public get config$(): Observable<WebplayerConfig | null> {\n return this.configSubject.asObservable();\n }\n\n constructor(@Optional() @Inject(WEPLAYER_CONFIG) providedConfig: WebplayerConfig) {\n this.configSubject = new BehaviorSubject<WebplayerConfig | null>(providedConfig);\n }\n\n setConfig(config: Partial<WebplayerConfig>) {\n const currentConfig = this.configSubject.getValue();\n const newConfig = { ...(currentConfig || {}), ...config } as WebplayerConfig;\n this.configSubject.next(newConfig);\n }\n\n getConfig(): WebplayerConfig | null {\n return this.configSubject.getValue();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface WebplayerProgress {\n currentTime: number;\n duration: number;\n percent: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WebplayerProgressService {\n\n public progress$ = new Subject<WebplayerProgress>();\n public ended$ = new Subject<void>();\n\n private key(videoKey: string) { return `webplayer:${videoKey}`; }\n\n saveProgress(videoKey: string, time: number) {\n try {\n localStorage.setItem(this.key(videoKey), String(Math.floor(time)));\n } catch {}\n }\n\n getProgress(videoKey: string): number {\n try {\n return Number(localStorage.getItem(this.key(videoKey)) || 0);\n } catch {\n return 0;\n }\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n Output,\n EventEmitter\n} from \"@angular/core\";\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport * as Plyr from 'plyr';\nimport \"plyr/dist/plyr.css\";\nimport Hls from \"hls.js\";\nimport { WebplayerConfig } from \"../../webplayer.types\";\nimport { WebplayerProgressService } from \"../../progress.service\";\n\n@Component({\n selector: \"app-plyr-player\",\n template: `<video #video playsinline></video>`,\n standalone: true,\n imports: [CommonModule],\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n --plyr-color-main: var(--theme-alert, #19a6d9);\n --plyr-color-hover: var(--theme-alert, #2dbbff);\n --plyr-progress-buffer-background: var(--theme-progress-view-off, rgba(255, 255, 255, 0.25));\n --plyr-control-background: var(--theme-bg, rgba(0, 0, 0, 0.8));\n --plyr-control-color: var(--theme-text-color, #fff);\n --plyr-control-button-color: var(--theme-font-bt, #fff);\n }\n :host ::ng-deep .plyr__controls {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__controls button {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__progress__buffer {\n background-color: var(--plyr-progress-buffer-background) !important;\n }\n :host ::ng-deep .plyr,\n :host ::ng-deep .plyr__video-wrapper,\n :host ::ng-deep .plyr__video-embed,\n :host ::ng-deep .plyr__video-embed > iframe,\n :host ::ng-deep video {\n width: 100% !important;\n height: 100% !important;\n aspect-ratio: auto !important;\n top: 0 !important;\n left: 0 !important;\n }\n :host ::ng-deep .mirror {\n transform: scaleX(-1) !important;\n -webkit-transform: scaleX(-1) !important;\n }\n :host ::ng-deep .plyr--video .plyr__control.plyr__tab-focus,\n :host ::ng-deep .plyr--video .plyr__control:hover,\n :host ::ng-deep .plyr--video .plyr__control[aria-expanded=true] {\n background: var(--plyr-color-hover) !important;\n color: var(--plyr-control-button-color) !important;\n }\n\n :host ::ng-deep .plyr--full-ui input[type=range] {\n color: var(--plyr-color-main) !important;\n }\n\n :host ::ng-deep .plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before {\n background: var(--plyr-color-main) !important;\n }\n\n :host ::ng-deep .plyr__menu__container {\n background: var(--plyr-control-background) !important;\n }\n\n :host ::ng-deep .ytp-more-videos-view .ytp-suggestions{\n pointer-events: none !important;\n }\n `,\n ],\n})\nexport class PlyrPlayerComponent\n implements AfterViewInit, OnDestroy, OnChanges, OnInit\n{\n @ViewChild(\"video\", { static: true }) videoRef!: ElementRef<HTMLVideoElement>;\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private plyr!: any;\n private hls?: Hls;\n\n constructor(\n private progressService: WebplayerProgressService,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n ngOnInit() {\n console.log(this.config);\n if (this.config?.ui?.colors) {\n this.applyTheme(this.config.ui.colors);\n }\n }\n\n ngAfterViewInit() {\n this.setupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes[\"config\"] && this.plyr) {\n this.setupPlayer();\n }\n }\n\n private applyTheme(colors: { [key: string]: string }) {\n const STYLE_ID = 'webplayer-theme-vars';\n let styleEl = this.document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = this.document.createElement('style');\n styleEl.id = STYLE_ID;\n this.document.head.appendChild(styleEl);\n }\n\n const rootStyle = this.document.documentElement.style;\n const allPairs: Array<[string, string]> = [];\n\n for (const key in colors) {\n if (Object.prototype.hasOwnProperty.call(colors, key)) {\n const cssVarName = `--theme-${key.replace('progresss-', 'progress-')}`;\n const cssVarValue = String(colors[key]);\n allPairs.push([cssVarName, cssVarValue]);\n try { rootStyle.setProperty(cssVarName, cssVarValue); } catch {}\n }\n }\n\n const cssRule = `:root{\n${allPairs.map(([n,v]) => ` ${n}: ${v};`).join('\\n')}\n}`;\n styleEl.textContent = cssRule;\n }\n\n private setupPlayer() {\n if (!this.videoRef) return;\n\n this.hls?.destroy();\n this.plyr?.destroy();\n const speedOptions = [1, 1.25, 1.5, 2]\n this.plyr = new (Plyr as any).default(this.videoRef.nativeElement, {\n controls: [\n \"play-large\",\n \"play\",\n \"progress\",\n \"current-time\",\n \"duration\",\n \"mute\",\n \"volume\",\n \"captions\",\n \"settings\",\n \"pip\",\n \"airplay\",\n \"fullscreen\",\n ],\n youtube: { rel: 0, modestbranding: 1, noCookie: true },\n vimeo: { byline: false, portrait: false, title: false, playsinline: false },\n fullscreen: { enabled: true, fallback: true, iosNative: true, container: null },\n i18n: {\n speed: 'Velocidade',\n },\n speed: {\n selected: 1,\n options: speedOptions\n },\n clickToPlay: true,\n hideControls: false,\n keyboard: { focused: true, global: false },\n muted: false,\n });\n\n this.bindProgressEvents();\n this.loadSource(this.videoRef.nativeElement).then(() => {\n this.setupStartTime();\n });\n\n // Dispara o evento ready quando o player estiver pronto\n this.plyr.on(\"ready\", () => {\n this.ready.emit();\n });\n }\n\n private setupStartTime() {\n const apply = () => {\n const dur = this.plyr.duration || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) this.plyr.currentTime = start;\n this.plyr.off(\"ready\", apply as any);\n };\n this.plyr.on(\"ready\", apply as any);\n }\n\n private bindProgressEvents() {\n const THROTTLE_MS = 300;\n let lastEmit = 0;\n\n const emitProgress = () => {\n const t = this.plyr.currentTime || 0;\n const d = this.plyr.duration || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n };\n\n const onTimeUpdate = () => {\n const now = performance.now();\n if (now - lastEmit >= THROTTLE_MS) {\n lastEmit = now;\n emitProgress();\n }\n parent.postMessage('currentTime:' + (this.plyr.currentTime || 0), \"*\");\n console.log('event: current_time ' + (this.plyr.currentTime || 0));\n };\n this.plyr?.on?.(\"play\", () => {\n parent.postMessage('playing_video', \"*\");\n\n });\n this.plyr?.on?.(\"timeupdate\", onTimeUpdate);\n this.plyr?.on?.(\"pause\", () => {\n emitProgress();\n console.log('event: pause')\n parent.postMessage('paused_video', \"*\");\n });\n this.plyr?.on?.(\"ended\", () => {\n emitProgress();\n parent.postMessage('event: ended', \"*\");\n this.progressService.ended$.next();\n });\n }\n\n private unmuteAfterDelay(\n video?: HTMLVideoElement,\n delayMs = 2000,\n volume = 1\n ) {\n if (!this.config.autoPlay) return;\n setTimeout(() => {\n try {\n if (this.plyr) {\n this.plyr.muted = false;\n this.plyr.volume = volume;\n }\n } catch {}\n try {\n if (video) {\n video.muted = false;\n if (typeof video.volume === \"number\") video.volume = volume;\n }\n } catch {}\n }, delayMs);\n }\n\n private loadSource(\n video: HTMLVideoElement,\n ): Promise<void> {\n\n const setDisabledTopPageClick = () => {\n setTimeout(() => {\n const wrapper = document.querySelector(\n \".plyr__video-wrapper\"\n ) as HTMLElement;\n if (wrapper) {\n const blocker = document.createElement(\"div\");\n blocker.style.position = \"absolute\";\n blocker.style.top = \"0\";\n blocker.style.left = \"0\";\n blocker.style.width = \"100%\";\n blocker.style.height = \"200px\";\n blocker.style.zIndex = \"5\";\n blocker.style.background = \"transparent\";\n blocker.style.pointerEvents = \"auto\";\n wrapper.appendChild(blocker);\n\n const blocker2 = document.createElement(\"div\");\n blocker2.style.position = \"absolute\";\n blocker2.style.bottom = \"80px\";\n blocker2.style.left = \"0\";\n blocker2.style.width = \"100%\";\n blocker2.style.height = \"100px\";\n blocker2.style.zIndex = \"5\";\n blocker2.style.background = \"transparent\";\n blocker2.style.pointerEvents = \"auto\";\n wrapper.appendChild(blocker2);\n }\n\n }, 2500);\n };\n\n return new Promise((resolve) => {\n if (!this.config) {\n return resolve();\n }\n\n if (this.hls) {\n this.hls.destroy();\n this.hls = undefined;\n }\n\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n if (!isMobile) {\n setDisabledTopPageClick();\n }\n\n if (this.config.video_host === \"youtube\" || this.config.video_host === \"vimeo\") {\n const onReady = () => {\n this.plyr.off(\"ready\", onReady);\n const start = this.resolveStartTime(\n this.config.last_time,\n this.config.last_percent,\n this.plyr.duration\n );\n if (start > 0) this.plyr.currentTime = start;\n \n if (this.config.autoPlay || this.config.is_live) {\n setTimeout(() => {\n this.plyr.play();\n }, 1500);\n }\n parent.postMessage('playerIsReadyToPlay', \"*\");\n parent.postMessage('duration:' + this.plyr.duration, \"*\");\n console.log('event: current_time ' + this.plyr.currentTime);\n console.log('event: duration ' + this.plyr.duration);\n console.log('event: ready');\n\n if(this.config.is_live) {\n this.plyr?.on('playing', function() {\n console.log('event: playing_live');\n parent.postMessage('event: playing_live', '*');\n });\n }\n\n if (this.config.mirror) {\n setTimeout(() => {\n document\n .querySelector(`.plyr__video-embed iframe`) // eslint-disable-line\n ?.classList.add(\"mirror\");\n }, 1000);\n }\n };\n this.plyr.on(\"ready\", onReady);\n }\n\n if (this.config.video_host === \"youtube\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_id, provider: \"youtube\" }],\n };\n } else if (this.config.video_host === \"vimeo\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_id, provider: \"vimeo\" }],\n };\n } else if (this.config.video_host === \"mp4\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_external_id, type: \"video/mp4\" }],\n };\n } else if (this.config.video_host === \"hls\") {\n let sourceX = \"\";\n try {\n sourceX = atob(this.config.video_id || '');\n } catch (e) {\n sourceX = this.config.video_id || '';\n }\n const canNative = video.canPlayType(\"application/vnd.apple.mpegurl\");\n\n if (canNative) {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: sourceX, type: \"application/vnd.apple.mpegurl\" }],\n };\n const onLoadedMeta = () => {\n const dur = this.plyr.duration || video.duration || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) { try { this.plyr.currentTime = start; } catch { try { video.currentTime = start; } catch {} } \n }\n if (this.config.autoPlay) {\n try { video.muted = true; } catch {}\n setTimeout(() => {\n try { this.plyr.play(); } catch { try { video.play(); } catch {} }\n this.unmuteAfterDelay(video);\n }, 250);\n }\n video.removeEventListener(\"loadedmetadata\", onLoadedMeta);\n };\n video.addEventListener(\"loadedmetadata\", onLoadedMeta);\n } else if (Hls.isSupported()) {\n this.hls = new Hls({ enableWorker: true, lowLatencyMode: true });\n this.hls.attachMedia(video);\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls!.loadSource(sourceX);\n });\n this.hls.on(Hls.Events.MANIFEST_PARSED, () => {\n const dur = video.duration || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) { try { video.currentTime = start; } catch {} }\n if (this.config.autoPlay) {\n video.muted = true;\n video.play().catch(() => {});\n this.unmuteAfterDelay(video);\n }\n });\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls!.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls!.recoverMediaError();\n break;\n default:\n try { this.hls!.destroy(); } catch {} break;\n }\n }\n });\n } else {\n this.plyr.source = { type: \"video\", sources: [{ src: sourceX }] };\n }\n }\n resolve();\n });\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number,\n opts: { minStartSec?: number; endGuardSec?: number } = {}\n ): number {\n const minStartSec = opts.minStartSec ?? 3;\n const endGuardSec = opts.endGuardSec ?? 2;\n const dur = Number(duration) || 0;\n if (dur <= 0) return 0;\n\n const hasTime = last_time !== undefined && last_time !== null && last_time !== \"\";\n if (hasTime) {\n let t = Number(last_time);\n if (!isFinite(t) || t < 0) t = 0;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n const hasPercent =\n last_percent !== undefined && last_percent !== null && last_percent !== \"\";\n if (hasPercent) {\n let p = Number(last_percent);\n if (!isFinite(p) || p < 0) p = 0;\n if (p > 1) p = p / 100;\n let t = dur * p;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n return 0;\n }\n\n ngOnDestroy() {\n this.hls?.destroy();\n this.plyr?.destroy();\n }\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\n\ndeclare global {\n interface Window {\n pandascripttag?: any[];\n PandaPlayer?: any;\n }\n}\n\n@Component({\n selector: 'app-panda-player',\n template: '', // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep .panda-player,\n :host ::ng-deep iframe[src*=\"pandavideo.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `]\n})\nexport class PandaPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private pandaPlayer?: any;\n private pandaContainer?: HTMLDivElement;\n private pandaProgressThrottle = 0;\n private primaryColor?: string;\n private controlsColor?: string;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService,\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== 'panda') {\n return;\n }\n this.applyTheme();\n this.loadPandaPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.pandaPlayer) {\n this.loadPandaPlayer();\n }\n }\n\n private applyTheme() {\n if (this.config?.ui?.colors) {\n this.primaryColor = this.config.ui.colors['progress-view-off'];\n this.controlsColor = this.config.ui.colors['text-color'];\n }\n }\n\n private loadPandaPlayer() {\n if (!this.config.embed) {\n return;\n }\n\n this.ensurePandaScript().then(() => {\n const host: HTMLElement = this.elementRef.nativeElement;\n console.log('Panda Player Config:', this.config, host);\n if (!this.pandaContainer) {\n this.pandaContainer = document.createElement(\"div\");\n this.pandaContainer.style.width = \"100%\";\n this.pandaContainer.style.height = \"100%\";\n this.pandaContainer.id = `panda-${this.config.video_id || Math.random().toString(36).slice(2)}`;\n host.appendChild(this.pandaContainer);\n }\n\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n\n const videoId = this.config.video_external_id || (this.config.embed ? this.extractPandaVideoId(this.config.embed) : undefined);\n const libraryId = (this.config.embed ? this.extractPandaLibraryId(this.config.embed) : undefined);\n\n window.pandascripttag = window.pandascripttag || [];\n window.pandascripttag.push(() => {\n this.pandaPlayer = new (window as any).PandaPlayer(\n this.pandaContainer!.id,\n {\n video_external_id: videoId,\n library_id: libraryId,\n onReady: () => {\n if (this.primaryColor) {\n try { this.pandaPlayer.setColor('primary', this.primaryColor); } catch {}\n }\n if (this.controlsColor) {\n try { this.pandaPlayer.setColor('secondary', this.controlsColor); } catch {}\n }\n\n const dur = this.pandaPlayer?.getDuration?.() || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) {\n try { this.pandaPlayer.setCurrentTime(start); } catch {}\n }\n if (this.config.autoPlay) {\n try { this.pandaPlayer.play(); } catch {}\n }\n this.ready.emit();\n },\n playerConfigs: {\n autoplay: !!this.config.autoPlay,\n smartAutoplay: !!this.config.autoPlay,\n },\n \n }\n );\n\n this.pandaPlayer.onEvent((event: any) => {\n this.handlePandaEvent(event);\n });\n });\n });\n }\n\n ngOnDestroy() {\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n try {\n this.pandaContainer?.remove?.();\n } catch {}\n }\n\n private async ensurePandaScript(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (window.PandaPlayer) return resolve();\n const existing = document.querySelector(\n 'script[src^=\"https://player.pandavideo.com.br/api.v2.js\"]'\n ) as HTMLScriptElement;\n if (existing) {\n existing.addEventListener(\"load\", () => resolve());\n if ((existing as any).readyState === \"complete\") resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.src = \"https://player.pandavideo.com.br/api.v2.js\";\n script.async = true;\n script.onload = () => resolve();\n document.head.appendChild(script);\n });\n }\n\n private extractPandaVideoId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const v = u.searchParams.get(\"v\") || undefined;\n return v || undefined;\n } catch {\n return undefined;\n }\n }\n\n private extractPandaLibraryId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const { hostname } = u;\n const firstLabel = hostname.split(\".\")[0] || \"\";\n const maybeLib = firstLabel.startsWith(\"player-\")\n ? firstLabel.slice(\"player-\".length)\n : firstLabel;\n return maybeLib || undefined;\n } catch {\n return undefined;\n }\n }\n\n private handlePandaEvent(evt: any) {\n const type = evt?.message || evt?.type;\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (type === \"panda_timeupdate\") {\n if (now - this.pandaProgressThrottle >= THROTTLE_MS) {\n this.pandaProgressThrottle = now;\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n }\n }\n\n if (type === \"panda_pause\") {\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n }\n\n if (type === \"panda_ended\") {\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n this.progressService.ended$.next();\n }\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number,\n opts: { minStartSec?: number; endGuardSec?: number } = {}\n ): number {\n const minStartSec = opts.minStartSec ?? 3;\n const endGuardSec = opts.endGuardSec ?? 2;\n\n const dur = Number(duration) || 0;\n if (dur <= 0) return 0;\n\n const hasTime =\n last_time !== undefined && last_time !== null && last_time !== \"\";\n if (hasTime) {\n let t = Number(last_time);\n if (!isFinite(t) || t < 0) t = 0;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n const hasPercent =\n last_percent !== undefined &&\n last_percent !== null &&\n last_percent !== \"\";\n if (hasPercent) {\n let p = Number(last_percent);\n if (!isFinite(p) || p < 0) p = 0;\n if (p > 1) p = p / 100;\n let t = dur * p;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n return 0;\n }\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\n\n@Component({\n selector: 'app-scaleup-player',\n template: '', // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep iframe[src*=\"scaleup.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `]\n})\nexport class ScaleupPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n private scaleupIframe?: HTMLIFrameElement;\n private scaleupMessageHandler?: (e: MessageEvent) => void;\n private scaleupProgressThrottle = 0;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== 'scaleup') {\n return;\n }\n this.loadScaleupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.scaleupIframe) {\n this.loadScaleupPlayer();\n }\n }\n\n private loadScaleupPlayer() {\n const videoId = this.config.video_id;\n const lastTime = Math.max(0, Math.floor(Number(this.config.last_time) || 0));\n const eventsList =\n \"controlsdisabled,controlsenabled,dispose,durationchange,ended,enterFullWindow,enterpictureinpicture,error,exitFullWindow,firstplay,fullscreenchange,leavepictureinpicture,loadedmetadata,loadstart,pause,play,playerreset,playerresize,playing,posterchange,progress,ratechange,ready,resize,seeked,seeking,textdata,timeupdate,useractive,userinactive,volumechange,waiting\";\n const scaleupSrc = `https://player.scaleup.com.br/embed/${videoId}?seekTo=${lastTime}&events=${eventsList}&autoplay=${this.config.autoPlay}`;\n\n const host: HTMLElement = this.elementRef.nativeElement;\n \n if (this.scaleupIframe) {\n this.scaleupIframe.remove();\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = scaleupSrc;\n iframe.allow = \"autoplay; fullscreen; encrypted-media; picture-in-picture\";\n iframe.referrerPolicy = \"origin-when-cross-origin\";\n iframe.frameBorder = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.position = \"absolute\";\n iframe.style.top = \"0\";\n iframe.style.left = \"0\";\n\n host.appendChild(iframe);\n this.scaleupIframe = iframe;\n\n // Emite evento ready quando o iframe carregar\n iframe.onload = () => {\n this.ready.emit();\n };\n\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n this.scaleupMessageHandler = (e: MessageEvent) => {\n try {\n const originOk =\n typeof e.origin === \"string\" &&\n e.origin.includes(\"scaleup.com.br\");\n if (!originOk) return;\n\n const data =\n typeof e.data === \"string\"\n ? (() => {\n try {\n return JSON.parse(e.data);\n } catch {\n return undefined;\n }\n })()\n : e.data;\n if (!data || typeof data !== \"object\") return;\n\n const type = (\n data.event ||\n data.type ||\n data.message ||\n data.eventName ||\n \"\"\n )\n .toString()\n .toLowerCase();\n if (!type) return;\n\n const t = Number(\n (data.currentTime ?? data.time ?? data.position) || 0\n );\n const d = Number((data.duration ?? data.totalDuration) || 0);\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (\n type.includes(\"timeupdate\") ||\n type === \"playing\" ||\n type === \"progress\"\n ) {\n if (now - this.scaleupProgressThrottle >= THROTTLE_MS) {\n this.scaleupProgressThrottle = now;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n }\n }\n if (type === \"pause\" || type === \"paused\") {\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n }\n if (type === \"ended\" || type === \"end\" || type === \"complete\") {\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n this.progressService.ended$.next();\n }\n } catch {}\n };\n window.addEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n ngOnDestroy() {\n try {\n this.scaleupIframe?.remove();\n } catch {}\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n this.scaleupMessageHandler = undefined;\n }\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalLoadingService {\n private loadingElement: HTMLElement | null;\n\n constructor(@Inject(DOCUMENT) private document: Document) {\n this.loadingElement = this.document.getElementById('global-loading');\n }\n\n public hide() {\n if (this.loadingElement) {\n this.loadingElement.style.opacity = '0';\n setTimeout(() => {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'none';\n }\n }, 500); // Duração da transição do CSS\n }\n }\n\n public show() {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'flex';\n this.loadingElement.style.opacity = '1';\n }\n }\n}","import { CommonModule } from \"@angular/common\";\nimport { Component, Inject, Input } from \"@angular/core\";\n\nimport { PlyrPlayerComponent } from \"../players/plyr-player/plyr-player.component\";\nimport { PandaPlayerComponent } from \"../players/panda-player/panda-player.component\";\nimport { ScaleupPlayerComponent } from \"../players/scaleup-player/scaleup-player.component\";\n\nimport { WebplayerConfig, WEPLAYER_CONFIG } from \"../webplayer.types\";\nimport { GlobalLoadingService } from \"../global.service\";\n\n@Component({\n selector: \"app-player-loader\",\n template: `\n <div style=\"width: 100%; height: 100%;\">\n <div [ngSwitch]=\"config?.video_host\" style=\"width: 100%; height: 100%;\">\n <app-plyr-player\n *ngSwitchCase=\"'hls'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'mp4'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'youtube'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'vimeo'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-panda-player\n *ngSwitchCase=\"'panda'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-panda-player>\n <app-scaleup-player\n *ngSwitchCase=\"'scaleup'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-scaleup-player>\n <div *ngSwitchDefault>\n <p>Player não suportado ou configuração não fornecida.</p>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [\n CommonModule,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n ],\n})\nexport class PlayerLoaderComponent {\n @Input() config!: WebplayerConfig | any;\n playerType: \"plyr\" | \"panda\" | \"scaleup\" | null = null;\n\n constructor(\n @Inject(WEPLAYER_CONFIG) private defaultConfig: WebplayerConfig,\n private globalLoading: GlobalLoadingService\n ) {\n this.config = { ...this.defaultConfig, ...this.config };\n this.playerType = this.getPlayerType(this.config.videoUrl);\n }\n\n private getPlayerType(videoUrl: string): \"plyr\" | \"panda\" | \"scaleup\" | null {\n if (videoUrl?.includes(\"panda\")) return \"panda\";\n if (videoUrl?.includes(\"scaleup\")) return \"scaleup\";\n if (\n videoUrl?.includes(\"vimeo\") ||\n videoUrl?.includes(\"youtube\") ||\n videoUrl?.includes(\".m3u8\") ||\n videoUrl?.includes(\".mp4\")\n )\n return \"plyr\";\n return \"plyr\";\n }\n\n onPlayerReady() {\n this.globalLoading.hide();\n }\n}\n","import { Component, Output, EventEmitter, OnDestroy, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { WebplayerConfig } from './webplayer.types';\nimport { WebplayerConfigService } from './webplayer-config.service';\nimport { WebplayerProgress, WebplayerProgressService } from './progress.service';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\n\n@Component({\n selector: 'edm-webplayer',\n template: `\n <app-player-loader [config]=\"config\" *ngIf=\"config\"></app-player-loader>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [CommonModule, PlayerLoaderComponent],\n})\nexport class WebplayerComponent implements OnInit, OnDestroy {\n @Output('playProgress') progress = new EventEmitter<WebplayerProgress>();\n @Output('playEnded') ended = new EventEmitter<void>();\n\n config: WebplayerConfig | null = null;\n private subscriptions = new Subscription();\n\n constructor(\n private configService: WebplayerConfigService,\n private progressService: WebplayerProgressService\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.add(\n this.configService.config$.subscribe(config => {\n this.config = config;\n })\n );\n\n this.subscriptions.add(\n this.progressService.progress$.subscribe(p => this.progress.emit(p))\n );\n\n this.subscriptions.add(\n this.progressService.ended$.subscribe(() => this.ended.emit())\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'timeFormat', standalone: true })\nexport class TimeFormatPipe implements PipeTransform {\n transform(seconds: number | null | undefined): string {\n const val = typeof seconds === 'number' && isFinite(seconds) ? seconds : 0;\n const sec = Math.floor(val % 60).toString().padStart(2, '0');\n const min = Math.floor(val / 60).toString().padStart(2, '0');\n const hrs = Math.floor(val / 3600);\n if (hrs > 0) {\n const mm = Math.floor((val % 3600) / 60).toString().padStart(2, '0');\n return `${hrs}:${mm}:${sec}`;\n }\n return `${min}:${sec}`;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerComponent } from './webplayer.component';\nimport { TimeFormatPipe } from './utils/time-format.pipe';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\nimport { PlyrPlayerComponent } from './players/plyr-player/plyr-player.component';\nimport { PandaPlayerComponent } from './players/panda-player/panda-player.component';\nimport { ScaleupPlayerComponent } from './players/scaleup-player/scaleup-player.component';\n\n@NgModule({\n imports: [\n CommonModule,\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n TimeFormatPipe,\n ],\n exports: [\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n TimeFormatPipe,\n ]\n})\nexport class WebplayerModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebplayerProgressService","i1.GlobalLoadingService","i1.WebplayerConfigService","i2.WebplayerProgressService"],"mappings":";;;;;;;;;MA0Ba,eAAe,GAAG,IAAI,cAAc,CAAkB,kBAAkB;;MCnBxE,sBAAsB,CAAA;AACzB,IAAA,aAAa;AAErB,IAAA,IAAW,OAAO,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;;AAG1C,IAAA,WAAA,CAAiD,cAA+B,EAAA;QAC9E,IAAI,CAAC,aAAa,GAAG,IAAI,eAAe,CAAyB,cAAc,CAAC;;AAGlF,IAAA,SAAS,CAAC,MAAgC,EAAA;QACxC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AACnD,QAAA,MAAM,SAAS,GAAG,EAAE,IAAI,aAAa,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAqB;AAC5E,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;;IAGpC,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;;AAlB3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,kBAOD,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAPpC,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAQc;;0BAAY,MAAM;2BAAC,eAAe;;;MCJpC,wBAAwB,CAAA;AAE5B,IAAA,SAAS,GAAG,IAAI,OAAO,EAAqB;AAC5C,IAAA,MAAM,GAAG,IAAI,OAAO,EAAQ;IAE3B,GAAG,CAAC,QAAgB,EAAI,EAAA,OAAO,aAAa,QAAQ,CAAA,CAAE,CAAC;IAE/D,YAAY,CAAC,QAAgB,EAAE,IAAY,EAAA;AACzC,QAAA,IAAI;YACF,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;;QAClE,MAAM;;AAGV,IAAA,WAAW,CAAC,QAAgB,EAAA;AAC1B,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;;AAC5D,QAAA,MAAM;AACN,YAAA,OAAO,CAAC;;;wGAjBD,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;4FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCgFrB,mBAAmB,CAAA;AAWpB,IAAA,eAAA;AACkB,IAAA,QAAA;AATU,IAAA,QAAQ;AACrC,IAAA,MAAM;AACL,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;AAElC,IAAA,IAAI;AACJ,IAAA,GAAG;IAEX,WACU,CAAA,eAAyC,EACvB,QAAkB,EAAA;QADpC,IAAe,CAAA,eAAA,GAAf,eAAe;QACG,IAAQ,CAAA,QAAA,GAAR,QAAQ;;IAGpC,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;;;IAI1C,eAAe,GAAA;QACb,IAAI,CAAC,WAAW,EAAE;;AAGpB,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;YAClC,IAAI,CAAC,WAAW,EAAE;;;AAId,IAAA,UAAU,CAAC,MAAiC,EAAA;QAClD,MAAM,QAAQ,GAAG,sBAAsB;QACvC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAA4B;QAC/E,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC9C,YAAA,OAAO,CAAC,EAAE,GAAG,QAAQ;YACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;;QAGzC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK;QACrD,MAAM,QAAQ,GAA4B,EAAE;AAE5C,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,YAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AACrD,gBAAA,MAAM,UAAU,GAAG,CAAW,QAAA,EAAA,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA,CAAE;gBACtE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACxC,gBAAA,IAAI;AAAE,oBAAA,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC;;gBAAI,MAAM;;;AAIlE,QAAA,MAAM,OAAO,GAAG,CAAA;EAClB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,CAAK,EAAA,EAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACnD;AACE,QAAA,OAAO,CAAC,WAAW,GAAG,OAAO;;IAGvB,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AACnB,QAAA,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;QACpB,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAK,IAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AACjE,YAAA,QAAQ,EAAE;gBACR,YAAY;gBACZ,MAAM;gBACN,UAAU;gBACV,cAAc;gBACd,UAAU;gBACV,MAAM;gBACN,QAAQ;gBACR,UAAU;gBACV,UAAU;gBACV,KAAK;gBACL,SAAS;gBACT,YAAY;AACb,aAAA;AACD,YAAA,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACtD,YAAA,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;AAC3E,YAAA,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;AAC/E,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,YAAY;AACpB,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,QAAQ,EAAE,CAAC;AACX,gBAAA,OAAO,EAAE;AACV,aAAA;AACD,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;AAC1C,YAAA,KAAK,EAAE,KAAK;AACb,SAAA,CAAC;QAEF,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAK;YACrD,IAAI,CAAC,cAAc,EAAE;AACvB,SAAC,CAAC;;QAGF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAK;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,SAAC,CAAC;;IAGI,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,MAAK;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;YACzF,IAAI,KAAK,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAY,CAAC;AACtC,SAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAY,CAAC;;IAG7B,kBAAkB,GAAA;QACxB,MAAM,WAAW,GAAG,GAAG;QACvB,IAAI,QAAQ,GAAG,CAAC;QAEhB,MAAM,YAAY,GAAG,MAAK;YACxB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAClF,SAAC;QAED,MAAM,YAAY,GAAG,MAAK;AACxB,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,YAAA,IAAI,GAAG,GAAG,QAAQ,IAAI,WAAW,EAAE;gBACjC,QAAQ,GAAG,GAAG;AACd,gBAAA,YAAY,EAAE;;AAEhB,YAAA,MAAM,CAAC,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC;AACtE,YAAA,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;AACpE,SAAC;QACD,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,MAAK;AAC3B,YAAA,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC;AAE1C,SAAC,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,YAAY,EAAE,YAAY,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAK;AAC5B,YAAA,YAAY,EAAE;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAC3B,YAAA,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC;AACzC,SAAC,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAK;AAC5B,YAAA,YAAY,EAAE;AACd,YAAA,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC;AACvC,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE;AACpC,SAAC,CAAC;;IAGI,gBAAgB,CACtB,KAAwB,EACxB,OAAO,GAAG,IAAI,EACd,MAAM,GAAG,CAAC,EAAA;AAEV,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE;QAC3B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI;AACF,gBAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK;AACvB,oBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM;;;YAE3B,MAAM;AACR,YAAA,IAAI;gBACF,IAAI,KAAK,EAAE;AACT,oBAAA,KAAK,CAAC,KAAK,GAAG,KAAK;AACnB,oBAAA,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;AAAE,wBAAA,KAAK,CAAC,MAAM,GAAG,MAAM;;;YAE7D,MAAM;SACT,EAAE,OAAO,CAAC;;AAGL,IAAA,UAAU,CAChB,KAAuB,EAAA;QAGvB,MAAM,uBAAuB,GAAG,MAAK;YACnC,UAAU,CAAC,MAAK;gBACd,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CACpC,sBAAsB,CACR;gBAChB,IAAI,OAAO,EAAE;oBACX,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,oBAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACnC,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;AACvB,oBAAA,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC5B,oBAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO;AAC9B,oBAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AAC1B,oBAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa;AACxC,oBAAA,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AACpC,oBAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;oBAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC9C,oBAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACpC,oBAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC9B,oBAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AACzB,oBAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC7B,oBAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO;AAC/B,oBAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AAC3B,oBAAA,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa;AACzC,oBAAA,QAAQ,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AACrC,oBAAA,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;;aAGhC,EAAE,IAAI,CAAC;AACV,SAAC;AAED,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAChB,OAAO,OAAO,EAAE;;AAGlB,YAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAClB,gBAAA,IAAI,CAAC,GAAG,GAAG,SAAS;;YAGtB,MAAM,QAAQ,GAAG,gEAAgE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAC3G,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,uBAAuB,EAAE;;AAG3B,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,EAAE;gBAC9E,MAAM,OAAO,GAAG,MAAK;oBACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CACjC,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CACnB;oBACD,IAAI,KAAK,GAAG,CAAC;AAAE,wBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK;AAE5C,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;wBAC/C,UAAU,CAAC,MAAK;AACd,4BAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;yBACjB,EAAE,IAAI,CAAC;;AAEV,oBAAA,MAAM,CAAC,WAAW,CAAC,qBAAqB,EAAE,GAAG,CAAC;AAC9C,oBAAA,MAAM,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;oBAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACpD,oBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAE3B,oBAAA,IAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACtB,wBAAA,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,YAAA;AACvB,4BAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAClC,4BAAA,MAAM,CAAC,WAAW,CAAC,qBAAqB,EAAE,GAAG,CAAC;AAChD,yBAAC,CAAC;;AAGJ,oBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;wBACtB,UAAU,CAAC,MAAK;4BACd;AACG,iCAAA,aAAa,CAAC,CAAA,yBAAA,CAA2B,CAAC;AAC3C,kCAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;yBAC5B,EAAE,IAAI,CAAC;;AAEZ,iBAAC;gBACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;;YAGhC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AACxC,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG;AACjB,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;iBAC9D;;iBACI,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,EAAE;AAC7C,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG;AACjB,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;iBAC5D;;iBACI,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE;AAC3C,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG;AACjB,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;iBACrE;;iBACI,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE;gBAC3C,IAAI,OAAO,GAAG,EAAE;AAChB,gBAAA,IAAI;oBACF,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;;gBAC1C,OAAO,CAAC,EAAE;oBACV,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE;;gBAEtC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,+BAA+B,CAAC;gBAEpE,IAAI,SAAS,EAAE;AACb,oBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG;AACjB,wBAAA,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC;qBACnE;oBACD,MAAM,YAAY,GAAG,MAAK;AACxB,wBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC;wBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;AACzF,wBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AAAE,4BAAA,IAAI;AAAE,gCAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK;;AAAI,4BAAA,MAAM;AAAE,gCAAA,IAAI;AAAE,oCAAA,KAAK,CAAC,WAAW,GAAG,KAAK;;gCAAI,MAAM;;;AAEzG,wBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACxB,4BAAA,IAAI;AAAE,gCAAA,KAAK,CAAC,KAAK,GAAG,IAAI;;4BAAI,MAAM;4BAClC,UAAU,CAAC,MAAK;AACd,gCAAA,IAAI;AAAE,oCAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;;AAAI,gCAAA,MAAM;AAAE,oCAAA,IAAI;wCAAE,KAAK,CAAC,IAAI,EAAE;;oCAAI,MAAM;;AAC9D,gCAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;6BAC7B,EAAE,GAAG,CAAC;;AAET,wBAAA,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,YAAY,CAAC;AAC3D,qBAAC;AACD,oBAAA,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,YAAY,CAAC;;AACjD,qBAAA,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE;AAC5B,oBAAA,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAChE,oBAAA,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,oBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,MAAK;AAC1C,wBAAA,IAAI,CAAC,GAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AAC/B,qBAAC,CAAC;AACF,oBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAK;AAC3C,wBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC;wBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;AACzF,wBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AAAE,4BAAA,IAAI;AAAE,gCAAA,KAAK,CAAC,WAAW,GAAG,KAAK;;4BAAI,MAAM;;AAC1D,wBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACxB,4BAAA,KAAK,CAAC,KAAK,GAAG,IAAI;4BAClB,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAK,GAAG,CAAC;AAC5B,4BAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;AAEhC,qBAAC,CAAC;AACF,oBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,KAAI;AAC3C,wBAAA,IAAI,IAAI,EAAE,KAAK,EAAE;AACf,4BAAA,QAAQ,IAAI,CAAC,IAAI;AACf,gCAAA,KAAK,GAAG,CAAC,UAAU,CAAC,aAAa;AAC/B,oCAAA,IAAI,CAAC,GAAI,CAAC,SAAS,EAAE;oCACrB;AACF,gCAAA,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW;AAC7B,oCAAA,IAAI,CAAC,GAAI,CAAC,iBAAiB,EAAE;oCAC7B;AACF,gCAAA;AACE,oCAAA,IAAI;AAAE,wCAAA,IAAI,CAAC,GAAI,CAAC,OAAO,EAAE;;oCAAI,MAAM;oCAAG;;;AAG9C,qBAAC,CAAC;;qBACG;oBACL,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;;;AAGrE,YAAA,OAAO,EAAE;AACX,SAAC,CAAC;;IAGI,gBAAgB,CACtB,SAAc,EACd,YAAiB,EACjB,QAAgB,EAChB,OAAuD,EAAE,EAAA;AAEzD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;AACzC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AAEtB,QAAA,MAAM,OAAO,GAAG,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;QACjF,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,GAAG,WAAW;AAAE,gBAAA,OAAO,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC,CAAC;;AAGvC,QAAA,MAAM,UAAU,GACd,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,EAAE;QAC5E,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC;AAAE,gBAAA,CAAC,GAAG,CAAC,GAAG,GAAG;AACtB,YAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,GAAG,WAAW;AAAE,gBAAA,OAAO,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC,CAAC;;AAGvC,QAAA,OAAO,CAAC;;IAGV,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AACnB,QAAA,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;;AA/XX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,uDAYpB,QAAQ,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAZP,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlEpB,CAAoC,kCAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,mrDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEpC,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAgEX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBApE/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,YACjB,CAAoC,kCAAA,CAAA,EAAA,UAAA,EAClC,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,MAAA,EAAA,CAAA,mrDAAA,CAAA,EAAA;;0BA4EpB,MAAM;2BAAC,QAAQ;yCAToB,QAAQ,EAAA,CAAA;sBAA7C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAC3B,MAAM,EAAA,CAAA;sBAAd;gBACS,KAAK,EAAA,CAAA;sBAAd;;;MC3DU,oBAAoB,CAAA;AAWrB,IAAA,UAAA;AACA,IAAA,eAAA;AAXD,IAAA,MAAM;AACL,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;AAElC,IAAA,WAAW;AACX,IAAA,cAAc;IACd,qBAAqB,GAAG,CAAC;AACzB,IAAA,YAAY;AACZ,IAAA,aAAa;IAErB,WACU,CAAA,UAAsB,EACtB,eAAyC,EAAA;QADzC,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAe,CAAA,eAAA,GAAf,eAAe;;IAGzB,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,EAAE;YACvC;;QAEF,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,eAAe,EAAE;;AAGxB,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YACzC,IAAI,CAAC,eAAe,EAAE;;;IAIlB,UAAU,GAAA;QAChB,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC;AAC9D,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;;;IAItD,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACtB;;AAGF,QAAA,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,MAAK;AACjC,YAAA,MAAM,IAAI,GAAgB,IAAI,CAAC,UAAU,CAAC,aAAa;YACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACtD,YAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;gBACnD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;gBACxC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;gBACzC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,CAAS,MAAA,EAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAE;AAC/F,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;;AAGvC,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI;;YAC7B,MAAM;AAER,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;YAC9H,MAAM,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;YAEjG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE;AACnD,YAAA,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAK;AAC9B,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAK,MAAc,CAAC,WAAW,CAChD,IAAI,CAAC,cAAe,CAAC,EAAE,EACvB;AACE,oBAAA,iBAAiB,EAAE,OAAO;AAC1B,oBAAA,UAAU,EAAE,SAAS;oBACrB,OAAO,EAAE,MAAK;AACZ,wBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,4BAAA,IAAI;gCAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;;4BAAI,MAAM;;AAEzE,wBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,4BAAA,IAAI;gCAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;;4BAAI,MAAM;;wBAG5E,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC;wBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;AACzF,wBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,4BAAA,IAAI;AAAE,gCAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC;;4BAAI,MAAM;;AAExD,wBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AACxB,4BAAA,IAAI;AAAE,gCAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;;4BAAI,MAAM;;AAEzC,wBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;qBAClB;AACD,oBAAA,aAAa,EAAE;AACb,wBAAA,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;AAChC,wBAAA,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;AACtC,qBAAA;AAEF,iBAAA,CACF;gBAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AACtC,oBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC9B,iBAAC,CAAC;AACJ,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGJ,WAAW,GAAA;AACT,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI;;QAC7B,MAAM;AACR,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI;;QAC/B,MAAM;;AAGF,IAAA,MAAM,iBAAiB,GAAA;AAC7B,QAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;YACnC,IAAI,MAAM,CAAC,WAAW;gBAAE,OAAO,OAAO,EAAE;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,2DAA2D,CACvC;YACtB,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,CAAC;AAClD,gBAAA,IAAK,QAAgB,CAAC,UAAU,KAAK,UAAU;AAAE,oBAAA,OAAO,EAAE;gBAC1D;;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,YAAA,MAAM,CAAC,GAAG,GAAG,4CAA4C;AACzD,YAAA,MAAM,CAAC,KAAK,GAAG,IAAI;YACnB,MAAM,CAAC,MAAM,GAAG,MAAM,OAAO,EAAE;AAC/B,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACnC,SAAC,CAAC;;AAGI,IAAA,mBAAmB,CAAC,GAAW,EAAA;AACrC,QAAA,IAAI,CAAM;AACV,QAAA,IAAI;AACF,YAAA,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;;AAChB,QAAA,MAAM;AACN,YAAA,IAAI;gBACF,CAAC,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;;AACpC,YAAA,MAAM;AACN,gBAAA,OAAO,SAAS;;;AAGpB,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS;YAC9C,OAAO,CAAC,IAAI,SAAS;;AACrB,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;;;AAIZ,IAAA,qBAAqB,CAAC,GAAW,EAAA;AACvC,QAAA,IAAI,CAAM;AACV,QAAA,IAAI;AACF,YAAA,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;;AAChB,QAAA,MAAM;AACN,YAAA,IAAI;gBACF,CAAC,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;;AACpC,YAAA,MAAM;AACN,gBAAA,OAAO,SAAS;;;AAGpB,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC;AACtB,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAC/C,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS;kBAC5C,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;kBACjC,UAAU;YACd,OAAO,QAAQ,IAAI,SAAS;;AAC5B,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;;;AAIZ,IAAA,gBAAgB,CAAC,GAAQ,EAAA;QAC/B,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,IAAI;QACtC,MAAM,WAAW,GAAG,GAAG;AACvB,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAE7B,QAAA,IAAI,IAAI,KAAK,kBAAkB,EAAE;YAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,qBAAqB,IAAI,WAAW,EAAE;AACnD,gBAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG;AAChC,gBAAA,IAAI;oBACF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,IAAI,IAAI,CAAC;oBACnD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC;oBAChD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;oBACjD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;gBAChF,MAAM;;;AAIZ,QAAA,IAAI,IAAI,KAAK,aAAa,EAAE;AAC1B,YAAA,IAAI;gBACF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,IAAI,IAAI,CAAC;gBACnD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC;gBAChD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBACjD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;YAChF,MAAM;;AAGV,QAAA,IAAI,IAAI,KAAK,aAAa,EAAE;AAC1B,YAAA,IAAI;gBACF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,IAAI,IAAI,CAAC;gBACnD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC;gBAChD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBACjD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;YAChF,MAAM;AACR,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE;;;IAI9B,gBAAgB,CACtB,SAAc,EACd,YAAiB,EACjB,QAAgB,EAChB,OAAuD,EAAE,EAAA;AAEzD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;AACzC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;QAEzC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AAEtB,QAAA,MAAM,OAAO,GACX,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;QACnE,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,GAAG,WAAW;AAAE,gBAAA,OAAO,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC,CAAC;;AAGvC,QAAA,MAAM,UAAU,GACd,YAAY,KAAK,SAAS;AAC1B,YAAA,YAAY,KAAK,IAAI;YACrB,YAAY,KAAK,EAAE;QACrB,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,GAAG,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC;AAAE,gBAAA,CAAC,GAAG,CAAC,GAAG,GAAG;AACtB,YAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,GAAG,WAAW;AAAE,gBAAA,OAAO,CAAC;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC,CAAC;;AAGvC,QAAA,OAAO,CAAC;;wGAhPC,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArBrB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gRAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEF,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAmBX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAvBhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,YAClB,EAAE,EAAA,UAAA,EACA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,MAAA,EAAA,CAAA,gRAAA,CAAA,EAAA;mHAoBd,MAAM,EAAA,CAAA;sBAAd;gBACS,KAAK,EAAA,CAAA;sBAAd;;;MCVU,sBAAsB,CAAA;AAQvB,IAAA,UAAA;AACA,IAAA,eAAA;AARD,IAAA,MAAM;AACL,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;AAClC,IAAA,aAAa;AACb,IAAA,qBAAqB;IACrB,uBAAuB,GAAG,CAAC;IAEnC,WACU,CAAA,UAAsB,EACtB,eAAyC,EAAA;QADzC,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAe,CAAA,eAAA,GAAf,eAAe;;IAGzB,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,EAAE;YACzC;;QAEF,IAAI,CAAC,iBAAiB,EAAE;;AAG1B,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;YAC3C,IAAI,CAAC,iBAAiB,EAAE;;;IAIpB,iBAAiB,GAAA;AACvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,MAAM,UAAU,GACd,8WAA8W;AAChX,QAAA,MAAM,UAAU,GAAG,CAAuC,oCAAA,EAAA,OAAO,WAAW,QAAQ,CAAA,QAAA,EAAW,UAAU,CAAA,UAAA,EAAa,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAE5I,QAAA,MAAM,IAAI,GAAgB,IAAI,CAAC,UAAU,CAAC,aAAa;AAEvD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;;QAG/B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,QAAA,MAAM,CAAC,GAAG,GAAG,UAAU;AACvB,QAAA,MAAM,CAAC,KAAK,GAAG,2DAA2D;AAC1E,QAAA,MAAM,CAAC,cAAc,GAAG,0BAA0B;AAClD,QAAA,MAAM,CAAC,WAAW,GAAG,GAAG;AACxB,QAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC3B,QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC5B,QAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAClC,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;AACtB,QAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AAEvB,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM;;AAG3B,QAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,SAAC;AAED,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC5B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC;;AAGrE,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAe,KAAI;AAC/C,YAAA,IAAI;AACF,gBAAA,MAAM,QAAQ,GACZ,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;AAC5B,oBAAA,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACrC,gBAAA,IAAI,CAAC,QAAQ;oBAAE;AAEf,gBAAA,MAAM,IAAI,GACR,OAAO,CAAC,CAAC,IAAI,KAAK;sBACd,CAAC,MAAK;AACJ,wBAAA,IAAI;4BACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;;AACzB,wBAAA,MAAM;AACN,4BAAA,OAAO,SAAS;;AAEpB,qBAAC;AACH,sBAAE,CAAC,CAAC,IAAI;AACZ,gBAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE;AAEvC,gBAAA,MAAM,IAAI,GAAG,CACX,IAAI,CAAC,KAAK;AACV,oBAAA,IAAI,CAAC,IAAI;AACT,oBAAA,IAAI,CAAC,OAAO;AACZ,oBAAA,IAAI,CAAC,SAAS;AACd,oBAAA,EAAE;AAED,qBAAA,QAAQ;AACR,qBAAA,WAAW,EAAE;AAChB,gBAAA,IAAI,CAAC,IAAI;oBAAE;gBAEX,MAAM,CAAC,GAAG,MAAM,CACd,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CACtD;AACD,gBAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAEjD,MAAM,WAAW,GAAG,GAAG;AACvB,gBAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAE7B,gBAAA,IACE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,IAAI,KAAK,SAAS;oBAClB,IAAI,KAAK,UAAU,EACnB;oBACA,IAAI,GAAG,GAAG,IAAI,CAAC,uBAAuB,IAAI,WAAW,EAAE;AACrD,wBAAA,IAAI,CAAC,uBAAuB,GAAG,GAAG;wBAClC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;;gBAGpF,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACzC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;AAElF,gBAAA,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,UAAU,EAAE;oBAC7D,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAChF,oBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE;;;YAEpC,MAAM;AACV,SAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC;;IAGhE,WAAW,GAAA;AACT,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE;;QAC5B,MAAM;AACR,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC;AACjE,YAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;;;wGAhI/B,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBvB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEF,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAkBX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAtBlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,YACpB,EAAE,EAAA,UAAA,EACA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA;mHAmBd,MAAM,EAAA,CAAA;sBAAd;gBACS,KAAK,EAAA,CAAA;sBAAd;;;MCvBU,oBAAoB,CAAA;AAGO,IAAA,QAAA;AAF9B,IAAA,cAAc;AAEtB,IAAA,WAAA,CAAsC,QAAkB,EAAA;QAAlB,IAAQ,CAAA,QAAA,GAAR,QAAQ;QAC5C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC;;IAG/D,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;YACvC,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE;oBACvB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;;AAE9C,aAAC,EAAE,GAAG,CAAC,CAAC;;;IAIL,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;YAC1C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;;;AArBhC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,kBAGX,QAAQ,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAHjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAIc,MAAM;2BAAC,QAAQ;;;MC2DjB,qBAAqB,CAAA;AAKG,IAAA,aAAA;AACzB,IAAA,aAAA;AALD,IAAA,MAAM;IACf,UAAU,GAAwC,IAAI;IAEtD,WACmC,CAAA,aAA8B,EACvD,aAAmC,EAAA;QADV,IAAa,CAAA,aAAA,GAAb,aAAa;QACtC,IAAa,CAAA,aAAA,GAAb,aAAa;AAErB,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACvD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAGpD,IAAA,aAAa,CAAC,QAAgB,EAAA;AACpC,QAAA,IAAI,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,OAAO;AAC/C,QAAA,IAAI,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,SAAS;AACnD,QAAA,IACE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAC3B,YAAA,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC;AAC7B,YAAA,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAC3B,YAAA,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC;AAE1B,YAAA,OAAO,MAAM;AACf,QAAA,OAAO,MAAM;;IAGf,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;;AA1BhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,kBAKtB,eAAe,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AALd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAxDtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAYC,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,oBAAoB,qGACpB,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAGb,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA1DjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EACnB,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCT,EAAA,CAAA,EAAA,UAAA,EAUW,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,oBAAoB;wBACpB,sBAAsB;AACvB,qBAAA,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA;;0BAOE,MAAM;2BAAC,eAAe;yEAJhB,MAAM,EAAA,CAAA;sBAAd;;;MC5CU,kBAAkB,CAAA;AAQnB,IAAA,aAAA;AACA,IAAA,eAAA;AARc,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAqB;AACnD,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;IAErD,MAAM,GAA2B,IAAI;AAC7B,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;IAE1C,WACU,CAAA,aAAqC,EACrC,eAAyC,EAAA;QADzC,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAe,CAAA,eAAA,GAAf,eAAe;;IAGzB,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAG;AAC5C,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;SACrB,CAAC,CACH;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACrE;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAC/D;;IAGH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;;wGA7BvB,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAfnB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,cAAA,EAAA,KAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;GAET,EAWS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,mIAAE,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAElC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjB9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EACf,QAAA,EAAA;;AAET,EAAA,CAAA,EAAA,UAAA,EAUW,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,qBAAqB,CAAC,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA;4HAGtB,QAAQ,EAAA,CAAA;sBAA/B,MAAM;uBAAC,cAAc;gBACD,KAAK,EAAA,CAAA;sBAAzB,MAAM;uBAAC,WAAW;;;MCxBR,cAAc,CAAA;AACzB,IAAA,SAAS,CAAC,OAAkC,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;AAClC,QAAA,IAAI,GAAG,GAAG,CAAC,EAAE;YACX,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACpE,YAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAI,CAAA,EAAA,GAAG,EAAE;;AAE9B,QAAA,OAAO,CAAG,EAAA,GAAG,CAAI,CAAA,EAAA,GAAG,EAAE;;wGAVb,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE;;;MC0BjC,eAAe,CAAA;wGAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YAjBxB,YAAY;YACZ,kBAAkB;YAClB,qBAAqB;YACrB,mBAAmB;YACnB,oBAAoB;YACpB,sBAAsB;AACtB,YAAA,cAAc,aAGd,kBAAkB;YAClB,qBAAqB;YACrB,mBAAmB;YACnB,oBAAoB;YACpB,sBAAsB;YACtB,cAAc,CAAA,EAAA,CAAA;AAGL,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YAjBxB,YAAY;YACZ,kBAAkB;YAClB,qBAAqB;YACrB,mBAAmB;YACnB,oBAAoB;YACpB,sBAAsB,CAAA,EAAA,CAAA;;4FAYb,eAAe,EAAA,UAAA,EAAA,CAAA;kBAnB3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,qBAAqB;wBACrB,mBAAmB;wBACnB,oBAAoB;wBACpB,sBAAsB;wBACtB,cAAc;AACf,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,kBAAkB;wBAClB,qBAAqB;wBACrB,mBAAmB;wBACnB,oBAAoB;wBACpB,sBAAsB;wBACtB,cAAc;AACf;AACF,iBAAA;;;AC3BD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edm-webplayer/webplayer-angular",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.14",
6
6
  "@angular/core": "^19.2.14",
package/public-api.d.ts CHANGED
@@ -7,5 +7,4 @@ export * from './player-loader/player-loader.component';
7
7
  export * from './players/plyr-player/plyr-player.component';
8
8
  export * from './players/panda-player/panda-player.component';
9
9
  export * from './players/scaleup-player/scaleup-player.component';
10
- export * from './players/chromecast-player/chromecast-player.component';
11
10
  export * from './webplayer-config.service';
@@ -5,10 +5,9 @@ import * as i3 from "./player-loader/player-loader.component";
5
5
  import * as i4 from "./players/plyr-player/plyr-player.component";
6
6
  import * as i5 from "./players/panda-player/panda-player.component";
7
7
  import * as i6 from "./players/scaleup-player/scaleup-player.component";
8
- import * as i7 from "./players/chromecast-player/chromecast-player.component";
9
- import * as i8 from "./utils/time-format.pipe";
8
+ import * as i7 from "./utils/time-format.pipe";
10
9
  export declare class WebplayerModule {
11
10
  static ɵfac: i0.ɵɵFactoryDeclaration<WebplayerModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<WebplayerModule, never, [typeof i1.CommonModule, typeof i2.WebplayerComponent, typeof i3.PlayerLoaderComponent, typeof i4.PlyrPlayerComponent, typeof i5.PandaPlayerComponent, typeof i6.ScaleupPlayerComponent, typeof i7.ChromecastPlayerComponent, typeof i8.TimeFormatPipe], [typeof i2.WebplayerComponent, typeof i3.PlayerLoaderComponent, typeof i4.PlyrPlayerComponent, typeof i5.PandaPlayerComponent, typeof i6.ScaleupPlayerComponent, typeof i7.ChromecastPlayerComponent, typeof i8.TimeFormatPipe]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<WebplayerModule, never, [typeof i1.CommonModule, typeof i2.WebplayerComponent, typeof i3.PlayerLoaderComponent, typeof i4.PlyrPlayerComponent, typeof i5.PandaPlayerComponent, typeof i6.ScaleupPlayerComponent, typeof i7.TimeFormatPipe], [typeof i2.WebplayerComponent, typeof i3.PlayerLoaderComponent, typeof i4.PlyrPlayerComponent, typeof i5.PandaPlayerComponent, typeof i6.ScaleupPlayerComponent, typeof i7.TimeFormatPipe]>;
13
12
  static ɵinj: i0.ɵɵInjectorDeclaration<WebplayerModule>;
14
13
  }
@@ -12,8 +12,6 @@ export interface WebplayerConfig {
12
12
  is_live?: boolean;
13
13
  mirror?: boolean;
14
14
  autoPlay?: boolean;
15
- accessToken?: string;
16
- lesson_id?: string | number | null;
17
15
  ui?: {
18
16
  colors?: {
19
17
  bg?: string;
@@ -1,54 +0,0 @@
1
- import { OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
2
- import { WebplayerConfig } from '../../webplayer.types';
3
- import { GlobalLoadingService } from '../../global.service';
4
- import { WebplayerConfigService } from '../../webplayer-config.service';
5
- import * as i0 from "@angular/core";
6
- declare global {
7
- interface Window {
8
- __onGCastApiAvailable?: (isAvailable: boolean, errorInfo?: unknown) => void;
9
- cast?: any;
10
- chrome?: any;
11
- }
12
- }
13
- export declare class ChromecastPlayerComponent implements OnInit, OnDestroy, OnChanges {
14
- private globalLoading;
15
- private configService;
16
- config: WebplayerConfig;
17
- statusMessage: string;
18
- helpMessage: string;
19
- errorMessage: string | null;
20
- isReady: boolean;
21
- isCasting: boolean;
22
- isLoading: boolean;
23
- lastLessonTokenCache: any | boolean;
24
- private streamUrl;
25
- private streamMimeType;
26
- private requiresEmbedReceiver;
27
- private sessionListener?;
28
- private castEventType;
29
- private lastFetchSignature;
30
- constructor(globalLoading: GlobalLoadingService, configService: WebplayerConfigService);
31
- ngOnInit(): Promise<void>;
32
- ngOnDestroy(): void;
33
- ngOnChanges(changes: SimpleChanges): void;
34
- startCasting(): Promise<void>;
35
- stopCasting(): void;
36
- private setupCastContext;
37
- private resolveReceiverApplicationId;
38
- private applyStreamSource;
39
- private resolveStreamSource;
40
- private tryDecodeBase64;
41
- private buildPandaHlsUrl;
42
- private normalizeEmbedUrl;
43
- private resolveAccessToken;
44
- private getSessionId;
45
- private extractAccessTokenFromSession;
46
- private ensureConfigFromToken;
47
- private describeError;
48
- private ensureAccessTokenForSession;
49
- private resolveLessonId;
50
- private buildChromecastTokenEndpoint;
51
- private safeParseUrl;
52
- static ɵfac: i0.ɵɵFactoryDeclaration<ChromecastPlayerComponent, never>;
53
- static ɵcmp: i0.ɵɵComponentDeclaration<ChromecastPlayerComponent, "app-chromecast-player", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
54
- }