|  | @@ -0,0 +1,372 @@
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  NBreadcrumb,
 | 
	
		
			
				|  |  | +  NBreadcrumbItem,
 | 
	
		
			
				|  |  | +  NButton,
 | 
	
		
			
				|  |  | +  NImage,
 | 
	
		
			
				|  |  | +  NSlider,
 | 
	
		
			
				|  |  | +  NSpace,
 | 
	
		
			
				|  |  | +  NSpin
 | 
	
		
			
				|  |  | +} from 'naive-ui';
 | 
	
		
			
				|  |  | +import { computed, defineComponent, onMounted, reactive, watch } from 'vue';
 | 
	
		
			
				|  |  | +import styles from './detail.module.less';
 | 
	
		
			
				|  |  | +import icon_back from '../../../xiaoku-music/images/icon_back.png';
 | 
	
		
			
				|  |  | +import icon_arrow from '../../../xiaoku-music/images/icon_arrow.png';
 | 
	
		
			
				|  |  | +import icon_play from '../../../xiaoku-music/images/icon_play.png';
 | 
	
		
			
				|  |  | +import icon_pause from '../../../xiaoku-music/images/icon_pause.png';
 | 
	
		
			
				|  |  | +import icon_default from '../../../xiaoku-music/images/icon_default.png';
 | 
	
		
			
				|  |  | +import icon_separator from '../../../xiaoku-music/images/icon_separator.png';
 | 
	
		
			
				|  |  | +import iconT from '/src/views/content-information/images/icon-t.png';
 | 
	
		
			
				|  |  | +import iconAddT from '/src/views/content-information/images/icon-add-t.png';
 | 
	
		
			
				|  |  | +import iconPlusT from '/src/views/content-information/images/icon-plus-t.png';
 | 
	
		
			
				|  |  | +import musicBg from '../../../xiaoku-music/images/icon_default.png';
 | 
	
		
			
				|  |  | +import iconPan from '/src/views/content-information/images/icon-pan.png';
 | 
	
		
			
				|  |  | +import { useRoute, useRouter } from 'vue-router';
 | 
	
		
			
				|  |  | +import PlayLoading from '../../../xiaoku-music/component/play-loading';
 | 
	
		
			
				|  |  | +import TheNoticeBar from '/src/components/TheNoticeBar';
 | 
	
		
			
				|  |  | +import TheEmpty from '/src/components/TheEmpty';
 | 
	
		
			
				|  |  | +import PlayItem from '../../../xiaoku-music/component/play-item';
 | 
	
		
			
				|  |  | +import { api_knowledgeWiki_detail } from '/src/views/content-information/api';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'music-detail',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    id: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: ''
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    type: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: ''
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    activeStatus: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    contentType: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: ''
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  setup(props, { expose }) {
 | 
	
		
			
				|  |  | +    const route = useRoute();
 | 
	
		
			
				|  |  | +    const data = reactive({
 | 
	
		
			
				|  |  | +      loading: false,
 | 
	
		
			
				|  |  | +      finshed: false,
 | 
	
		
			
				|  |  | +      reshing: false,
 | 
	
		
			
				|  |  | +      details: {} as any,
 | 
	
		
			
				|  |  | +      list: [] as any,
 | 
	
		
			
				|  |  | +      listActive: 0,
 | 
	
		
			
				|  |  | +      playState: 'pause' as 'play' | 'pause',
 | 
	
		
			
				|  |  | +      showPlayer: false,
 | 
	
		
			
				|  |  | +      showPreivew: false,
 | 
	
		
			
				|  |  | +      previewUrl: '',
 | 
	
		
			
				|  |  | +      showCloseBtn: true,
 | 
	
		
			
				|  |  | +      fontSize: 18 // 默认18
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /** 选中的item */
 | 
	
		
			
				|  |  | +    const activeItem = computed(() => {
 | 
	
		
			
				|  |  | +      return data.list[data.listActive] || {};
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /** 播放曲目 */
 | 
	
		
			
				|  |  | +    const handlePlay = (item: any) => {
 | 
	
		
			
				|  |  | +      const index = data.list.findIndex((_item: any) => _item.id === item.id);
 | 
	
		
			
				|  |  | +      if (index > -1) {
 | 
	
		
			
				|  |  | +        if (data.listActive === index) {
 | 
	
		
			
				|  |  | +          data.playState = data.playState === 'play' ? 'pause' : 'play';
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          data.playState = 'play';
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        data.showPlayer = true;
 | 
	
		
			
				|  |  | +        data.listActive = index;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /** 音频控制 */
 | 
	
		
			
				|  |  | +    const handleChangeAudio = (
 | 
	
		
			
				|  |  | +      type: 'play' | 'pause' | 'pre' | 'next' | 'favitor'
 | 
	
		
			
				|  |  | +    ) => {
 | 
	
		
			
				|  |  | +      if (type === 'play') {
 | 
	
		
			
				|  |  | +        data.playState = 'play';
 | 
	
		
			
				|  |  | +      } else if (type === 'pause') {
 | 
	
		
			
				|  |  | +        data.playState = 'pause';
 | 
	
		
			
				|  |  | +      } else if (type === 'pre') {
 | 
	
		
			
				|  |  | +        if (data.list[data.listActive - 1]) {
 | 
	
		
			
				|  |  | +          handlePlay(data.list[data.listActive - 1]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } else if (type === 'next') {
 | 
	
		
			
				|  |  | +        if (data.list[data.listActive + 1]) {
 | 
	
		
			
				|  |  | +          handlePlay(data.list[data.listActive + 1]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const getDetail = async () => {
 | 
	
		
			
				|  |  | +      data.loading = true;
 | 
	
		
			
				|  |  | +      let res = {} as any;
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        res = await api_knowledgeWiki_detail({
 | 
	
		
			
				|  |  | +          id: props.id || route.query.id
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      } catch (error) {
 | 
	
		
			
				|  |  | +        console.log(error);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if (data.reshing) {
 | 
	
		
			
				|  |  | +        data.list = [];
 | 
	
		
			
				|  |  | +        data.reshing = false;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      data.finshed = true;
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        data.list = res.data?.knowledgeWikiResources || [];
 | 
	
		
			
				|  |  | +        data.list.forEach((item: any) => {
 | 
	
		
			
				|  |  | +          item.audioFileUrl = item.url;
 | 
	
		
			
				|  |  | +          item.musicSheetName = item.name;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        const knowledgeWikiCategories = res.data?.knowledgeWikiCategories || [];
 | 
	
		
			
				|  |  | +        res.data.knowledgeName =
 | 
	
		
			
				|  |  | +          knowledgeWikiCategories.length > 0
 | 
	
		
			
				|  |  | +            ? knowledgeWikiCategories[0].name
 | 
	
		
			
				|  |  | +            : '';
 | 
	
		
			
				|  |  | +        res.data.intros = res.data.intros.replace(
 | 
	
		
			
				|  |  | +          /<video/gi,
 | 
	
		
			
				|  |  | +          '<video class="video-music" style="width: 100% !important;" controlslist="nodownload"'
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        data.details = res.data;
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      data.loading = false;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const onStopAll = (type: 'play' | 'pause' | 'pre' | 'next' | 'favitor') => {
 | 
	
		
			
				|  |  | +      handleChangeAudio(type);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        // 暂停视频
 | 
	
		
			
				|  |  | +        const doms = document.querySelectorAll('.video-music');
 | 
	
		
			
				|  |  | +        if (doms && doms.length > 0) {
 | 
	
		
			
				|  |  | +          doms.forEach((dom: any) => {
 | 
	
		
			
				|  |  | +            dom.pause();
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onMounted(() => {
 | 
	
		
			
				|  |  | +      getDetail();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    watch(
 | 
	
		
			
				|  |  | +      () => props.activeStatus,
 | 
	
		
			
				|  |  | +      () => {
 | 
	
		
			
				|  |  | +        if (!props.activeStatus) {
 | 
	
		
			
				|  |  | +          onStopAll('pause');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    expose({
 | 
	
		
			
				|  |  | +      handleChangeAudio: onStopAll
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div
 | 
	
		
			
				|  |  | +        class={[
 | 
	
		
			
				|  |  | +          styles.container,
 | 
	
		
			
				|  |  | +          props.type === 'preview' && styles.containerPreview,
 | 
	
		
			
				|  |  | +          props.type === 'modal' && styles.containerModal
 | 
	
		
			
				|  |  | +        ]}>
 | 
	
		
			
				|  |  | +        <div class={[styles.wrap, data.showPlayer ? styles.wrapBottom : '']}>
 | 
	
		
			
				|  |  | +          <div class={styles.content}>
 | 
	
		
			
				|  |  | +            <div class={styles.contentWrap}>
 | 
	
		
			
				|  |  | +              <div class={[styles.musicList, 'musicList-container']}>
 | 
	
		
			
				|  |  | +                <div class={styles.wrapList}>
 | 
	
		
			
				|  |  | +                  <div class={styles.musicInfo}>
 | 
	
		
			
				|  |  | +                    <div class={styles.musicImg}>
 | 
	
		
			
				|  |  | +                      <img
 | 
	
		
			
				|  |  | +                        src={data.details?.avatar || musicBg}
 | 
	
		
			
				|  |  | +                        class={styles.img}
 | 
	
		
			
				|  |  | +                      />
 | 
	
		
			
				|  |  | +                      <div class={styles.panSection}>
 | 
	
		
			
				|  |  | +                        <img src={iconPan} class={styles.iconPan} />
 | 
	
		
			
				|  |  | +                        <img
 | 
	
		
			
				|  |  | +                          src={data.details?.avatar || musicBg}
 | 
	
		
			
				|  |  | +                          class={styles.img2}
 | 
	
		
			
				|  |  | +                        />
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    <div class={styles.info}>
 | 
	
		
			
				|  |  | +                      <div class={styles.name}>
 | 
	
		
			
				|  |  | +                        <TheNoticeBar
 | 
	
		
			
				|  |  | +                          text={data.details.name}
 | 
	
		
			
				|  |  | +                          style={{ marginRight: '0' }}
 | 
	
		
			
				|  |  | +                        />
 | 
	
		
			
				|  |  | +                        {/* {data.details.name} */}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                      <div class={styles.c}>
 | 
	
		
			
				|  |  | +                        {data.details.composers ? (
 | 
	
		
			
				|  |  | +                          <div>
 | 
	
		
			
				|  |  | +                            <span>作曲:</span>
 | 
	
		
			
				|  |  | +                            <TheNoticeBar
 | 
	
		
			
				|  |  | +                              text={data.details.composers}
 | 
	
		
			
				|  |  | +                              style={{ marginRight: '0' }}
 | 
	
		
			
				|  |  | +                            />
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  | +                        ) : (
 | 
	
		
			
				|  |  | +                          ''
 | 
	
		
			
				|  |  | +                        )}
 | 
	
		
			
				|  |  | +                        {data.details.lyricists ? (
 | 
	
		
			
				|  |  | +                          <div>
 | 
	
		
			
				|  |  | +                            <span>作词:</span>
 | 
	
		
			
				|  |  | +                            <TheNoticeBar
 | 
	
		
			
				|  |  | +                              text={data.details.lyricists}
 | 
	
		
			
				|  |  | +                              style={{ marginRight: '0' }}
 | 
	
		
			
				|  |  | +                            />
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  | +                        ) : (
 | 
	
		
			
				|  |  | +                          ''
 | 
	
		
			
				|  |  | +                        )}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                  <div class={styles.titlec}>
 | 
	
		
			
				|  |  | +                    <i class={styles.icon2}></i>名曲鉴赏
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                  {data.list.map((item: any, index: any) => {
 | 
	
		
			
				|  |  | +                    return (
 | 
	
		
			
				|  |  | +                      <div class={styles.itemContainer}>
 | 
	
		
			
				|  |  | +                        <div
 | 
	
		
			
				|  |  | +                          class={[styles.item]}
 | 
	
		
			
				|  |  | +                          onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                            e.stopPropagation();
 | 
	
		
			
				|  |  | +                            handlePlay(item);
 | 
	
		
			
				|  |  | +                          }}>
 | 
	
		
			
				|  |  | +                          <div class={styles.img}>
 | 
	
		
			
				|  |  | +                            <NImage
 | 
	
		
			
				|  |  | +                              lazy
 | 
	
		
			
				|  |  | +                              objectFit="cover"
 | 
	
		
			
				|  |  | +                              previewDisabled={true}
 | 
	
		
			
				|  |  | +                              src={item.titleImg || icon_default}
 | 
	
		
			
				|  |  | +                              onLoad={e => {
 | 
	
		
			
				|  |  | +                                (e.target as any).dataset.loaded = 'true';
 | 
	
		
			
				|  |  | +                              }}
 | 
	
		
			
				|  |  | +                            />
 | 
	
		
			
				|  |  | +                            <PlayLoading
 | 
	
		
			
				|  |  | +                              class={[
 | 
	
		
			
				|  |  | +                                data.listActive === index &&
 | 
	
		
			
				|  |  | +                                data.playState === 'play'
 | 
	
		
			
				|  |  | +                                  ? ''
 | 
	
		
			
				|  |  | +                                  : styles.showPlayLoading
 | 
	
		
			
				|  |  | +                              ]}
 | 
	
		
			
				|  |  | +                            />
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  | +                          <div class={styles.title}>
 | 
	
		
			
				|  |  | +                            <div class={styles.titleName}>
 | 
	
		
			
				|  |  | +                              <TheNoticeBar
 | 
	
		
			
				|  |  | +                                text={item.name}
 | 
	
		
			
				|  |  | +                                style={{ marginRight: '12px' }}
 | 
	
		
			
				|  |  | +                              />
 | 
	
		
			
				|  |  | +                            </div>
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                          <NButton
 | 
	
		
			
				|  |  | +                            color="#259CFE"
 | 
	
		
			
				|  |  | +                            textColor="#fff"
 | 
	
		
			
				|  |  | +                            round
 | 
	
		
			
				|  |  | +                            class={styles.btn}
 | 
	
		
			
				|  |  | +                            type="primary"
 | 
	
		
			
				|  |  | +                            onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                              e.stopPropagation();
 | 
	
		
			
				|  |  | +                              handlePlay(item);
 | 
	
		
			
				|  |  | +                            }}>
 | 
	
		
			
				|  |  | +                            播放
 | 
	
		
			
				|  |  | +                            <img
 | 
	
		
			
				|  |  | +                              src={
 | 
	
		
			
				|  |  | +                                data.listActive === index &&
 | 
	
		
			
				|  |  | +                                data.playState === 'play'
 | 
	
		
			
				|  |  | +                                  ? icon_pause
 | 
	
		
			
				|  |  | +                                  : icon_play
 | 
	
		
			
				|  |  | +                              }
 | 
	
		
			
				|  |  | +                            />
 | 
	
		
			
				|  |  | +                          </NButton>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                          <img class={styles.arrow} src={icon_arrow} />
 | 
	
		
			
				|  |  | +                        </div>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    );
 | 
	
		
			
				|  |  | +                  })}
 | 
	
		
			
				|  |  | +                  {!data.finshed && (
 | 
	
		
			
				|  |  | +                    <div class={styles.loadingWrap}>
 | 
	
		
			
				|  |  | +                      <NSpin show={true}></NSpin>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  )}
 | 
	
		
			
				|  |  | +                  {!data.loading && data.list.length === 0 && (
 | 
	
		
			
				|  |  | +                    <div class={styles.empty}>
 | 
	
		
			
				|  |  | +                      <TheEmpty
 | 
	
		
			
				|  |  | +                        description="暂无名曲鉴赏"
 | 
	
		
			
				|  |  | +                        style={{ paddingTop: '0px' }}></TheEmpty>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  )}
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              <div class={styles.musicStaff}>
 | 
	
		
			
				|  |  | +                <div class={styles.musicTitle}>
 | 
	
		
			
				|  |  | +                  <i class={styles.icon1}></i>名曲故事
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  class={styles.musicContent}
 | 
	
		
			
				|  |  | +                  v-html={data.details?.intros}
 | 
	
		
			
				|  |  | +                  style={{ fontSize: data.fontSize + 'px' }}></div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              <div class={styles.changeSizeSection}>
 | 
	
		
			
				|  |  | +                <img src={iconT} class={styles.iconT} />
 | 
	
		
			
				|  |  | +                <img
 | 
	
		
			
				|  |  | +                  src={iconAddT}
 | 
	
		
			
				|  |  | +                  class={styles.iconAddT}
 | 
	
		
			
				|  |  | +                  onClick={() => {
 | 
	
		
			
				|  |  | +                    if (data.fontSize >= 32) return;
 | 
	
		
			
				|  |  | +                    data.fontSize += 1;
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <NSlider
 | 
	
		
			
				|  |  | +                  v-model:value={data.fontSize}
 | 
	
		
			
				|  |  | +                  placement="left"
 | 
	
		
			
				|  |  | +                  vertical
 | 
	
		
			
				|  |  | +                  min={12}
 | 
	
		
			
				|  |  | +                  max={32}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <img
 | 
	
		
			
				|  |  | +                  src={iconPlusT}
 | 
	
		
			
				|  |  | +                  class={styles.iconPlusT}
 | 
	
		
			
				|  |  | +                  onClick={() => {
 | 
	
		
			
				|  |  | +                    if (data.fontSize <= 12) return;
 | 
	
		
			
				|  |  | +                    data.fontSize -= 1;
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        {data.list.length !== 0 && (
 | 
	
		
			
				|  |  | +          <PlayItem
 | 
	
		
			
				|  |  | +            type={props.type}
 | 
	
		
			
				|  |  | +            show={data.showPlayer}
 | 
	
		
			
				|  |  | +            playState={data.playState}
 | 
	
		
			
				|  |  | +            item={activeItem.value}
 | 
	
		
			
				|  |  | +            onChange={value => handleChangeAudio(value)}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        )}
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |