vue-layout-gitcode 1.12.56-multiple-account → 1.12.58-multiple-account

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.
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, inject, openBlock, createElementBlock, Fragment, renderList, withDirectives, createBlock, unref, ref, watch, createElementVNode, createVNode, toDisplayString, createCommentVNode } from "vue";
2
- import { h as headRequest, R as REPO_MODULE, v as vElementExposure, b as REPO_EVENT, _ as _export_sfc, a as i18n, c as useLayoutConfig, G as GIcon } from "./index-DaQYEtqo.js";
3
- import { u as useReportRepo, S as SearchRepoCard, m as mergeSearchSuggestions } from "./search-suggestion-DIN_JXKj.js";
2
+ import { h as headRequest, R as REPO_MODULE, v as vElementExposure, b as REPO_EVENT, _ as _export_sfc, a as i18n, c as useLayoutConfig, G as GIcon } from "./index-COKhviBm.js";
3
+ import { u as useReportRepo, S as SearchRepoCard, m as mergeSearchSuggestions } from "./search-suggestion-C8A5qUyV.js";
4
4
  import "vue-devui-lal/icon";
5
5
  import "vue-devui-lal/icon/style.css";
6
6
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, inject, useSlots, computed, ref, openBlock, createBlock, unref, withCtx, createElementVNode, normalizeClass, createElementBlock, createCommentVNode, createTextVNode, toDisplayString, renderSlot } from "vue";
2
- import { a as i18n, c as useLayoutConfig, B as ThemeType, C as currentTheme, L as LANG_ZH, D as LANG_EN, F as getLocaleLang, G as GIcon, H as emitEvent, b as REPO_EVENT, I as ASIDE_MENU_REPO, J as isHttps, K as navigateWithMigrationGuard, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, c as useLayoutConfig, B as ThemeType, C as currentTheme, L as LANG_ZH, D as LANG_EN, F as getLocaleLang, G as GIcon, H as emitEvent, b as REPO_EVENT, I as ASIDE_MENU_REPO, J as isHttps, K as navigateWithMigrationGuard, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import { useRouter } from "vue-router";
4
4
  import { Popover } from "vue-devui-lal/popover";
5
5
  import "vue-devui-lal/popover/style.css";
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, inject, ref, reactive, watch, computed, openBlock, createElementBlock, Fragment, createElementVNode, toDisplayString, unref, createVNode, withModifiers, normalizeClass, withCtx, renderList, createBlock, createCommentVNode, createTextVNode, withDirectives, vShow } from "vue";
2
- import { a as i18n, c as useLayoutConfig, G as GIcon, t as transformUrl, N as _sfc_main$1, O as loadAsideData, K as navigateWithMigrationGuard, H as emitEvent, s as setLoginTriggerSource, e as useRequestReport, M as asideRequest, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, c as useLayoutConfig, G as GIcon, t as transformUrl, N as _sfc_main$1, O as loadAsideData, K as navigateWithMigrationGuard, H as emitEvent, s as setLoginTriggerSource, e as useRequestReport, M as asideRequest, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import { useRouter } from "vue-router";
4
- import { t as transWebUrl } from "./transWebUrl-BQaSzm_8.js";
4
+ import { t as transWebUrl } from "./transWebUrl-BSrPTPSK.js";
5
5
  import { Select, Option } from "vue-devui-lal/select";
6
6
  import { Input } from "vue-devui-lal/input";
7
7
  import { Skeleton } from "vue-devui-lal/skeleton";
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, inject, ref, reactive, computed, watch, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, createVNode, withModifiers, normalizeClass, withCtx, createBlock, createCommentVNode, Fragment, renderList, createTextVNode, withDirectives, vShow } from "vue";
2
- import { a as i18n, c as useLayoutConfig, t as transformUrl, G as GIcon, M as asideRequest, K as navigateWithMigrationGuard, H as emitEvent, s as setLoginTriggerSource, e as useRequestReport, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, c as useLayoutConfig, t as transformUrl, G as GIcon, M as asideRequest, K as navigateWithMigrationGuard, H as emitEvent, s as setLoginTriggerSource, e as useRequestReport, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import { useRouter } from "vue-router";
4
- import { t as transWebUrl } from "./transWebUrl-BQaSzm_8.js";
4
+ import { t as transWebUrl } from "./transWebUrl-BSrPTPSK.js";
5
5
  import { Input } from "vue-devui-lal/input";
6
6
  import { Skeleton } from "vue-devui-lal/skeleton";
7
7
  import { MenuItem } from "vue-devui-lal/menu";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, inject, watch, computed, withDirectives, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, Fragment, renderList, createVNode, vShow } from "vue";
2
- import { a as i18n, h as headRequest, G as GIcon, r as reqCatch } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, h as headRequest, G as GIcon, r as reqCatch } from "./index-COKhviBm.js";
3
3
  import { useRoute, useRouter } from "vue-router";
4
4
  import "vue-devui-lal/icon";
5
5
  import "vue-devui-lal/icon/style.css";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, Fragment, renderList, normalizeClass, createElementVNode, createVNode, toDisplayString, withModifiers, createCommentVNode } from "vue";
2
- import { a as i18n, n as normalizeSearchHistoryEntry, G as GIcon, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, n as normalizeSearchHistoryEntry, G as GIcon, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import "vue-devui-lal/icon";
4
4
  import "vue-devui-lal/icon/style.css";
5
5
  const _hoisted_1 = { class: "history-list" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, inject, ref, onMounted, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, Fragment, renderList, renderSlot, createBlock, createVNode, withCtx } from "vue";
2
- import { u as useReportRepo, S as SearchRepoCard, i as isProjectSuggestionType, n as normalizeProjectUrlForMainSite } from "./search-suggestion-DIN_JXKj.js";
3
- import { a as i18n, h as headRequest, c as useLayoutConfig, R as REPO_MODULE, b as REPO_EVENT, l as localStorage, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { u as useReportRepo, S as SearchRepoCard, i as isProjectSuggestionType, n as normalizeProjectUrlForMainSite } from "./search-suggestion-C8A5qUyV.js";
3
+ import { a as i18n, h as headRequest, c as useLayoutConfig, R as REPO_MODULE, b as REPO_EVENT, l as localStorage, _ as _export_sfc } from "./index-COKhviBm.js";
4
4
  import { Row, Col } from "vue-devui-lal/grid";
5
5
  import { SkeletonItem } from "vue-devui-lal/skeleton";
6
6
  import "vue-devui-lal/grid/style.css";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, openBlock, createElementBlock, Fragment, renderList, createElementVNode, createVNode, toDisplayString, createCommentVNode, unref } from "vue";
2
- import { a as i18n, G as GIcon, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, G as GIcon, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import "vue-devui-lal/icon";
4
4
  import "vue-devui-lal/icon/style.css";
5
5
  const _hoisted_1 = ["onClick"];
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, inject, ref, watch, withDirectives, openBlock, createElementBlock, createElementVNode, toDisplayString, unref, Fragment, renderList, createVNode, vShow } from "vue";
2
- import { a as i18n, h as headRequest, G as GIcon, t as transformUrl } from "./index-DaQYEtqo.js";
2
+ import { a as i18n, h as headRequest, G as GIcon, t as transformUrl } from "./index-COKhviBm.js";
3
3
  import "vue-devui-lal/icon";
4
4
  import "vue-devui-lal/icon/style.css";
5
5
  const _hoisted_1 = { class: "history-list-project history-list-project--padded" };
@@ -8672,6 +8672,13 @@ const gitCodeLayout$1 = {
8672
8672
  myStar: "我的 Star",
8673
8673
  personSetting: "个人设置",
8674
8674
  helpDocument: "帮助文档",
8675
+ accountSessions: "账号",
8676
+ accountCurrent: "当前",
8677
+ accountNeedReauth: "需重新登录",
8678
+ accountSwitch: "切换",
8679
+ accountReauthorize: "重新授权",
8680
+ accountRemove: "移除",
8681
+ accountAdd: "添加账号",
8675
8682
  logout: "退出登录",
8676
8683
  openSourceExplorer: "开源探索者",
8677
8684
  openSourcePioneer: "开源先锋",
@@ -9098,6 +9105,13 @@ const gitCodeLayout = {
9098
9105
  myStar: "Your stars",
9099
9106
  personSetting: "Settings",
9100
9107
  helpDocument: "GitCode Docs",
9108
+ accountSessions: "Accounts",
9109
+ accountCurrent: "Current",
9110
+ accountNeedReauth: "Sign-in required",
9111
+ accountSwitch: "Switch",
9112
+ accountReauthorize: "Re-authorize",
9113
+ accountRemove: "Remove",
9114
+ accountAdd: "Add account",
9101
9115
  logout: "Logout",
9102
9116
  openSourceExplorer: "Open Source Explorer",
9103
9117
  openSourcePioneer: "Open Source Pioneer",
@@ -16116,6 +16130,7 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
16116
16130
  userMenus: {},
16117
16131
  inEnterpriseHeader: { type: Boolean },
16118
16132
  accountSessionSupported: { type: Boolean },
16133
+ accountSessionLogout: { type: Function },
16119
16134
  accountSessions: {},
16120
16135
  accountSessionActiveRef: {},
16121
16136
  accountSessionMax: {},
@@ -16143,12 +16158,16 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
16143
16158
  localStorage$2.removeItem(HARMONY_SURVEY_DELAY);
16144
16159
  };
16145
16160
  const handleLogout = async () => {
16146
- var _a, _b;
16161
+ var _a, _b, _c;
16162
+ if (props.accountSessionSupported) {
16163
+ if (!props.accountSessionBusy) await ((_a = props.accountSessionLogout) == null ? void 0 : _a.call(props));
16164
+ return;
16165
+ }
16147
16166
  const res = await API.toLogout();
16148
16167
  clearSurveyDelayStatus();
16149
16168
  if (!res.error) {
16150
16169
  props.loginOutFinish && props.loginOutFinish();
16151
- if (((_a = route.meta) == null ? void 0 : _a.needLogin) || ((_b = route.meta) == null ? void 0 : _b.type) === "repo" && (repoInfo == null ? void 0 : repoInfo.value.visibility) === "private" || (orgInfo == null ? void 0 : orgInfo.value.visibility) === "private") {
16170
+ if (((_b = route.meta) == null ? void 0 : _b.needLogin) || ((_c = route.meta) == null ? void 0 : _c.type) === "repo" && (repoInfo == null ? void 0 : repoInfo.value.visibility) === "private" || (orgInfo == null ? void 0 : orgInfo.value.visibility) === "private") {
16152
16171
  router2.push("/");
16153
16172
  } else {
16154
16173
  const $route = Object.assign({}, route);
@@ -16450,6 +16469,7 @@ const _sfc_main$y = /* @__PURE__ */ defineComponent({
16450
16469
  userMenus: { default: () => [] },
16451
16470
  inEnterpriseHeader: { type: Boolean, default: false },
16452
16471
  accountSessionSupported: { type: Boolean, default: false },
16472
+ accountSessionLogout: {},
16453
16473
  accountSessions: { default: () => [] },
16454
16474
  accountSessionActiveRef: { default: null },
16455
16475
  accountSessionMax: { default: 5 },
@@ -16461,6 +16481,7 @@ const _sfc_main$y = /* @__PURE__ */ defineComponent({
16461
16481
  const emit = __emit;
16462
16482
  const accountSessionBindings = computed(() => ({
16463
16483
  accountSessionSupported: props.accountSessionSupported,
16484
+ accountSessionLogout: props.accountSessionLogout,
16464
16485
  accountSessions: props.accountSessions,
16465
16486
  accountSessionActiveRef: props.accountSessionActiveRef,
16466
16487
  accountSessionMax: props.accountSessionMax,
@@ -17228,12 +17249,12 @@ const _sfc_main$w = /* @__PURE__ */ defineComponent({
17228
17249
  setup(__props) {
17229
17250
  const layoutConfig2 = useLayoutConfig();
17230
17251
  const { t: $t } = i18n.global;
17231
- const ProjectSearch = defineAsyncComponent(() => import("./ProjectSearch-1Hm9SElE.js"));
17232
- const UserSearch = defineAsyncComponent(() => import("./UserSearch-HK39vA5N.js"));
17233
- const GloabarSearch = defineAsyncComponent(() => import("./GloabarSearch-CVynas9C.js"));
17234
- const SearchHistoryList = defineAsyncComponent(() => import("./SearchHistoryList-cKXg5Pm2.js"));
17235
- const SearchScopeList = defineAsyncComponent(() => import("./SearchScopeList-8OySkylf.js"));
17236
- const SearchRecommed = defineAsyncComponent(() => import("./SearchRecommed-pa6eebM8.js"));
17252
+ const ProjectSearch = defineAsyncComponent(() => import("./ProjectSearch-BeXPZIuA.js"));
17253
+ const UserSearch = defineAsyncComponent(() => import("./UserSearch-BvS9pX2t.js"));
17254
+ const GloabarSearch = defineAsyncComponent(() => import("./GloabarSearch-DCbTfZbE.js"));
17255
+ const SearchHistoryList = defineAsyncComponent(() => import("./SearchHistoryList-Dg1vo5XJ.js"));
17256
+ const SearchScopeList = defineAsyncComponent(() => import("./SearchScopeList-Ce9GkeZp.js"));
17257
+ const SearchRecommed = defineAsyncComponent(() => import("./SearchRecommed-CL6KcC1p.js"));
17237
17258
  const props = __props;
17238
17259
  const repoInfo = inject("repoInfo", computed(() => void 0));
17239
17260
  const orgInfo = inject("orgInfo", computed(() => void 0));
@@ -18602,7 +18623,7 @@ const vElementExposure = {
18602
18623
  beforeUnmount() {
18603
18624
  }
18604
18625
  };
18605
- const NoticeModal = defineAsyncComponent(() => import("./notice-Ca46j16T.js"));
18626
+ const NoticeModal = defineAsyncComponent(() => import("./notice-AgKq4Bgs.js"));
18606
18627
  function clearNotice() {
18607
18628
  if (localStorage$2.getItem("validator_email")) {
18608
18629
  localStorage$2.removeItem("validator_email");
@@ -18698,6 +18719,7 @@ const _sfc_main$s = /* @__PURE__ */ defineComponent({
18698
18719
  launchAtomCode: { type: Function, default: void 0 },
18699
18720
  defaultGlobalSearchType: { default: "repo" },
18700
18721
  accountSessionSupported: { type: Boolean, default: false },
18722
+ accountSessionLogout: {},
18701
18723
  accountSessions: { default: () => [] },
18702
18724
  accountSessionActiveRef: { default: null },
18703
18725
  accountSessionMax: { default: 5 },
@@ -18738,6 +18760,7 @@ const _sfc_main$s = /* @__PURE__ */ defineComponent({
18738
18760
  const emit = __emit;
18739
18761
  const accountSessionBindings = computed(() => ({
18740
18762
  accountSessionSupported: props.accountSessionSupported,
18763
+ accountSessionLogout: props.accountSessionLogout,
18741
18764
  accountSessions: props.accountSessions,
18742
18765
  accountSessionActiveRef: props.accountSessionActiveRef,
18743
18766
  accountSessionMax: props.accountSessionMax,
@@ -21076,9 +21099,9 @@ const _sfc_main$l = /* @__PURE__ */ defineComponent({
21076
21099
  const layoutConfig2 = useLayoutConfig();
21077
21100
  const { t: t2 } = i18n.global;
21078
21101
  const route = useRoute();
21079
- const MenuItem = defineAsyncComponent(() => import("./MenuItem-BcjMjZGl.js"));
21080
- const ProjectMenuListV2 = defineAsyncComponent(() => import("./ProjectMenuListV2-d-Ee1ezf.js"));
21081
- const ProjectMenuList = defineAsyncComponent(() => import("./ProjectMenuList-vzlQsyut.js"));
21102
+ const MenuItem = defineAsyncComponent(() => import("./MenuItem-Ba7YKRMV.js"));
21103
+ const ProjectMenuListV2 = defineAsyncComponent(() => import("./ProjectMenuListV2-DedFI8-A.js"));
21104
+ const ProjectMenuList = defineAsyncComponent(() => import("./ProjectMenuList-K6sxu3zx.js"));
21082
21105
  const props = __props;
21083
21106
  const useReport2 = inject("useReport");
21084
21107
  const userInfo = inject("userInfo");
@@ -27616,7 +27639,7 @@ const _SlidCaptchaManager = class _SlidCaptchaManager {
27616
27639
  __publicField(_SlidCaptchaManager, "instance");
27617
27640
  let SlidCaptchaManager = _SlidCaptchaManager;
27618
27641
  const slidCaptchaManager = SlidCaptchaManager.getInstance();
27619
- const SlidCaptcha = defineAsyncComponent(() => import("./index-rBvNoB6A.js"));
27642
+ const SlidCaptcha = defineAsyncComponent(() => import("./index-D6YubXuH.js"));
27620
27643
  const useSlidCaptcha = () => {
27621
27644
  const { mount, unMount, isMounted } = usePopup("slid-captcha-popup");
27622
27645
  const open = (config) => {
@@ -27646,7 +27669,7 @@ const useSlidCaptcha = () => {
27646
27669
  close
27647
27670
  };
27648
27671
  };
27649
- const YunpianCaptcha = defineAsyncComponent(() => import("./index-B3zAYcaR.js"));
27672
+ const YunpianCaptcha = defineAsyncComponent(() => import("./index-DvHsRlkN.js"));
27650
27673
  const useYunpianCaptcha = () => {
27651
27674
  const { mount, unMount } = usePopup("yunpian-captcha-popup");
27652
27675
  const open = (config) => {
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, onMounted, nextTick, onUnmounted, openBlock, createBlock, unref, withCtx, createElementVNode } from "vue";
2
- import { z as slidCaptchaManager, c as useLayoutConfig, A as isZh, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { z as slidCaptchaManager, c as useLayoutConfig, A as isZh, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import { FixedOverlay } from "vue-devui-lal/overlay";
4
4
  import "vue-devui-lal/overlay/style.css";
5
5
  const TARGET_TEXT = "Click in order:";
@@ -8,7 +8,7 @@ import { Message } from "vue-devui-lal/message";
8
8
  import "vue-devui-lal/message/style.css";
9
9
  import { FixedOverlay } from "vue-devui-lal/overlay";
10
10
  import "vue-devui-lal/overlay/style.css";
11
- import { a as i18n, j as usePageResize, A as isZh, _ as _export_sfc } from "./index-DaQYEtqo.js";
11
+ import { a as i18n, j as usePageResize, A as isZh, _ as _export_sfc } from "./index-COKhviBm.js";
12
12
  const _YunpianCaptchaManager = class _YunpianCaptchaManager {
13
13
  // eslint-disable-next-line no-useless-constructor
14
14
  constructor() {
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { P, Q, S, U, V, W, X, Y, Z, $, a0, a1, a2, a3, a4, a5, C, a6, a7, a8, a9 } from "./index-DaQYEtqo.js";
1
+ import { P, Q, S, U, V, W, X, Y, Z, $, a0, a1, a2, a3, a4, a5, C, a6, a7, a8, a9 } from "./index-COKhviBm.js";
2
2
  export {
3
3
  P as AsideFooterTools,
4
4
  Q as AtomCodeLauncher,
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, openBlock, createBlock, unref, isRef, withCtx, createElementVNode, normalizeClass, createVNode, createTextVNode } from "vue";
2
- import { i as isPhone, u as useModel, _ as _export_sfc } from "./index-DaQYEtqo.js";
2
+ import { i as isPhone, u as useModel, _ as _export_sfc } from "./index-COKhviBm.js";
3
3
  import { Notification } from "vue-devui-lal/notification";
4
4
  import { Button } from "vue-devui-lal/button";
5
5
  import "vue-devui-lal/notification/style.css";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-layout-gitcode",
3
- "version": "1.12.56-multiple-account",
3
+ "version": "1.12.58-multiple-account",
4
4
  "description": "用于 gitcode 站点生产环境使用",
5
5
  "main": "index.js",
6
6
  "types": "./index.d.ts",
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, toDisplayString, unref, useModel, ref, watch, openBlock, createElementBlock, createVNode, normalizeClass, withDirectives, createElementVNode, vShow, mergeModels, inject, withModifiers, createBlock, Fragment, computed, normalizeStyle, createCommentVNode, createTextVNode, renderList, withCtx, reactive, onMounted, watchEffect } from "vue";
2
- import { d as transferNumber, G as GIcon, _ as _export_sfc, s as setLoginTriggerSource, r as reqCatch, e as useRequestReport, h as headRequest, a as i18n, T as TOPIC_TYPE, f as useTimeFormat, g as useCookie, j as usePageResize, L as LANG_ZH, k as isGstarRepo, m as _sfc_main$b, o as isIncubationRepo, p as highlightWords, t as transformUrl, q as _frEventTrack, E as EVENT_NAME, w as REPO_TYPE, x as extractRepoInfoWithURL, y as LANG_KEY } from "./index-DaQYEtqo.js";
3
- import { t as transWebUrl } from "./transWebUrl-BQaSzm_8.js";
2
+ import { d as transferNumber, G as GIcon, _ as _export_sfc, s as setLoginTriggerSource, r as reqCatch, e as useRequestReport, h as headRequest, a as i18n, T as TOPIC_TYPE, f as useTimeFormat, g as useCookie, j as usePageResize, L as LANG_ZH, k as isGstarRepo, m as _sfc_main$b, o as isIncubationRepo, p as highlightWords, t as transformUrl, q as _frEventTrack, E as EVENT_NAME, w as REPO_TYPE, x as extractRepoInfoWithURL, y as LANG_KEY } from "./index-COKhviBm.js";
3
+ import { t as transWebUrl } from "./transWebUrl-BSrPTPSK.js";
4
4
  import { useRouter } from "vue-router";
5
5
  import { Row, Col } from "vue-devui-lal/grid";
6
6
  import { Skeleton, SkeletonItem } from "vue-devui-lal/skeleton";
@@ -1,4 +1,4 @@
1
- import { c as useLayoutConfig } from "./index-DaQYEtqo.js";
1
+ import { c as useLayoutConfig } from "./index-COKhviBm.js";
2
2
  const layoutConfig = useLayoutConfig();
3
3
  const transWebUrl = (url, params, options = {}) => {
4
4
  if (!url) return url;