| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | <!DOCTYPE html> | 
					
						
							|  |  |  | <html lang="en"> | 
					
						
							|  |  |  | {{template "head" .}} | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  |     @media (min-width: 769px) { | 
					
						
							|  |  |  |         .ant-layout-content { | 
					
						
							|  |  |  |             margin: 24px 16px; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .ant-col-sm-24 { | 
					
						
							|  |  |  |         margin-top: 10px; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .ant-tabs-bar { | 
					
						
							|  |  |  |         margin: 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .ant-list-item { | 
					
						
							|  |  |  |         display: block; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-17 16:07:49 +00:00
										 |  |  |     :not(.ant-card-dark)>.ant-tabs-top-bar { | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  |         background: white; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     .alert-msg { | 
					
						
							|  |  |  |         color: rgb(194, 117, 18); | 
					
						
							| 
									
										
										
										
											2023-05-25 09:09:45 +00:00
										 |  |  |         font-weight: normal; | 
					
						
							|  |  |  |         font-size: 16px; | 
					
						
							|  |  |  |         padding: .5rem 1rem; | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |         text-align: center; | 
					
						
							| 
									
										
										
										
											2023-05-25 09:09:45 +00:00
										 |  |  |         background: rgb(255 145 0 / 15%); | 
					
						
							|  |  |  |         margin: 1.5rem 2.5rem 0rem 2.5rem; | 
					
						
							|  |  |  |         border-radius: .5rem; | 
					
						
							|  |  |  |         transition: all 0.5s; | 
					
						
							|  |  |  |         animation: signal 3s cubic-bezier(0.18, 0.89, 0.32, 1.28) infinite; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     .alert-msg:hover { | 
					
						
							|  |  |  |         cursor: default; | 
					
						
							|  |  |  |         transition-duration: .3s; | 
					
						
							|  |  |  |         animation: signal 0.9s ease infinite; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     @keyframes signal{ | 
					
						
							|  |  |  |     0%{ | 
					
						
							|  |  |  |         box-shadow: 0 0 0 0 rgba(194, 118, 18, 0.5); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     50%{ | 
					
						
							|  |  |  |         box-shadow: 0 0 0 6px rgba(0 ,0,0,0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     100%{ | 
					
						
							|  |  |  |         box-shadow: 0 0 0 6px rgba(0 ,0,0,0); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     .alert-msg > i { | 
					
						
							|  |  |  |         color: inherit; | 
					
						
							|  |  |  |         font-size: 24px; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .collapse-title { | 
					
						
							|  |  |  |         color: inherit; | 
					
						
							|  |  |  |         font-weight: bold; | 
					
						
							|  |  |  |         font-size: 18px; | 
					
						
							|  |  |  |         padding: 10px 20px; | 
					
						
							|  |  |  |         border-bottom: 2px solid; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .collapse-title > i { | 
					
						
							|  |  |  |         color: inherit; | 
					
						
							|  |  |  |         font-size: 24px; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | </style> | 
					
						
							|  |  |  | <body> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  | <a-layout id="app" v-cloak> | 
					
						
							|  |  |  |     {{ template "commonSider" . }} | 
					
						
							|  |  |  |     <a-layout id="content-layout" :style="themeSwitcher.bgStyle"> | 
					
						
							|  |  |  |         <a-layout-content> | 
					
						
							|  |  |  |             <a-spin :spinning="spinning" :delay="500" tip="loading"> | 
					
						
							|  |  |  |                 <a-space direction="vertical"> | 
					
						
							|  |  |  |                     <a-space direction="horizontal"> | 
					
						
							|  |  |  |                         <a-button type="primary" :disabled="saveBtnDisable" @click="updateAllSetting">{{ i18n "pages.settings.save" }}</a-button> | 
					
						
							|  |  |  |                         <a-button type="danger" :disabled="!saveBtnDisable" @click="restartPanel">{{ i18n "pages.settings.restartPanel" }}</a-button> | 
					
						
							|  |  |  |                     </a-space> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                     <a-tabs style="margin:1rem 0.5rem;" default-active-key="1" :class="themeSwitcher.darkCardClass"> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                         <a-tab-pane key="1" tab='{{ i18n "pages.settings.panelSettings"}}'> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                             <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							|  |  |  |                                 <h2 class="alert-msg"> | 
					
						
							|  |  |  |                                     <a-icon type="warning"></a-icon> | 
					
						
							|  |  |  |                                     {{ i18n "pages.settings.infoDesc" }} | 
					
						
							|  |  |  |                                 </h2> | 
					
						
							|  |  |  |                             </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                             <a-list item-layout="horizontal" :style="themeSwitcher.textStyle"> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.panelListeningIP"}}' desc='{{ i18n "pages.settings.panelListeningIPDesc"}}' v-model="allSetting.webListen"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.panelPort"}}' desc='{{ i18n "pages.settings.panelPortDesc"}}' v-model="allSetting.webPort" :min="0"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.publicKeyPath"}}' desc='{{ i18n "pages.settings.publicKeyPathDesc"}}' v-model="allSetting.webCertFile"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.privateKeyPath"}}' desc='{{ i18n "pages.settings.privateKeyPathDesc"}}' v-model="allSetting.webKeyFile"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.panelUrlPath"}}' desc='{{ i18n "pages.settings.panelUrlPathDesc"}}' v-model="allSetting.webBasePath"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.sessionMaxAge" }}' desc='{{ i18n "pages.settings.sessionMaxAgeDesc" }}' v-model="allSetting.sessionMaxAge" :min="0"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.expireTimeDiff" }}' desc='{{ i18n "pages.settings.expireTimeDiffDesc" }}' v-model="allSetting.expireDiff" :min="0"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.trafficDiff" }}' desc='{{ i18n "pages.settings.trafficDiffDesc" }}' v-model="allSetting.trafficDiff" :min="0"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.timeZone"}}' desc='{{ i18n "pages.settings.timeZoneDesc"}}' v-model="allSetting.timeLocation"></setting-list-item> | 
					
						
							|  |  |  |                                 <a-list-item> | 
					
						
							|  |  |  |                                     <a-row style="padding: 20px"> | 
					
						
							|  |  |  |                                         <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                             <a-list-item-meta title="Language" /> | 
					
						
							|  |  |  |                                         </a-col> | 
					
						
							| 
									
										
										
										
											2023-04-18 06:51:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                         <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                             <template> | 
					
						
							|  |  |  |                                                 <a-select | 
					
						
							|  |  |  |                                                     ref="selectLang" | 
					
						
							|  |  |  |                                                     v-model="lang" | 
					
						
							|  |  |  |                                                     @change="setLang(lang)" | 
					
						
							|  |  |  |                                                     :dropdown-class-name="themeSwitcher.darkCardClass" | 
					
						
							|  |  |  |                                                     style="width: 100%" | 
					
						
							|  |  |  |                                                 > | 
					
						
							|  |  |  |                                                     <a-select-option :value="l.value" :label="l.value" v-for="l in supportLangs"> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                         <span role="img" aria-label="l.name" v-text="l.icon"></span> | 
					
						
							|  |  |  |                                                           <span v-text="l.name"></span> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                     </a-select-option> | 
					
						
							|  |  |  |                                                 </a-select> | 
					
						
							|  |  |  |                                             </template> | 
					
						
							|  |  |  |                                         </a-col> | 
					
						
							|  |  |  |                                     </a-row> | 
					
						
							|  |  |  |                                 </a-list-item> | 
					
						
							|  |  |  |                             </a-list> | 
					
						
							|  |  |  |                         </a-tab-pane> | 
					
						
							|  |  |  |                         <a-tab-pane key="2" tab='{{ i18n "pages.settings.securitySettings"}}' style="padding: 20px;"> | 
					
						
							| 
									
										
										
										
											2023-05-11 10:34:35 +00:00
										 |  |  |                             <a-tabs class="ant-card-dark-securitybox-nohover" default-active-key="sec-1" :class="themeSwitcher.darkCardClass"> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                 <a-tab-pane key="sec-1" tab='{{ i18n "pages.settings.security.admin"}}'> | 
					
						
							|  |  |  |                                     <a-form :style="'padding: 20px;' + themeSwitcher.textStyle"> | 
					
						
							|  |  |  |                                         <a-form-item label='{{ i18n "pages.settings.oldUsername"}}'> | 
					
						
							|  |  |  |                                             <a-input v-model="user.oldUsername" style="max-width: 300px"></a-input> | 
					
						
							|  |  |  |                                         </a-form-item> | 
					
						
							|  |  |  |                                         <a-form-item label='{{ i18n "pages.settings.currentPassword"}}'> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:54:44 +00:00
										 |  |  |                                             <password-input v-model="user.oldPassword" style="max-width: 300px"></password-input> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                         </a-form-item> | 
					
						
							|  |  |  |                                         <a-form-item label='{{ i18n "pages.settings.newUsername"}}'> | 
					
						
							|  |  |  |                                             <a-input v-model="user.newUsername" style="max-width: 300px"></a-input> | 
					
						
							|  |  |  |                                         </a-form-item> | 
					
						
							|  |  |  |                                         <a-form-item label='{{ i18n "pages.settings.newPassword"}}'> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:54:44 +00:00
										 |  |  |                                             <password-input v-model="user.newPassword" style="max-width: 300px"></password-input> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                         </a-form-item> | 
					
						
							|  |  |  |                                         <a-form-item> | 
					
						
							|  |  |  |                                             <a-button type="primary" @click="updateUser">{{ i18n "confirm" }}</a-button> | 
					
						
							|  |  |  |                                         </a-form-item> | 
					
						
							|  |  |  |                                     </a-form> | 
					
						
							|  |  |  |                                 </a-tab-pane> | 
					
						
							|  |  |  |                                 <a-tab-pane key="sec-2" tab='{{ i18n "pages.settings.security.secret"}}'> | 
					
						
							|  |  |  |                                     <a-form :style="'padding: 20px;' + themeSwitcher.textStyle"> | 
					
						
							|  |  |  |                                         <a-list-item style="padding: 20px"> | 
					
						
							|  |  |  |                                             <a-row> | 
					
						
							|  |  |  |                                                 <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                     <a-list-item-meta title='{{ i18n "pages.settings.security.loginSecurity" }}' description='{{ i18n "pages.settings.security.loginSecurityDesc" }}' /> | 
					
						
							|  |  |  |                                                 </a-col> | 
					
						
							|  |  |  |                                                 <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                     <template> | 
					
						
							|  |  |  |                                                         <a-switch @change="toggleToken(allSetting.secretEnable)" v-model="allSetting.secretEnable"></a-switch> | 
					
						
							|  |  |  |                                                     </template> | 
					
						
							|  |  |  |                                                 </a-col> | 
					
						
							|  |  |  |                                             </a-row> | 
					
						
							|  |  |  |                                         </a-list-item> | 
					
						
							|  |  |  |                                         <a-list-item style="padding: 20px"> | 
					
						
							|  |  |  |                                             <a-row> | 
					
						
							|  |  |  |                                                 <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                     <a-list-item-meta title='{{ i18n "pages.settings.security.secretToken" }}' description='{{ i18n "pages.settings.security.secretTokenDesc" }}' /> | 
					
						
							|  |  |  |                                                 </a-col> | 
					
						
							|  |  |  |                                                 <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                     <svg  | 
					
						
							| 
									
										
										
										
											2023-05-16 20:39:32 +00:00
										 |  |  |                                                         @click="getNewSecret" | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                         xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="anticon anticon-question-circle" viewBox="0 0 16 16"><path d="M11.534 7h3.932a.25.25 0 0 1 .192.41l-1.966 2.36a.25.25 0 0 1-.384 0l-1.966-2.36a.25.25 0 0 1 .192-.41zm-11 2h3.932a.25.25 0 0 0 .192-.41L2.692 6.23a.25.25 0 0 0-.384 0L.342 8.59A.25.25 0 0 0 .534 9z"/><path fill-rule="evenodd" d="M8 3c-1.552 0-2.94.707-3.857 1.818a.5.5 0 1 1-.771-.636A6.002 6.002 0 0 1 13.917 7H12.9A5.002 5.002 0 0 0 8 3zM3.1 9a5.002 5.002 0 0 0 8.757 2.182.5.5 0 1 1 .771.636A6.002 6.002 0 0 1 2.083 9H3.1z"/>  | 
					
						
							|  |  |  |                                                     </svg> | 
					
						
							|  |  |  |                                                     <template> | 
					
						
							|  |  |  |                                                         <a-textarea type="text" id='token' :disabled="!allSetting.secretEnable" v-model="user.loginSecret"></a-textarea> | 
					
						
							|  |  |  |                                                     </template> | 
					
						
							|  |  |  |                                                 </a-col> | 
					
						
							|  |  |  |                                             </a-row> | 
					
						
							|  |  |  |                                         </a-list-item> | 
					
						
							|  |  |  |                                         <a-button type="primary" @click="updateSecret">{{ i18n "confirm" }}</a-button> | 
					
						
							|  |  |  |                                     </a-form> | 
					
						
							|  |  |  |                                 </a-tab-pane> | 
					
						
							|  |  |  |                             </a-tabs> | 
					
						
							|  |  |  |                         </a-tab-pane> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         <a-tab-pane key="3" tab='{{ i18n "pages.settings.xrayConfiguration"}}'> | 
					
						
							|  |  |  |                             <a-list item-layout="horizontal" :style="themeSwitcher.textStyle"> | 
					
						
							|  |  |  |                                 <a-divider style="padding: 20px;">{{ i18n "pages.settings.actions"}}</a-divider> | 
					
						
							|  |  |  |                                 <a-space direction="horizontal" style="padding: 0px 20px"> | 
					
						
							|  |  |  |                                     <a-button type="primary" @click="resetXrayConfigToDefault">{{ i18n "pages.settings.resetDefaultConfig" }}</a-button> | 
					
						
							|  |  |  |                                 </a-space> | 
					
						
							|  |  |  |                                 <a-divider style="padding: 20px;">{{ i18n "pages.settings.templates.title"}} </a-divider> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                     <h2 class="alert-msg"> | 
					
						
							|  |  |  |                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                         {{ i18n "pages.settings.infoDesc" }} | 
					
						
							|  |  |  |                                     </h2> | 
					
						
							|  |  |  |                                 </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-11 10:34:35 +00:00
										 |  |  |                                 <a-tabs class="ant-card-dark-box-nohover" default-active-key="tpl-1" :class="themeSwitcher.darkCardClass" style="padding: 20px 20px;"> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                     <a-tab-pane key="tpl-1" tab='{{ i18n "pages.settings.templates.basicTemplate"}}' style="padding-top: 20px;"> | 
					
						
							|  |  |  |                                         <a-collapse> | 
					
						
							|  |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.generalConfigs"}}'> | 
					
						
							|  |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.generalConfigsDesc" }} | 
					
						
							|  |  |  |                                                     </h2> | 
					
						
							|  |  |  |                                                 </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                 <a-list-item> | 
					
						
							|  |  |  |                                                     <a-row style="padding: 20px"> | 
					
						
							|  |  |  |                                                         <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                             <a-list-item-meta  | 
					
						
							|  |  |  |                                                                 title='{{ i18n "pages.settings.templates.xrayConfigFreedomStrategy" }}' | 
					
						
							|  |  |  |                                                                 description='{{ i18n "pages.settings.templates.xrayConfigFreedomStrategyDesc" }}'/> | 
					
						
							|  |  |  |                                                         </a-col> | 
					
						
							|  |  |  |                                                         <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                             <template> | 
					
						
							|  |  |  |                                                                 <a-select | 
					
						
							|  |  |  |                                                                     v-model="freedomStrategy" | 
					
						
							|  |  |  |                                                                     :dropdown-class-name="themeSwitcher.darkCardClass" | 
					
						
							|  |  |  |                                                                     style="width: 100%"> | 
					
						
							|  |  |  |                                                                     <a-select-option v-for="s in outboundDomainStrategies" :value="s">[[ s ]]</a-select-option> | 
					
						
							|  |  |  |                                                                 </a-select> | 
					
						
							|  |  |  |                                                             </template> | 
					
						
							|  |  |  |                                                         </a-col> | 
					
						
							|  |  |  |                                                     </a-row> | 
					
						
							|  |  |  |                                                 </a-list-item> | 
					
						
							|  |  |  |                                                 <a-row style="padding: 20px"> | 
					
						
							|  |  |  |                                                     <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                         <a-list-item-meta  | 
					
						
							|  |  |  |                                                             title='{{ i18n "pages.settings.templates.xrayConfigRoutingStrategy" }}' | 
					
						
							|  |  |  |                                                             description='{{ i18n "pages.settings.templates.xrayConfigRoutingStrategyDesc" }}'/> | 
					
						
							|  |  |  |                                                     </a-col> | 
					
						
							|  |  |  |                                                     <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                                         <template> | 
					
						
							|  |  |  |                                                             <a-select | 
					
						
							|  |  |  |                                                                 v-model="routingStrategy" | 
					
						
							|  |  |  |                                                                 :dropdown-class-name="themeSwitcher.darkCardClass" | 
					
						
							|  |  |  |                                                                 style="width: 100%"> | 
					
						
							|  |  |  |                                                                 <a-select-option v-for="s in routingDomainStrategies" :value="s">[[ s ]]</a-select-option> | 
					
						
							|  |  |  |                                                             </a-select> | 
					
						
							|  |  |  |                                                         </template> | 
					
						
							|  |  |  |                                                     </a-col> | 
					
						
							|  |  |  |                                                 </a-row> | 
					
						
							|  |  |  |                                             </a-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							|  |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.blockConfigs"}}'> | 
					
						
							|  |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.blockConfigsDesc" }} | 
					
						
							|  |  |  |                                                     </h2> | 
					
						
							|  |  |  |                                                 </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigTorrent"}}' desc='{{ i18n "pages.settings.templates.xrayConfigTorrentDesc"}}' v-model="torrentSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigPrivateIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigPrivateIpDesc"}}' v-model="privateIpSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigAds"}}' desc='{{ i18n "pages.settings.templates.xrayConfigAdsDesc"}}' v-model="AdsSettings"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigFamily"}}' desc='{{ i18n "pages.settings.templates.xrayConfigFamilyDesc"}}' v-model="familyProtectSettings"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-12 17:28:28 +00:00
										 |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigSpeedtest"}}' desc='{{ i18n "pages.settings.templates.xrayConfigSpeedtestDesc"}}' v-model="SpeedTestSettings"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                             </a-collapse-panel> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.blockCountryConfigs"}}'> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.blockCountryConfigsDesc" }} | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                     </h2> | 
					
						
							|  |  |  |                                                 </a-row> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigIRIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigIRIpDesc"}}' v-model="IRIpSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigIRDomain"}}' desc='{{ i18n "pages.settings.templates.xrayConfigIRDomainDesc"}}' v-model="IRDomainSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigChinaIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigChinaIpDesc"}}' v-model="ChinaIpSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigChinaDomain"}}' desc='{{ i18n "pages.settings.templates.xrayConfigChinaDomainDesc"}}' v-model="ChinaDomainSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigRussiaIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigRussiaIpDesc"}}' v-model="RussiaIpSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigRussiaDomain"}}' desc='{{ i18n "pages.settings.templates.xrayConfigRussiaDomainDesc"}}' v-model="RussiaDomainSettings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.directCountryConfigs"}}'> | 
					
						
							|  |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.directCountryConfigsDesc" }} | 
					
						
							|  |  |  |                                                     </h2> | 
					
						
							|  |  |  |                                                 </a-row> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigDirectIRIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigDirectIRIpDesc"}}' v-model="IRIpDirectSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigDirectIRDomain"}}' desc='{{ i18n "pages.settings.templates.xrayConfigDirectIRDomainDesc"}}' v-model="IRDomainDirectSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigDirectChinaIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigDirectChinaIpDesc"}}' v-model="ChinaIpDirectSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigDirectChinaDomain"}}' desc='{{ i18n "pages.settings.templates.xrayConfigDirectChinaDomainDesc"}}' v-model="ChinaDomainDirectSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigDirectRussiaIp"}}' desc='{{ i18n "pages.settings.templates.xrayConfigDirectRussiaIpDesc"}}' v-model="RussiaIpDirectSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigDirectRussiaDomain"}}' desc='{{ i18n "pages.settings.templates.xrayConfigDirectRussiaDomainDesc"}}' v-model="RussiaDomainDirectSettings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.ipv4Configs"}}'> | 
					
						
							|  |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.ipv4ConfigsDesc" }} | 
					
						
							|  |  |  |                                                     </h2> | 
					
						
							| 
									
										
										
										
											2023-05-04 17:04:15 +00:00
										 |  |  |                                                 </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigGoogleIPv4"}}' desc='{{ i18n "pages.settings.templates.xrayConfigGoogleIPv4Desc"}}' v-model="GoogleIPv4Settings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigNetflixIPv4"}}' desc='{{ i18n "pages.settings.templates.xrayConfigNetflixIPv4Desc"}}' v-model="NetflixIPv4Settings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							|  |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.warpConfigs"}}'> | 
					
						
							|  |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.warpConfigsDesc" }} | 
					
						
							|  |  |  |                                                     </h2> | 
					
						
							| 
									
										
										
										
											2023-05-04 17:04:15 +00:00
										 |  |  |                                                 </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigGoogleWARP"}}' desc='{{ i18n "pages.settings.templates.xrayConfigGoogleWARPDesc"}}' v-model="GoogleWARPSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigOpenAIWARP"}}' desc='{{ i18n "pages.settings.templates.xrayConfigOpenAIWARPDesc"}}' v-model="OpenAIWARPSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigNetflixWARP"}}' desc='{{ i18n "pages.settings.templates.xrayConfigNetflixWARPDesc"}}' v-model="NetflixWARPSettings"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.templates.xrayConfigSpotifyWARP"}}' desc='{{ i18n "pages.settings.templates.xrayConfigSpotifyWARPDesc"}}' v-model="SpotifyWARPSettings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.manualLists"}}'> | 
					
						
							|  |  |  |                                                 <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                                                     <h2 class="collapse-title"> | 
					
						
							|  |  |  |                                                         <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                                         {{ i18n "pages.settings.templates.manualListsDesc" }} | 
					
						
							|  |  |  |                                                     </h2> | 
					
						
							|  |  |  |                                                 </a-row> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualBlockedIPs"}}' v-model="manualBlockedIPs"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualBlockedDomains"}}' v-model="manualBlockedDomains"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualDirectIPs"}}' v-model="manualDirectIPs"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualDirectDomains"}}' v-model="manualDirectDomains"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualIPv4Domains"}}' v-model="manualIPv4Domains"></setting-list-item> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualWARPDomains"}}' v-model="manualWARPDomains"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                             </a-collapse-panel> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                                         </a-collapse> | 
					
						
							|  |  |  |                                     </a-tab-pane> | 
					
						
							|  |  |  |                                     <a-tab-pane key="tpl-2" tab='{{ i18n "pages.settings.templates.advancedTemplate"}}' style="padding-top: 20px;"> | 
					
						
							|  |  |  |                                         <a-collapse> | 
					
						
							|  |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.xrayConfigInbounds"}}'> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.xrayConfigInbounds"}}' desc='{{ i18n "pages.settings.templates.xrayConfigInboundsDesc"}}' v-model="inboundSettings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							|  |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.xrayConfigOutbounds"}}'> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.xrayConfigOutbounds"}}' desc='{{ i18n "pages.settings.templates.xrayConfigOutboundsDesc"}}' v-model="outboundSettings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							|  |  |  |                                             <a-collapse-panel header='{{ i18n "pages.settings.templates.xrayConfigRoutings"}}'> | 
					
						
							|  |  |  |                                                 <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.xrayConfigRoutings"}}' desc='{{ i18n "pages.settings.templates.xrayConfigRoutingsDesc"}}' v-model="routingRuleSettings"></setting-list-item> | 
					
						
							|  |  |  |                                             </a-collapse-panel> | 
					
						
							|  |  |  |                                         </a-collapse> | 
					
						
							|  |  |  |                                     </a-tab-pane> | 
					
						
							|  |  |  |                                     <a-tab-pane key="tpl-3" tab='{{ i18n "pages.settings.templates.completeTemplate"}}' style="padding-top: 20px;"> | 
					
						
							|  |  |  |                                         <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.xrayConfigTemplate"}}' desc='{{ i18n "pages.settings.templates.xrayConfigTemplateDesc"}}' v-model="allSetting.xrayTemplateConfig"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-04 17:04:15 +00:00
										 |  |  |                                     </a-tab-pane> | 
					
						
							|  |  |  |                                 </a-tabs> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                             </a-list> | 
					
						
							|  |  |  |                         </a-tab-pane> | 
					
						
							| 
									
										
										
										
											2023-05-04 17:04:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                         <a-tab-pane key="4" tab='{{ i18n "pages.settings.TGBotSettings"}}'> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:27:10 +00:00
										 |  |  |                             <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							|  |  |  |                                 <h2 class="alert-msg"> | 
					
						
							|  |  |  |                                     <a-icon type="warning"></a-icon> | 
					
						
							|  |  |  |                                     {{ i18n "pages.settings.infoDesc" }} | 
					
						
							|  |  |  |                                 </h2> | 
					
						
							|  |  |  |                             </a-row> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                             <a-list item-layout="horizontal" :style="themeSwitcher.textStyle"> | 
					
						
							|  |  |  |                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.telegramBotEnable" }}' desc='{{ i18n "pages.settings.telegramBotEnableDesc" }}' v-model="allSetting.tgBotEnable"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.telegramToken"}}' desc='{{ i18n "pages.settings.telegramTokenDesc"}}' v-model="allSetting.tgBotToken"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.telegramChatId"}}' desc='{{ i18n "pages.settings.telegramChatIdDesc"}}' v-model="allSetting.tgBotChatId"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.telegramNotifyTime"}}' desc='{{ i18n "pages.settings.telegramNotifyTimeDesc"}}' v-model="allSetting.tgRunTime"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.tgNotifyBackup" }}' desc='{{ i18n "pages.settings.tgNotifyBackupDesc" }}' v-model="allSetting.tgBotBackup"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.tgNotifyCpu" }}' desc='{{ i18n "pages.settings.tgNotifyCpuDesc" }}' v-model="allSetting.tgCpu" :min="0" :max="100"></setting-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-20 14:50:54 +00:00
										 |  |  |                                 <a-list-item> | 
					
						
							|  |  |  |                                     <a-row style="padding: 20px"> | 
					
						
							|  |  |  |                                         <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                             <a-list-item-meta title="Telegram Bot Language" /> | 
					
						
							|  |  |  |                                         </a-col> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                                         <a-col :lg="24" :xl="12"> | 
					
						
							|  |  |  |                                             <template> | 
					
						
							|  |  |  |                                                 <a-select | 
					
						
							|  |  |  |                                                     ref="selectBotLang" | 
					
						
							|  |  |  |                                                     v-model="allSetting.tgLang" | 
					
						
							|  |  |  |                                                     :dropdown-class-name="themeSwitcher.darkCardClass" | 
					
						
							|  |  |  |                                                     style="width: 100%" | 
					
						
							|  |  |  |                                                 > | 
					
						
							|  |  |  |                                                     <a-select-option :value="l.value" :label="l.value" v-for="l in supportLangs"> | 
					
						
							|  |  |  |                                                         <span role="img" aria-label="l.name" v-text="l.icon"></span> | 
					
						
							|  |  |  |                                                           <span v-text="l.name"></span> | 
					
						
							|  |  |  |                                                     </a-select-option> | 
					
						
							|  |  |  |                                                 </a-select> | 
					
						
							|  |  |  |                                             </template> | 
					
						
							|  |  |  |                                         </a-col> | 
					
						
							|  |  |  |                                     </a-row> | 
					
						
							|  |  |  |                                 </a-list-item> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                             </a-list> | 
					
						
							|  |  |  |                         </a-tab-pane> | 
					
						
							| 
									
										
										
										
											2023-05-22 14:36:34 +00:00
										 |  |  |                         <a-tab-pane key="5" tab='{{ i18n "pages.settings.subSettings" }}'> | 
					
						
							|  |  |  |                             <a-row :xs="24" :sm="24" :lg="12"> | 
					
						
							| 
									
										
										
										
											2023-05-22 14:46:24 +00:00
										 |  |  |                                 <h2 class="alert-msg"> | 
					
						
							|  |  |  |                                     <a-icon type="warning"></a-icon> | 
					
						
							| 
									
										
										
										
											2023-05-22 14:36:34 +00:00
										 |  |  |                                     {{ i18n "pages.settings.infoDesc" }} | 
					
						
							|  |  |  |                                 </h2> | 
					
						
							|  |  |  |                             </a-row> | 
					
						
							|  |  |  |                             <a-list item-layout="horizontal" :style="themeSwitcher.textStyle"> | 
					
						
							|  |  |  |                                 <setting-list-item type="switch" title='{{ i18n "pages.settings.subEnable"}}' desc='{{ i18n "pages.settings.subEnableDesc"}}' v-model="allSetting.subEnable"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.subListen"}}' desc='{{ i18n "pages.settings.subListenDesc"}}' v-model="allSetting.subListen"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.subPort"}}' desc='{{ i18n "pages.settings.subPortDesc"}}' v-model.number="allSetting.subPort"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.subPath"}}' desc='{{ i18n "pages.settings.subPathDesc"}}' v-model="allSetting.subPath"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.subDomain"}}' desc='{{ i18n "pages.settings.subDomainDesc"}}' v-model="allSetting.subDomain"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.subCertPath"}}' desc='{{ i18n "pages.settings.subCertPathDesc"}}' v-model="allSetting.subCertFile"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="text" title='{{ i18n "pages.settings.subKeyPath"}}' desc='{{ i18n "pages.settings.subKeyPathDesc"}}' v-model="allSetting.subKeyFile"></setting-list-item> | 
					
						
							|  |  |  |                                 <setting-list-item type="number" title='{{ i18n "pages.settings.subUpdates"}}' desc='{{ i18n "pages.settings.subUpdatesDesc"}}' v-model="allSetting.subUpdates"></setting-list-item> | 
					
						
							|  |  |  |                             </a-list> | 
					
						
							|  |  |  |                         </a-tab-pane> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                     </a-tabs> | 
					
						
							|  |  |  |                 </a-space> | 
					
						
							|  |  |  |             </a-spin> | 
					
						
							|  |  |  |         </a-layout-content> | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  |     </a-layout> | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  | </a-layout> | 
					
						
							|  |  |  | {{template "js" .}} | 
					
						
							|  |  |  | {{template "component/themeSwitcher" .}} | 
					
						
							| 
									
										
										
										
											2023-05-08 14:56:01 +00:00
										 |  |  | {{template "component/password" .}} | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  | {{template "component/setting"}} | 
					
						
							|  |  |  | <script> | 
					
						
							|  |  |  |     const app = new Vue({ | 
					
						
							|  |  |  |         delimiters: ['[[', ']]'], | 
					
						
							|  |  |  |         el: '#app', | 
					
						
							|  |  |  |         data: { | 
					
						
							| 
									
										
										
										
											2023-05-14 01:38:49 +00:00
										 |  |  |             siderDrawer, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             themeSwitcher, | 
					
						
							|  |  |  |             spinning: false, | 
					
						
							|  |  |  |             oldAllSetting: new AllSetting(), | 
					
						
							|  |  |  |             allSetting: new AllSetting(), | 
					
						
							|  |  |  |             saveBtnDisable: true, | 
					
						
							|  |  |  |             user: new User(), | 
					
						
							|  |  |  |             lang: getLang(), | 
					
						
							|  |  |  |             ipv4Settings: { | 
					
						
							|  |  |  |                 tag: "IPv4", | 
					
						
							|  |  |  |                 protocol: "freedom", | 
					
						
							|  |  |  |                 settings: { | 
					
						
							|  |  |  |                     domainStrategy: "UseIPv4" | 
					
						
							| 
									
										
										
										
											2023-04-18 06:52:44 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             warpSettings: { | 
					
						
							|  |  |  |                 tag: "WARP", | 
					
						
							|  |  |  |                 protocol: "socks", | 
					
						
							|  |  |  |                 settings: { | 
					
						
							|  |  |  |                     servers: [ | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             address: "127.0.0.1", | 
					
						
							|  |  |  |                             port: 40000 | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     ] | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             directSettings: { | 
					
						
							|  |  |  |                 tag: "direct", | 
					
						
							|  |  |  |                 protocol: "freedom" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             outboundDomainStrategies: ["AsIs", "UseIP", "UseIPv4", "UseIPv6"], | 
					
						
							|  |  |  |             routingDomainStrategies: ["AsIs", "IPIfNonMatch", "IPOnDemand"], | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             settingsData: { | 
					
						
							|  |  |  |                 protocols: { | 
					
						
							|  |  |  |                     bittorrent: ["bittorrent"], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 ips: { | 
					
						
							|  |  |  |                     local: ["geoip:private"], | 
					
						
							|  |  |  |                     cn: ["geoip:cn"], | 
					
						
							|  |  |  |                     ir: ["geoip:ir"], | 
					
						
							|  |  |  |                     ru: ["geoip:ru"], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 domains: { | 
					
						
							|  |  |  |                     ads: [ | 
					
						
							|  |  |  |                         "geosite:category-ads-all", | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                         "ext:iran.dat:ads" | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                     ], | 
					
						
							| 
									
										
										
										
											2023-05-12 17:28:28 +00:00
										 |  |  |                     speedtest: ["geosite:speedtest"], | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                     openai: ["geosite:openai"], | 
					
						
							|  |  |  |                     google: ["geosite:google"], | 
					
						
							|  |  |  |                     spotify: ["geosite:spotify"], | 
					
						
							|  |  |  |                     netflix: ["geosite:netflix"], | 
					
						
							|  |  |  |                     cn: [ | 
					
						
							|  |  |  |                         "geosite:cn", | 
					
						
							|  |  |  |                         "regexp:.*\\.cn$" | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     ru: [ | 
					
						
							|  |  |  |                         "geosite:category-gov-ru", | 
					
						
							|  |  |  |                         "regexp:.*\\.ru$" | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     ir: [ | 
					
						
							|  |  |  |                         "regexp:.*\\.ir$", | 
					
						
							|  |  |  |                         "ext:iran.dat:ir", | 
					
						
							|  |  |  |                         "ext:iran.dat:other", | 
					
						
							|  |  |  |                         "geosite:category-ir" | 
					
						
							|  |  |  |                     ] | 
					
						
							| 
									
										
										
										
											2023-04-18 06:53:15 +00:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 familyProtectDNS: { | 
					
						
							|  |  |  |                     "servers": [ | 
					
						
							|  |  |  |                         "1.1.1.3",  // https://developers.cloudflare.com/1.1.1.1/setup/ | 
					
						
							|  |  |  |                         "1.0.0.3", | 
					
						
							| 
									
										
										
										
											2023-05-16 23:35:36 +00:00
										 |  |  |                         "94.140.14.15",  // https://adguard-dns.io/kb/general/dns-providers/ | 
					
						
							|  |  |  |                         "94.140.15.16" | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     ], | 
					
						
							|  |  |  |                     "queryStrategy": "UseIPv4" | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         methods: { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             loading(spinning = true) { | 
					
						
							|  |  |  |                 this.spinning = spinning; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             async getAllSetting() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-12 18:06:05 +00:00
										 |  |  |                 const msg = await HttpUtil.post("/panel/setting/all"); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.loading(false); | 
					
						
							|  |  |  |                 if (msg.success) { | 
					
						
							|  |  |  |                     this.oldAllSetting = new AllSetting(msg.obj); | 
					
						
							|  |  |  |                     this.allSetting = new AllSetting(msg.obj); | 
					
						
							|  |  |  |                     this.saveBtnDisable = true; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 await this.fetchUserSecret(); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             async updateAllSetting() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-12 18:06:05 +00:00
										 |  |  |                 const msg = await HttpUtil.post("/panel/setting/update", this.allSetting); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.loading(false); | 
					
						
							|  |  |  |                 if (msg.success) { | 
					
						
							|  |  |  |                     await this.getAllSetting(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             async updateUser() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-12 18:06:05 +00:00
										 |  |  |                 const msg = await HttpUtil.post("/panel/setting/updateUser", this.user); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.loading(false); | 
					
						
							|  |  |  |                 if (msg.success) { | 
					
						
							|  |  |  |                     this.user = {}; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:45:33 +00:00
										 |  |  |                     window.location.replace(basePath + "logout") | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             async restartPanel() { | 
					
						
							|  |  |  |                 await new Promise(resolve => { | 
					
						
							|  |  |  |                     this.$confirm({ | 
					
						
							|  |  |  |                         title: '{{ i18n "pages.settings.restartPanel" }}', | 
					
						
							|  |  |  |                         content: '{{ i18n "pages.settings.restartPanelDesc" }}', | 
					
						
							|  |  |  |                         okText: '{{ i18n "sure" }}', | 
					
						
							|  |  |  |                         cancelText: '{{ i18n "cancel" }}', | 
					
						
							|  |  |  |                         onOk: () => resolve(), | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  |                     }); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }); | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-12 18:06:05 +00:00
										 |  |  |                 const msg = await HttpUtil.post("/panel/setting/restartPanel"); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.loading(false); | 
					
						
							|  |  |  |                 if (msg.success) { | 
					
						
							| 
									
										
										
										
											2023-04-23 23:18:17 +00:00
										 |  |  |                     this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                     await PromiseUtil.sleep(5000); | 
					
						
							| 
									
										
										
										
											2023-05-20 14:28:51 +00:00
										 |  |  |                     let protocol = "http://"; | 
					
						
							|  |  |  |                     if (this.allSetting.webCertFile !== "") { | 
					
						
							|  |  |  |                         protocol = "https://"; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-22 18:00:35 +00:00
										 |  |  |                     const { host } = window.location; | 
					
						
							|  |  |  |                     window.location.replace(protocol + host + this.allSetting.webBasePath + "panel/settings"); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             async fetchUserSecret() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							|  |  |  |                 const userMessage = await HttpUtil.post("/panel/setting/getUserSecret", this.user); | 
					
						
							|  |  |  |                 if (userMessage.success) { | 
					
						
							|  |  |  |                     this.user = userMessage.obj; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 this.loading(false); | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             async updateSecret() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-12 18:06:05 +00:00
										 |  |  |                 const msg = await HttpUtil.post("/panel/setting/updateUserSecret", this.user); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 if (msg.success) { | 
					
						
							|  |  |  |                     this.user = msg.obj; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     window.location.replace(basePath + "logout"); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 this.loading(false); | 
					
						
							|  |  |  |                 await this.updateAllSetting(); | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             generateRandomString(length) { | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 let randomString = ""; | 
					
						
							|  |  |  |                 for (let i = 0; i < length; i++) { | 
					
						
							|  |  |  |                     randomString += chars[Math.floor(Math.random() * chars.length)]; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 return randomString; | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             async getNewSecret() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							|  |  |  |                 await PromiseUtil.sleep(600); | 
					
						
							|  |  |  |                 const newSecret = this.generateRandomString(64); | 
					
						
							|  |  |  |                 this.user.loginSecret = newSecret; | 
					
						
							|  |  |  |                 document.getElementById("token").textContent = newSecret; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.loading(false); | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             async toggleToken(value) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 if (value) { | 
					
						
							|  |  |  |                 await this.getNewSecret(); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                 this.user.loginSecret = ""; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             async resetXrayConfigToDefault() { | 
					
						
							|  |  |  |                 this.loading(true); | 
					
						
							| 
									
										
										
										
											2023-05-12 18:06:05 +00:00
										 |  |  |                 const msg = await HttpUtil.get("/panel/setting/getDefaultJsonConfig"); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.loading(false); | 
					
						
							|  |  |  |                 if (msg.success) { | 
					
						
							|  |  |  |                     this.templateSettings = JSON.parse(JSON.stringify(msg.obj, null, 2)); | 
					
						
							|  |  |  |                     this.saveBtnDisable = true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             syncRulesWithOutbound(tag, setting) { | 
					
						
							|  |  |  |                 const newTemplateSettings = {...this.templateSettings}; | 
					
						
							|  |  |  |                 const haveRules = newTemplateSettings.routing.rules.some((r) => r?.outboundTag === tag); | 
					
						
							|  |  |  |                 const outboundIndex = newTemplateSettings.outbounds.findIndex((o) => o.tag === tag); | 
					
						
							|  |  |  |                 if (!haveRules && outboundIndex >= 0) { | 
					
						
							|  |  |  |                     newTemplateSettings.outbounds.splice(outboundIndex, 1); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 if (haveRules && outboundIndex === -1) { | 
					
						
							|  |  |  |                     newTemplateSettings.outbounds.push(setting); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 this.templateSettings = newTemplateSettings; | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             templateRuleGetter(routeSettings) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 const { property, outboundTag } = routeSettings; | 
					
						
							|  |  |  |                 let result = []; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 if (this.templateSettings != null) { | 
					
						
							|  |  |  |                     this.templateSettings.routing.rules.forEach( | 
					
						
							|  |  |  |                         (routingRule) => { | 
					
						
							|  |  |  |                             if ( | 
					
						
							|  |  |  |                                 routingRule.hasOwnProperty(property) && | 
					
						
							|  |  |  |                                 routingRule.hasOwnProperty("outboundTag") && | 
					
						
							|  |  |  |                                 routingRule.outboundTag === outboundTag | 
					
						
							|  |  |  |                             ) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                 result.push(...routingRule[property]); | 
					
						
							| 
									
										
										
										
											2023-04-18 06:53:15 +00:00
										 |  |  |                             } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                         } | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 return result; | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             templateRuleSetter(routeSettings) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 const { data, property, outboundTag } = routeSettings; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 const oldTemplateSettings = this.templateSettings; | 
					
						
							|  |  |  |                 const newTemplateSettings = oldTemplateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 currentProperty = this.templateRuleGetter({ outboundTag, property }) | 
					
						
							|  |  |  |                 if (currentProperty.length == 0) { | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                     const propertyRule = { | 
					
						
							|  |  |  |                         type: "field", | 
					
						
							|  |  |  |                         outboundTag, | 
					
						
							|  |  |  |                         [property]: data | 
					
						
							|  |  |  |                     }; | 
					
						
							|  |  |  |                     newTemplateSettings.routing.rules.push(propertyRule); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else { | 
					
						
							|  |  |  |                     const newRules = []; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     insertedOnce = false; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                     newTemplateSettings.routing.rules.forEach( | 
					
						
							|  |  |  |                         (routingRule) => { | 
					
						
							|  |  |  |                             if ( | 
					
						
							|  |  |  |                                 routingRule.hasOwnProperty(property) && | 
					
						
							|  |  |  |                                 routingRule.hasOwnProperty("outboundTag") && | 
					
						
							|  |  |  |                                 routingRule.outboundTag === outboundTag | 
					
						
							|  |  |  |                             ) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                                 if (!insertedOnce && data.length > 0) { | 
					
						
							|  |  |  |                                     insertedOnce = true; | 
					
						
							|  |  |  |                                     routingRule[property] = data; | 
					
						
							|  |  |  |                                     newRules.push(routingRule); | 
					
						
							| 
									
										
										
										
											2023-04-18 06:53:15 +00:00
										 |  |  |                                 } | 
					
						
							|  |  |  |                             } | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                             else { | 
					
						
							|  |  |  |                                 newRules.push(routingRule); | 
					
						
							|  |  |  |                             } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                         } | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  |                     newTemplateSettings.routing.rules = newRules; | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.templateSettings = newTemplateSettings; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         async mounted() { | 
					
						
							|  |  |  |             await this.getAllSetting(); | 
					
						
							|  |  |  |             while (true) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 await PromiseUtil.sleep(600); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 this.saveBtnDisable = this.oldAllSetting.equals(this.allSetting); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         computed: { | 
					
						
							|  |  |  |             templateSettings: { | 
					
						
							|  |  |  |                 get: function () { return this.allSetting.xrayTemplateConfig ? JSON.parse(this.allSetting.xrayTemplateConfig) : null; }, | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                 set: function (newValue) { this.allSetting.xrayTemplateConfig = JSON.stringify(newValue, null, 2); }, | 
					
						
							| 
									
										
										
										
											2023-04-18 06:53:15 +00:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             inboundSettings: { | 
					
						
							|  |  |  |                 get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.inbounds, null, 2) : null; }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     newTemplateSettings = this.templateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     newTemplateSettings.inbounds = JSON.parse(newValue); | 
					
						
							|  |  |  |                     this.templateSettings = newTemplateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2023-03-17 16:07:49 +00:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             outboundSettings: { | 
					
						
							|  |  |  |                 get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.outbounds, null, 2) : null; }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     newTemplateSettings = this.templateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     newTemplateSettings.outbounds = JSON.parse(newValue); | 
					
						
							|  |  |  |                     this.templateSettings = newTemplateSettings; | 
					
						
							| 
									
										
										
										
											2023-04-18 06:53:43 +00:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             routingRuleSettings: { | 
					
						
							|  |  |  |                 get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.routing.rules, null, 2) : null; }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     newTemplateSettings = this.templateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     newTemplateSettings.routing.rules = JSON.parse(newValue); | 
					
						
							|  |  |  |                     this.templateSettings = newTemplateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             freedomStrategy: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     if (!this.templateSettings) return "AsIs"; | 
					
						
							|  |  |  |                     freedomOutbound = this.templateSettings.outbounds.find((o) => o.protocol === "freedom" && !o.tag); | 
					
						
							|  |  |  |                     if (!freedomOutbound) return "AsIs"; | 
					
						
							|  |  |  |                     if (!freedomOutbound.settings || !freedomOutbound.settings.domainStrategy) return "AsIs"; | 
					
						
							|  |  |  |                     return freedomOutbound.settings.domainStrategy; | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     newTemplateSettings = this.templateSettings; | 
					
						
							|  |  |  |                     freedomOutboundIndex = newTemplateSettings.outbounds.findIndex((o) => o.protocol === "freedom" && !o.tag); | 
					
						
							|  |  |  |                     if (!newTemplateSettings.outbounds[freedomOutboundIndex].settings) { | 
					
						
							|  |  |  |                         newTemplateSettings.outbounds[freedomOutboundIndex].settings = {"domainStrategy": newValue}; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         newTemplateSettings.outbounds[freedomOutboundIndex].settings.domainStrategy = newValue; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     this.templateSettings = newTemplateSettings; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             routingStrategy: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     if (!this.templateSettings || !this.templateSettings.routing || !this.templateSettings.routing.domainStrategy) return "AsIs"; | 
					
						
							|  |  |  |                     return this.templateSettings.routing.domainStrategy; | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     newTemplateSettings = this.templateSettings; | 
					
						
							|  |  |  |                     newTemplateSettings.routing.domainStrategy = newValue; | 
					
						
							|  |  |  |                     this.templateSettings = newTemplateSettings; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             blockedIPs: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "blocked", property: "ip" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "blocked", property: "ip", data: newValue }); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             blockedDomains: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "blocked", property: "domain" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "blocked", property: "domain", data: newValue }); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             blockedProtocols: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "blocked", property: "protocol" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "blocked", property: "protocol", data: newValue }); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             directIPs: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "direct", property: "ip" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "direct", property: "ip", data: newValue }); | 
					
						
							|  |  |  |                     this.syncRulesWithOutbound("direct", this.directSettings); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             directDomains: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "direct", property: "domain" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "direct", property: "domain", data: newValue }); | 
					
						
							|  |  |  |                     this.syncRulesWithOutbound("direct", this.directSettings); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |             ipv4Domains: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "IPv4", property: "domain" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "IPv4", property: "domain", data: newValue }); | 
					
						
							|  |  |  |                     this.syncRulesWithOutbound("IPv4", this.ipv4Settings); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             warpDomains: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return this.templateRuleGetter({ outboundTag: "WARP", property: "domain" }); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     this.templateRuleSetter({ outboundTag: "WARP", property: "domain", data: newValue }); | 
					
						
							|  |  |  |                     this.syncRulesWithOutbound("WARP", this.warpSettings); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             manualBlockedIPs: { | 
					
						
							|  |  |  |                 get: function () { return JSON.stringify(this.blockedIPs, null, 2); }, | 
					
						
							|  |  |  |                 set: debounce(function (value) { this.blockedIPs = JSON.parse(value); }, 1000) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             manualBlockedDomains: { | 
					
						
							|  |  |  |                 get: function () { return JSON.stringify(this.blockedDomains, null, 2); }, | 
					
						
							|  |  |  |                 set: debounce(function (value) { this.blockedDomains = JSON.parse(value); }, 1000) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             manualDirectIPs: { | 
					
						
							|  |  |  |                 get: function () { return JSON.stringify(this.directIPs, null, 2); }, | 
					
						
							|  |  |  |                 set: debounce(function (value) { this.directIPs = JSON.parse(value); }, 1000) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             manualDirectDomains: { | 
					
						
							|  |  |  |                 get: function () { return JSON.stringify(this.directDomains, null, 2); }, | 
					
						
							|  |  |  |                 set: debounce(function (value) { this.directDomains = JSON.parse(value); }, 1000) | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |             manualIPv4Domains: { | 
					
						
							|  |  |  |                 get: function () { return JSON.stringify(this.ipv4Domains, null, 2); }, | 
					
						
							|  |  |  |                 set: debounce(function (value) { this.ipv4Domains = JSON.parse(value); }, 1000) | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             manualWARPDomains: { | 
					
						
							|  |  |  |                 get: function () { return JSON.stringify(this.warpDomains, null, 2); }, | 
					
						
							|  |  |  |                 set: debounce(function (value) { this.warpDomains = JSON.parse(value); }, 1000) | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             torrentSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.protocols.bittorrent, this.blockedProtocols); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedProtocols = [...this.blockedProtocols, ...this.settingsData.protocols.bittorrent]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedProtocols = this.blockedProtocols.filter(data => !this.settingsData.protocols.bittorrent.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             privateIpSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.ips.local, this.blockedIPs); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.local]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.local.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             AdsSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.ads, this.blockedDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.ads]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.ads.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             SpeedTestSettings: { | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.speedtest, this.blockedDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.speedtest]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.speedtest.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |             familyProtectSettings: { | 
					
						
							| 
									
										
										
										
											2023-05-12 17:28:28 +00:00
										 |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (!this.templateSettings || !this.templateSettings.dns || !this.templateSettings.dns.servers) return false; | 
					
						
							|  |  |  |                     return doAllItemsExist(this.templateSettings.dns.servers, this.settingsData.familyProtectDNS.servers); | 
					
						
							| 
									
										
										
										
											2023-05-12 17:28:28 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     newTemplateSettings = this.templateSettings; | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         newTemplateSettings.dns = this.settingsData.familyProtectDNS; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         delete newTemplateSettings.dns; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     this.templateSettings = newTemplateSettings; | 
					
						
							| 
									
										
										
										
											2023-05-12 17:28:28 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             GoogleIPv4Settings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.google, this.ipv4Domains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.ipv4Domains = [...this.ipv4Domains, ...this.settingsData.domains.google]; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.ipv4Domains = this.ipv4Domains.filter(data => !this.settingsData.domains.google.includes(data)); | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             NetflixIPv4Settings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.netflix, this.ipv4Domains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.ipv4Domains = [...this.ipv4Domains, ...this.settingsData.domains.netflix]; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.ipv4Domains = this.ipv4Domains.filter(data => !this.settingsData.domains.netflix.includes(data)); | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             IRIpSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.ips.ir, this.blockedIPs); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.ir]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.ir.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             IRDomainSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.ir, this.blockedDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.ir]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.ir.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             ChinaIpSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.ips.cn, this.blockedIPs); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.cn]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.cn.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             ChinaDomainSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.cn, this.blockedDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.cn]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.cn.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             RussiaIpSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.ips.ru, this.blockedIPs); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedIPs = [...this.blockedIPs, ...this.settingsData.ips.ru]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedIPs = this.blockedIPs.filter(data => !this.settingsData.ips.ru.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             RussiaDomainSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.ru, this.blockedDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.blockedDomains = [...this.blockedDomains, ...this.settingsData.domains.ru]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.blockedDomains = this.blockedDomains.filter(data => !this.settingsData.domains.ru.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             IRIpDirectSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return doAllItemsExist(this.settingsData.ips.ir, this.directIPs); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.directIPs = [...this.directIPs, ...this.settingsData.ips.ir]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.ir.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             IRDomainDirectSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return doAllItemsExist(this.settingsData.domains.ir, this.directDomains); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.directDomains = [...this.directDomains, ...this.settingsData.domains.ir]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.ir.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             ChinaIpDirectSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return doAllItemsExist(this.settingsData.ips.cn, this.directIPs); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.directIPs = [...this.directIPs, ...this.settingsData.ips.cn]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.cn.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             ChinaDomainDirectSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return doAllItemsExist(this.settingsData.domains.cn, this.directDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.directDomains = [...this.directDomains, ...this.settingsData.domains.cn]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.cn.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             RussiaIpDirectSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return doAllItemsExist(this.settingsData.ips.ru, this.directIPs); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.directIPs = [...this.directIPs, ...this.settingsData.ips.ru]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.directIPs = this.directIPs.filter(data => !this.settingsData.ips.ru.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             RussiaDomainDirectSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							|  |  |  |                     return doAllItemsExist(this.settingsData.domains.ru, this.directDomains); | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							|  |  |  |                     if (newValue) { | 
					
						
							|  |  |  |                         this.directDomains = [...this.directDomains, ...this.settingsData.domains.ru]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         this.directDomains = this.directDomains.filter(data => !this.settingsData.domains.ru.includes(data)); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             GoogleWARPSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.google, this.warpDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.google]; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.google.includes(data)); | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             OpenAIWARPSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.openai, this.warpDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.openai]; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.openai.includes(data)); | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             NetflixWARPSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.netflix, this.warpDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.netflix]; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.netflix.includes(data)); | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             SpotifyWARPSettings: { | 
					
						
							|  |  |  |                 get: function () { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                     return doAllItemsExist(this.settingsData.domains.spotify, this.warpDomains); | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 set: function (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     if (newValue) { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.spotify]; | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2023-05-20 14:32:37 +00:00
										 |  |  |                         this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.spotify.includes(data)); | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2023-05-16 20:09:59 +00:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2023-05-08 14:44:22 +00:00
										 |  |  |     }); | 
					
						
							|  |  |  | </script> | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | </body> | 
					
						
							| 
									
										
										
										
											2023-05-17 21:18:37 +00:00
										 |  |  | </html> |