mirror of https://github.com/hykilpikonna/AquaDX
Merge branch 'broker' into v1-dev
commit
3c790134ee
|
@ -3,14 +3,13 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { fade } from 'svelte/transition'
|
import { fade } from 'svelte/transition'
|
||||||
import type { ConfirmProps } from "../libs/generalTypes";
|
import type { ConfirmProps } from "../libs/generalTypes";
|
||||||
import { DISCORD_INVITE } from "../libs/config";
|
|
||||||
import { t } from "../libs/i18n"
|
import { t } from "../libs/i18n"
|
||||||
import Loading from './ui/Loading.svelte';
|
import Loading from './ui/Loading.svelte';
|
||||||
import Error from './ui/Error.svelte';
|
import Error from './ui/Error.svelte';
|
||||||
|
|
||||||
// Props
|
// Props
|
||||||
export let confirm: ConfirmProps | null = null
|
export let confirm: ConfirmProps | null = null
|
||||||
export let error: string | null
|
export let error: string | null = null
|
||||||
export let loading: boolean = false
|
export let loading: boolean = false
|
||||||
|
|
||||||
function doConfirm(fn?: () => void) {
|
function doConfirm(fn?: () => void) {
|
||||||
|
|
|
@ -238,9 +238,39 @@ export const EN_REF_MAI_PHOTO = {
|
||||||
'maiphoto.none': 'No photo found. You can upload photo by clicking upload at the end of each game session.',
|
'maiphoto.none': 'No photo found. You can upload photo by clicking upload at the end of each game session.',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const EN_REF_AQUATRANS = {
|
||||||
|
'trans.title': '🏳️⚧️ AquaTrans™ Data Transfer',
|
||||||
|
'trans.confirm.unbackuped.title': 'Confirm transfer',
|
||||||
|
'trans.confirm.unbackuped.msg': "It seems like you haven't backed up your destination data. Are you sure you want to proceed? (This will overwrite your destination server's data)",
|
||||||
|
'trans.confirm.untested.title': 'Error',
|
||||||
|
'trans.confirm.untested.msg': "It seems like you haven't tested both connections yet. Please test the connections first.",
|
||||||
|
'trans.confirm.done.title': 'Done!',
|
||||||
|
'trans.confirm.done.msg': 'Transfer completed successfully! Your data on ${dst} is overwritten with your data from ${src}.',
|
||||||
|
'trans.alert.in-progress': "Transfer already in progress!",
|
||||||
|
'trans.prompt-html': `
|
||||||
|
<p>👋 Welcome to the AquaTrans™ server data transfer tool!</p>
|
||||||
|
<p>You can use this to export data from any server, and input data into any server using the connection credentials (card number, server address, and keychip id).</p>
|
||||||
|
<p>This tool will simulate a game client and pull your data from the source server, and push your data to the destination server.</p>
|
||||||
|
<p>Please fill out the info below to get started!</p>
|
||||||
|
`,
|
||||||
|
'trans.error.empty': 'Please fill out all fields.',
|
||||||
|
'trans.error.untested': 'Please test the connections first.',
|
||||||
|
'trans.success.import': 'Data imported successfully!',
|
||||||
|
'trans.source.title': 'Source Server',
|
||||||
|
'trans.target.title': 'Destination Server',
|
||||||
|
'trans.field.addr': 'Server Address',
|
||||||
|
'trans.field.keychip': 'Keychip ID',
|
||||||
|
'trans.field.game': 'Game',
|
||||||
|
'trans.field.version': 'Version',
|
||||||
|
'trans.field.card': 'Card Number',
|
||||||
|
'trans.btn.test': 'Test Connection',
|
||||||
|
'trans.btn.export': 'Export Data',
|
||||||
|
'trans.btn.import': 'Import Data',
|
||||||
|
}
|
||||||
|
|
||||||
export const EN_REF = { ...EN_REF_USER, ...EN_REF_Welcome, ...EN_REF_GENERAL,
|
export const EN_REF = { ...EN_REF_USER, ...EN_REF_Welcome, ...EN_REF_GENERAL,
|
||||||
...EN_REF_LEADERBOARD, ...EN_REF_HOME, ...EN_REF_SETTINGS, ...EN_REF_USERBOX,
|
...EN_REF_LEADERBOARD, ...EN_REF_HOME, ...EN_REF_SETTINGS, ...EN_REF_USERBOX,
|
||||||
...EN_REF_MAI_PHOTO
|
...EN_REF_MAI_PHOTO, ...EN_REF_AQUATRANS
|
||||||
}
|
}
|
||||||
|
|
||||||
export type LocalizedMessages = typeof EN_REF
|
export type LocalizedMessages = typeof EN_REF
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import {
|
import {
|
||||||
|
EN_REF_AQUATRANS,
|
||||||
EN_REF_GENERAL,
|
EN_REF_GENERAL,
|
||||||
EN_REF_HOME,
|
EN_REF_HOME,
|
||||||
EN_REF_LEADERBOARD,
|
EN_REF_LEADERBOARD,
|
||||||
|
@ -242,5 +243,38 @@ export const zhMaiPhoto: typeof EN_REF_MAI_PHOTO = {
|
||||||
'maiphoto.none': '还没有图片哦~ 可以在每次游戏结束的时候点击上传来上传照片。',
|
'maiphoto.none': '还没有图片哦~ 可以在每次游戏结束的时候点击上传来上传照片。',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const zhAquaTrans: typeof EN_REF_AQUATRANS = {
|
||||||
|
'trans.title': '🏳️⚧️ AquaTrans™ 数据迁移工具',
|
||||||
|
'trans.confirm.unbackuped.title': '确认迁移',
|
||||||
|
'trans.confirm.unbackuped.msg': '似乎还没有备份目标服务器的数据,真的要继续吗?(推荐先备份一下,因为迁移的时候会覆盖数据)',
|
||||||
|
'trans.confirm.untested.title': '不太聪明喵',
|
||||||
|
'trans.confirm.untested.msg': '在两个服务器上都测试完连接之后才能进行数据迁移哦!',
|
||||||
|
'trans.confirm.done.title': '完成!',
|
||||||
|
'trans.confirm.done.msg': '数据迁移成功!在 ${dst} 上的数据已被来自 ${src} 的数据覆盖。',
|
||||||
|
'trans.alert.in-progress': '在迁移了在迁移了',
|
||||||
|
'trans.prompt-html': `
|
||||||
|
<p>👋 欢迎使用 AquaTrans™ 服务器游玩数据迁移工具!</p>
|
||||||
|
<p>这个工具可以导出任意服务器的数据,并使用连接凭证(卡号、服务器地址和 Keychip ID)将数据导入任何其他服务器。</p>
|
||||||
|
<p>我将模拟游戏客户端,从源服务器拉取游戏数据并推送到目标服务器。</p>
|
||||||
|
<p>填写下面的表格开始迁移吧!</p>
|
||||||
|
`,
|
||||||
|
'trans.error.empty': '请填写所有字段。',
|
||||||
|
'trans.error.untested': '请先进行连接测试。',
|
||||||
|
'trans.success.import': '数据导入成功!',
|
||||||
|
'trans.source.title': '源服务器',
|
||||||
|
'trans.target.title': '目标服务器',
|
||||||
|
'trans.field.addr': '服务器地址',
|
||||||
|
'trans.field.keychip': '狗号',
|
||||||
|
'trans.field.game': '游戏',
|
||||||
|
'trans.field.version': '版本',
|
||||||
|
'trans.field.card': '卡号',
|
||||||
|
'trans.btn.test': '测试连接',
|
||||||
|
'trans.btn.export': '导出数据',
|
||||||
|
'trans.btn.import': '导入数据',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export const ZH = { ...zhUser, ...zhWelcome, ...zhGeneral,
|
export const ZH = { ...zhUser, ...zhWelcome, ...zhGeneral,
|
||||||
...zhLeaderboard, ...zhHome, ...zhSettings, ...zhUserbox, ...zhMaiPhoto }
|
...zhLeaderboard, ...zhHome, ...zhSettings, ...zhUserbox, ...zhMaiPhoto,
|
||||||
|
...zhAquaTrans
|
||||||
|
}
|
||||||
|
|
|
@ -40,16 +40,19 @@
|
||||||
srcEl.pull()
|
srcEl.pull()
|
||||||
.then(() => dstEl.push(srcExportedData))
|
.then(() => dstEl.push(srcExportedData))
|
||||||
.then(() => confirm = {
|
.then(() => confirm = {
|
||||||
title: "Done!",
|
title: t('trans.confirm.done.title'),
|
||||||
message: `Transfer completed successfully! Your data on ${dst.dns} is overwritten with your data from ${src.dns}.`
|
message: t('trans.confirm.done.msg', { src: src.dns, dst: dst.dns })
|
||||||
})
|
})
|
||||||
.catch(e => error = e)
|
.catch(e => error = e)
|
||||||
.finally(() => loading = false)
|
.finally(() => loading = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
function startTransfer() {
|
function startTransfer() {
|
||||||
if (!(srcTested && dstTested)) return alert("Please test both servers first!")
|
if (!(srcTested && dstTested)) return confirm = {
|
||||||
if (loading) return alert("Transfer already in progress!")
|
title: t('trans.confirm.untested.title'),
|
||||||
|
message: t('trans.confirm.untested.msg')
|
||||||
|
}
|
||||||
|
if (loading) return alert(t('trans.alert.in-progress'))
|
||||||
console.log("Starting transfer...")
|
console.log("Starting transfer...")
|
||||||
loading = true
|
loading = true
|
||||||
|
|
||||||
|
@ -57,8 +60,8 @@
|
||||||
|
|
||||||
// Ask user to make sure to backup their data
|
// Ask user to make sure to backup their data
|
||||||
confirm = {
|
confirm = {
|
||||||
title: "Confirm transfer",
|
title: t('trans.confirm.unbackuped.title'),
|
||||||
message: "It seems like you haven't backed up your destination data. Are you sure you want to proceed? (This will overwrite your destination server's data)",
|
message: t('trans.confirm.unbackuped.msg'),
|
||||||
dangerous: true,
|
dangerous: true,
|
||||||
confirm: actuallyStartTransfer,
|
confirm: actuallyStartTransfer,
|
||||||
cancel: () => { loading = false }
|
cancel: () => { loading = false }
|
||||||
|
@ -72,7 +75,7 @@
|
||||||
|
|
||||||
<main class="content">
|
<main class="content">
|
||||||
<div class="outer-title-options">
|
<div class="outer-title-options">
|
||||||
<h2>🏳️⚧️ AquaTrans™ Data Transfer?</h2>
|
<h2>{t('trans.title')}</h2>
|
||||||
<nav>
|
<nav>
|
||||||
{#each tabs as tabName, i}
|
{#each tabs as tabName, i}
|
||||||
<div transition:slide={{axis: 'x'}} class:active={tab === i}
|
<div transition:slide={{axis: 'x'}} class:active={tab === i}
|
||||||
|
@ -85,10 +88,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="prompt">
|
<div class="prompt">
|
||||||
<p>👋 Welcome to the AquaTrans™ server data transfer tool!</p>
|
{@html t("trans.prompt-html")}
|
||||||
<p>You can use this to export data from any server, and input data into any server using the connection credentials (card number, server address, and keychip id).</p>
|
|
||||||
<p>This tool will simulate a game client and pull your data from the source server, and push your data to the destination server.</p>
|
|
||||||
<p>Please fill out the info below to get started!</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<TransferServer bind:src={src} bind:gameInfo={gameInfo} on:change={onChange}
|
<TransferServer bind:src={src} bind:gameInfo={gameInfo} on:change={onChange}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import StatusOverlays from "../../components/StatusOverlays.svelte";
|
import StatusOverlays from "../../components/StatusOverlays.svelte";
|
||||||
|
import { t } from "../../libs/i18n";
|
||||||
import { TRANSFER } from "../../libs/sdk";
|
import { TRANSFER } from "../../libs/sdk";
|
||||||
import { download, selectJsonFile } from "../../libs/ui";
|
import { download, selectJsonFile } from "../../libs/ui";
|
||||||
import InputTextShort from "./InputTextShort.svelte";
|
import InputTextShort from "./InputTextShort.svelte";
|
||||||
|
@ -9,23 +10,24 @@
|
||||||
export let isSrc: boolean = true
|
export let isSrc: boolean = true
|
||||||
|
|
||||||
export let tested: boolean = false
|
export let tested: boolean = false
|
||||||
let [loading, error, expectedError] = [false, "", ""]
|
let [loading, error] = [false, ""]
|
||||||
|
|
||||||
function testConnection() {
|
function testConnection() {
|
||||||
if (loading) return
|
if (loading) return
|
||||||
|
|
||||||
// Preliminiary checks
|
// Preliminiary checks
|
||||||
if (!src.dns || !src.keychip || !src.card || !gameInfo.game || !gameInfo.version) {
|
if (!src.dns || !src.keychip || !src.card || !gameInfo.game || !gameInfo.version) {
|
||||||
error = "Please fill out all fields"
|
error = t('trans.error.empty')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
loading = true
|
loading = true
|
||||||
|
error = ""
|
||||||
console.log("Testing connection...")
|
console.log("Testing connection...")
|
||||||
TRANSFER.check({...src, ...gameInfo}).then(res => {
|
return TRANSFER.check({...src, ...gameInfo}).then(res => {
|
||||||
console.log("Connection test result:", res)
|
console.log("Connection test result:", res)
|
||||||
tested = true
|
tested = true
|
||||||
}).catch(err => expectedError = err.message).finally(() => loading = false)
|
}).catch(err => error = err.message).finally(() => loading = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
let messages: string[] = []
|
let messages: string[] = []
|
||||||
|
@ -33,9 +35,10 @@
|
||||||
|
|
||||||
export function pull(): Promise<string> {
|
export function pull(): Promise<string> {
|
||||||
return new Promise<string>((resolve, reject) => {
|
return new Promise<string>((resolve, reject) => {
|
||||||
if (loading || !tested) return reject("Please test connection first")
|
if (loading || !tested) return reject(t('trans.error.untested'))
|
||||||
if (exportedData) return resolve(exportedData)
|
if (exportedData) return resolve(exportedData)
|
||||||
console.log("Exporting data...")
|
console.log("Exporting data...")
|
||||||
|
error = ""
|
||||||
|
|
||||||
TRANSFER.pull({...src, ...gameInfo}, (msg: TrStreamMessage) => {
|
TRANSFER.pull({...src, ...gameInfo}, (msg: TrStreamMessage) => {
|
||||||
console.log("Export progress: ", JSON.stringify(msg))
|
console.log("Export progress: ", JSON.stringify(msg))
|
||||||
|
@ -43,7 +46,7 @@
|
||||||
if ('message' in msg) messages = [...messages, msg.message]
|
if ('message' in msg) messages = [...messages, msg.message]
|
||||||
|
|
||||||
if ('error' in msg) {
|
if ('error' in msg) {
|
||||||
expectedError = msg.error
|
error = msg.error
|
||||||
reject(msg.error)
|
reject(msg.error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +58,7 @@
|
||||||
exportedData = msg.data
|
exportedData = msg.data
|
||||||
resolve(msg.data)
|
resolve(msg.data)
|
||||||
}
|
}
|
||||||
}).catch(err => { expectedError = err; reject(err) })
|
}).catch(err => { error = err; reject(err) })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,40 +71,41 @@
|
||||||
if (loading || !tested) return
|
if (loading || !tested) return
|
||||||
console.log("Import data...")
|
console.log("Import data...")
|
||||||
loading = true
|
loading = true
|
||||||
|
error = ""
|
||||||
|
|
||||||
return TRANSFER.push({...src, ...gameInfo}, data).then(() => {
|
return TRANSFER.push({...src, ...gameInfo}, data).then(() => {
|
||||||
console.log("Data imported successfully")
|
console.log("Data imported successfully")
|
||||||
messages = ["Data imported successfully"]
|
messages = [t('trans.success.import')]
|
||||||
}).catch(err => expectedError = err.message).finally(() => loading = false)
|
}).catch(err => error = err.message).finally(() => loading = false)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<StatusOverlays {loading} {error} />
|
<StatusOverlays {loading} />
|
||||||
|
|
||||||
<div class="server source" class:src={isSrc} class:hasError={expectedError} class:tested={tested}>
|
<div class="server source" class:src={isSrc} class:hasError={error} class:tested={tested}>
|
||||||
<h3>{isSrc ? "Source" : "Target"} Server</h3>
|
<h3>{t(`trans.${isSrc ? "source" : "target"}.title`)}</h3>
|
||||||
|
|
||||||
{#if expectedError}
|
{#if error}
|
||||||
<blockquote class="error-msg">{expectedError}</blockquote>
|
<blockquote class="error-msg">{error}</blockquote>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<!-- First input line -->
|
<!-- First input line -->
|
||||||
<div class="inputs">
|
<div class="inputs">
|
||||||
<InputTextShort desc="Server Address" placeholder="e.g. http://aquadx.hydev.org"
|
<InputTextShort desc={t('trans.field.addr')} placeholder="e.g. http://aquadx.hydev.org"
|
||||||
bind:value={src.dns} on:change validate={v => /^https?:\/\/[a-z0-9.-]+(:\d+)?$/i.test(v)} disabled={tested} />
|
bind:value={src.dns} on:change validate={v => /^https?:\/\/[a-z0-9.-]+(:\d+)?$/i.test(v)} disabled={tested} />
|
||||||
<InputTextShort desc="Keychip ID" placeholder="e.g. A0299792458"
|
<InputTextShort desc={t('trans.field.keychip')} placeholder="e.g. A0299792458"
|
||||||
bind:value={src.keychip} on:change validate={v => /^([A-Z0-9]{11}|[A-Z0-9]{4}-[A-Z0-9]{11})$/.test(v)} disabled={tested} />
|
bind:value={src.keychip} on:change validate={v => /^([A-Z0-9]{11}|[A-Z0-9]{4}-[A-Z0-9]{11})$/.test(v)} disabled={tested} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Second input line -->
|
<!-- Second input line -->
|
||||||
<div class="inputs">
|
<div class="inputs">
|
||||||
<div class="game-version">
|
<div class="game-version">
|
||||||
<InputTextShort desc="Game" placeholder="e.g. SDHD"
|
<InputTextShort desc={t('trans.field.game')} placeholder="e.g. SDHD"
|
||||||
bind:value={gameInfo.game} on:change disabled={tested} />
|
bind:value={gameInfo.game} on:change disabled={tested} />
|
||||||
<InputTextShort desc="Version" placeholder="e.g. 2.30"
|
<InputTextShort desc={t('trans.field.version')} placeholder="e.g. 2.30"
|
||||||
bind:value={gameInfo.version} on:change disabled={tested} />
|
bind:value={gameInfo.version} on:change disabled={tested} />
|
||||||
</div>
|
</div>
|
||||||
<InputTextShort desc="Card Number" placeholder="e.g. 27182818284590452353"
|
<InputTextShort desc={t('trans.field.card')} placeholder="e.g. 27182818284590452353"
|
||||||
bind:value={src.card} on:change disabled={tested} />
|
bind:value={src.card} on:change disabled={tested} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -117,10 +121,10 @@
|
||||||
<!-- Buttons -->
|
<!-- Buttons -->
|
||||||
<div class="inputs buttons">
|
<div class="inputs buttons">
|
||||||
{#if !tested}
|
{#if !tested}
|
||||||
<button class="flex-1" on:click={testConnection} disabled={loading}>Test Connection</button>
|
<button class="flex-1" on:click={testConnection} disabled={loading}>{t('trans.btn.test')}</button>
|
||||||
{:else}
|
{:else}
|
||||||
<button class="flex-1" on:click={pull}>Export Data</button>
|
<button class="flex-1" on:click={pull}>{t('trans.btn.export')}</button>
|
||||||
<button class="flex-1" on:click={pushBtn}>Import Data</button>
|
<button class="flex-1" on:click={pushBtn}>{t('trans.btn.import')}</button>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Ongeki dev notes
|
||||||
|
|
||||||
|
## Item types
|
||||||
|
|
||||||
|
| ItemKind | Name |
|
||||||
|
|----------|----------------|
|
||||||
|
| 1 | Card |
|
||||||
|
| 2 | NamePlate |
|
||||||
|
| 3 | Trophy |
|
||||||
|
| 4 | LimitBreakItem |
|
||||||
|
| 5 | AlmightyJewel |
|
||||||
|
| 6 | Money |
|
||||||
|
| 7 | Music |
|
||||||
|
| 8 | ProfileVoice |
|
||||||
|
| 9 | Present |
|
||||||
|
| 10 | ChapterJewel |
|
||||||
|
| 11 | GachaTicket |
|
||||||
|
| 12 | KaikaItem |
|
||||||
|
| 13 | ExpUpItem |
|
||||||
|
| 14 | IntimateUpItem |
|
||||||
|
| 15 | BookItem |
|
||||||
|
| 16 | SystemVoice |
|
||||||
|
| 17 | Costume |
|
||||||
|
| 18 | Medal |
|
||||||
|
| 19 | Attachment |
|
||||||
|
| 20 | UnlockItem |
|
|
@ -20,3 +20,112 @@
|
||||||
| 14 | Intimate Item |
|
| 14 | Intimate Item |
|
||||||
| 15 | Kaleidx Scope Key |
|
| 15 | Kaleidx Scope Key |
|
||||||
|
|
||||||
|
## Multiplayer
|
||||||
|
|
||||||
|
### Party Host/Client/Member
|
||||||
|
|
||||||
|
Manager.Party.Party/**Host.cs** : Host :
|
||||||
|
* TCP **Listen** 50100 (Accept into Member)
|
||||||
|
* UDP Broadcast 50100
|
||||||
|
* Send: StartRecruit, FinishRecruit
|
||||||
|
|
||||||
|
PartyLink/**Party.cs** : Party.Host : Exact same as Host.cs
|
||||||
|
|
||||||
|
Manager.Party.Party/**Member.cs** : Member :
|
||||||
|
* TCP Connect 50100
|
||||||
|
* Send: JoinResult, Kick, StartPlay, StartClientState, PartyMember{Info/State}, PartyPlayInfo, RequestMeasure
|
||||||
|
* Recv: RequestJoin, ClientState, ClientPlayInfo, UpdateMechaInfo, ResponseMeasure, FinishNews
|
||||||
|
|
||||||
|
PartyLink/**Party.cs** : Party.Member : Exact same as Member.cs
|
||||||
|
|
||||||
|
Manager.Party.Party/**Client.cs** : Client :
|
||||||
|
* UDP **Listen** 50100
|
||||||
|
* Recv: StartRecruit, FinishRecruit
|
||||||
|
* TCP Connect 50100
|
||||||
|
* Recv: JoinResult, Kick, StartPlay, StartClientState,PartyMember{Info/State}, PartyPlayInfo, RequestMeasure
|
||||||
|
* Send: RequestJoin, ClientState, ClientPlayInfo, UpdateMechaInfo, ResponseMeasure, FinishNews
|
||||||
|
|
||||||
|
PartyLink/**Party.cs** : Party.Client : Exact same as Client.cs
|
||||||
|
|
||||||
|
**Enums**
|
||||||
|
* **ClientStateID**: {Setup, Wait, Connect, Request, Joined, FinishSetting, ToReady, BeginPlay, AllBeginPlay, Ready, Sync, Play, FinishPlay, News, NewsEnd, Result, Disconnected, Finish, Error}
|
||||||
|
* **JoinResult**: {Success, Full, NoRecruit, Disconnect, AlreadyJoined, DifferentGroup, DifferentMusic, DifferentEventMode}
|
||||||
|
|
||||||
|
**Models**
|
||||||
|
* **MechaInfo**: IsJoin (bool), IP Address, MusicID, Entries[2], UserIDs[2], Rating[2], ...
|
||||||
|
* **RecruitInfo**: MechaInfo, MusicID, GroupID, EventModeID, JoinNumber, PartyStance, Start time, Recv time
|
||||||
|
* **MemberPlayInfo**: IP Address, Rankings[2], Achieves[2], Combos[2], Miss[2], ...
|
||||||
|
* **ChainHistory**: PacketNo (int), Chain (int)
|
||||||
|
|
||||||
|
**Commands**
|
||||||
|
* **StartRecruit/FinishRecruit**: RecruitInfo
|
||||||
|
* **JoinResult**: JoinResult (enum)
|
||||||
|
* **RequestJoin**: MechaInfo, GroupID, EventModeID
|
||||||
|
* **UpdateMechaInfo**: MechaInfo
|
||||||
|
* **Kick**: RecruitInfo, KickBy {Cancel, Start, Disconnect}
|
||||||
|
* **RequestMeasure/ResponseMeasure**: {} - Sync delay
|
||||||
|
* **StartPlay**: MaxMeasure (long), MyMeasure (long) - Sync delay
|
||||||
|
* **StartClientState**: ClientStateID (enum)
|
||||||
|
* **ClientState**: ClientStateID (enum)
|
||||||
|
* **PartyMemberInfo**: MechaInfo[2]
|
||||||
|
* **PartyMemberState**: ClientStateID[2]
|
||||||
|
* **PartyPlayInfo**: MemberPlayInfo[2], ChainHistory[10], Chain (int), ChainMiss (int), MaxChain (int), IsFullChain (bool), CalcStatus (int)
|
||||||
|
* **ClientPlayInfo**: IP Address, Count, IsValids[2], Achieves[2], Combos[2], Miss[2], ...
|
||||||
|
* **FinishNews**: IP Address, IsValids[2], GaugeClears[2], GaugeStockNums[2]
|
||||||
|
|
||||||
|
### Setting Host/Client/Member
|
||||||
|
|
||||||
|
> This might be for synchronizing event settings across different cabs,
|
||||||
|
> I'm not sure if this is relevant for multiplayer.
|
||||||
|
|
||||||
|
PartyLink/**Setting.cs** : Setting.**Host** :
|
||||||
|
* TCP **Listen** 50101 (Accept into Setting.Member)
|
||||||
|
* UDP Broadcast 50101
|
||||||
|
* Send: SettingHostAddress
|
||||||
|
* UDP **Listen** 50101
|
||||||
|
* Recv: SettingHostAddress (Check duplicate host)
|
||||||
|
|
||||||
|
PartyLink/**Setting.cs** : Setting.**Client** :
|
||||||
|
* TCP Connect 50101
|
||||||
|
* Send: SettingRequest
|
||||||
|
* Recv: SettingResponse, HeartBeat{}
|
||||||
|
* UDP **Listen** 50101
|
||||||
|
* Recv: SettingHostAddress
|
||||||
|
|
||||||
|
PartyLink/**Setting.cs** : Setting.**Member** :
|
||||||
|
* TCP Connect 50101
|
||||||
|
* Recv: SettingRequest, HeartBeat{}
|
||||||
|
* Send: SettingResponse, HeartBeat{}
|
||||||
|
|
||||||
|
**Models**
|
||||||
|
* **SettingHostAddress**: IP Address (u32), Group (int)
|
||||||
|
* **SettingRequest**: Group (int)
|
||||||
|
* **SettingResponse**: Group (int), Data (isEventMode, eventModeMusicCount, memberNumber)
|
||||||
|
|
||||||
|
### Advertise
|
||||||
|
|
||||||
|
> For finding IP addresses of other cabs and checking their latency.
|
||||||
|
|
||||||
|
PartyLink/**Advertise.cs** : Advertise.Manager :
|
||||||
|
* UDP **Listen** 50102
|
||||||
|
* Recv: AdvertiseRequest, AdvertiseResponse, AdvertiseGo
|
||||||
|
* UDP Broadcast 50102
|
||||||
|
* Send: AdvertiseRequest, AdvertiseResponse, AdvertiseGo
|
||||||
|
|
||||||
|
**Models**
|
||||||
|
* **AdvertiseRequest**: IP Address (u32), Group (int), Kind (int)
|
||||||
|
* **AdvertiseResponse**: IP Address (u32), Group (int), Kind (int)
|
||||||
|
* **AdvertiseGo**: IP Address (u32), Group (int), Kind (int), MaxUsec (long), MyUsec (long)
|
||||||
|
|
||||||
|
!! sendTo is not necessarily broadcast !!
|
||||||
|
|
||||||
|
### DeliveryChecker
|
||||||
|
|
||||||
|
PartyLink/**DeliveryChecker** : DeliveryChecker.Manager :
|
||||||
|
* UDP **Listen** 50103
|
||||||
|
* Recv: AdvocateDelivery
|
||||||
|
* UDP Broadcast 50103
|
||||||
|
* Send: AdvocateDelivery
|
||||||
|
|
||||||
|
**Models**
|
||||||
|
* **AdvocateDelivery**: IP Address (u32)
|
||||||
|
|
|
@ -5,18 +5,19 @@ import java.net.URI
|
||||||
import java.net.http.HttpClient
|
import java.net.http.HttpClient
|
||||||
import java.net.http.HttpRequest
|
import java.net.http.HttpRequest
|
||||||
import java.net.http.HttpResponse
|
import java.net.http.HttpResponse
|
||||||
|
import java.time.Duration
|
||||||
|
|
||||||
val client = HttpClient.newBuilder().build()
|
val client = HttpClient.newBuilder().build()
|
||||||
|
|
||||||
fun HttpRequest.Builder.send() = client.send(this.build(), HttpResponse.BodyHandlers.ofByteArray())
|
fun HttpRequest.Builder.send() = client.send(this.build(), HttpResponse.BodyHandlers.ofByteArray())
|
||||||
fun HttpRequest.Builder.header(pair: Pair<Any, Any>) = this.header(pair.first.toString(), pair.second.toString())
|
fun HttpRequest.Builder.header(pair: Pair<Any, Any>) = this.header(pair.first.toString(), pair.second.toString())
|
||||||
fun String.request() = HttpRequest.newBuilder(URI.create(this))
|
fun String.request() = HttpRequest.newBuilder(URI.create(this)).timeout(Duration.ofSeconds(10))
|
||||||
|
|
||||||
fun HttpRequest.Builder.post(body: Any? = null) = this.POST(when (body) {
|
fun HttpRequest.Builder.post(body: Any? = null) = this.POST(when (body) {
|
||||||
is ByteArray -> HttpRequest.BodyPublishers.ofByteArray(body)
|
is ByteArray -> HttpRequest.BodyPublishers.ofByteArray(body)
|
||||||
is String -> HttpRequest.BodyPublishers.ofString(body)
|
is String -> HttpRequest.BodyPublishers.ofString(body)
|
||||||
is HttpRequest.BodyPublisher -> body
|
is HttpRequest.BodyPublisher -> body
|
||||||
else -> throw Exception("Unsupported body type")
|
else -> throw IllegalArgumentException("Unsupported body type")
|
||||||
}).send()
|
}).send()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package icu.samnyan.aqua.net.transfer
|
||||||
import ext.header
|
import ext.header
|
||||||
import ext.post
|
import ext.post
|
||||||
import ext.request
|
import ext.request
|
||||||
|
import java.net.URI
|
||||||
import icu.samnyan.aqua.sega.aimedb.AimeDbClient
|
import icu.samnyan.aqua.sega.aimedb.AimeDbClient
|
||||||
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder
|
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder
|
||||||
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNetResp
|
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNetResp
|
||||||
|
@ -23,7 +24,7 @@ class AllNetClient(val dns: String, val keychip: String, val game: String, val v
|
||||||
if (keychip.length == 11) keychip
|
if (keychip.length == 11) keychip
|
||||||
else keychip.substring(0, 4) + keychip.substring(5, 12)
|
else keychip.substring(0, 4) + keychip.substring(5, 12)
|
||||||
}
|
}
|
||||||
val aime by lazy { AimeDbClient(game, keychipShort, dns.substringAfter("://").substringBefore(":").substringBefore("/")) }
|
val aime by lazy { AimeDbClient(game, keychipShort, URI(dns).host) }
|
||||||
|
|
||||||
// Send AllNet PowerOn request to obtain game URL
|
// Send AllNet PowerOn request to obtain game URL
|
||||||
val gameUrl by lazy {
|
val gameUrl by lazy {
|
||||||
|
@ -38,9 +39,6 @@ class AllNetClient(val dns: String, val keychip: String, val game: String, val v
|
||||||
"ip" to "127.0.0.1", "firm_ver" to "60001", "boot_ver" to "0000",
|
"ip" to "127.0.0.1", "firm_ver" to "60001", "boot_ver" to "0000",
|
||||||
"encode" to "UTF-8", "format_ver" to "3", "hops" to "1", "token" to "2864179931"
|
"encode" to "UTF-8", "format_ver" to "3", "hops" to "1", "token" to "2864179931"
|
||||||
)))
|
)))
|
||||||
?.also {
|
|
||||||
println(it)
|
|
||||||
}
|
|
||||||
?.decodeAllNetResp()?.get("uri")
|
?.decodeAllNetResp()?.get("uri")
|
||||||
?: throw Exception("PowerOn Failed: No game URL returned")
|
?: throw Exception("PowerOn Failed: No game URL returned")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +1,49 @@
|
||||||
CREATE TABLE aqua_net_user
|
CREATE TABLE aqua_net_user
|
||||||
(
|
(
|
||||||
au_id BIGINT AUTO_INCREMENT NOT NULL,
|
au_id BIGINT AUTO_INCREMENT NOT NULL,
|
||||||
username VARCHAR(32) NOT NULL,
|
username VARCHAR(32) NOT NULL,
|
||||||
email VARCHAR(255) NOT NULL,
|
email VARCHAR(255) NOT NULL,
|
||||||
email_confirmed BOOLEAN NOT NULL,
|
email_confirmed BOOLEAN NOT NULL,
|
||||||
pw_hash VARCHAR(255) NOT NULL,
|
pw_hash VARCHAR(255) NOT NULL,
|
||||||
display_name VARCHAR(32) NULL,
|
display_name VARCHAR(32) NULL,
|
||||||
country VARCHAR(3) NULL,
|
country VARCHAR(3) NULL,
|
||||||
last_login BIGINT NOT NULL,
|
last_login BIGINT NOT NULL,
|
||||||
reg_time BIGINT NOT NULL,
|
reg_time BIGINT NOT NULL,
|
||||||
profile_location VARCHAR(255) NULL,
|
profile_location VARCHAR(255) NULL,
|
||||||
profile_bio VARCHAR(255) NULL,
|
profile_bio VARCHAR(255) NULL,
|
||||||
ghost_card BIGINT NOT NULL,
|
ghost_card BIGINT NOT NULL,
|
||||||
CONSTRAINT pk_aqua_net_user PRIMARY KEY (au_id)
|
CONSTRAINT pk_aqua_net_user PRIMARY KEY (au_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
ALTER TABLE sega_card
|
ALTER TABLE sega_card
|
||||||
ADD net_user_id BIGINT NULL;
|
ADD net_user_id BIGINT NULL;
|
||||||
|
|
||||||
ALTER TABLE sega_card
|
ALTER TABLE sega_card
|
||||||
ADD is_ghost BOOLEAN NOT NULL DEFAULT FALSE;
|
ADD is_ghost BOOLEAN NOT NULL DEFAULT FALSE;
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT uc_aqua_net_user_email UNIQUE (email);
|
ADD CONSTRAINT uc_aqua_net_user_email UNIQUE (email);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT uc_aqua_net_user_username UNIQUE (username);
|
ADD CONSTRAINT uc_aqua_net_user_username UNIQUE (username);
|
||||||
|
|
||||||
ALTER TABLE sega_card
|
ALTER TABLE sega_card
|
||||||
ADD CONSTRAINT FK_SEGA_CARD_ON_NET_USER FOREIGN KEY (net_user_id) REFERENCES aqua_net_user (au_id);
|
ADD CONSTRAINT FK_SEGA_CARD_ON_NET_USER FOREIGN KEY (net_user_id) REFERENCES aqua_net_user (au_id);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT uc_aqua_net_user_canonical_card UNIQUE (ghost_card);
|
ADD CONSTRAINT uc_aqua_net_user_canonical_card UNIQUE (ghost_card);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT FK_AQUA_NET_USER_ON_CANONICAL_CARD FOREIGN KEY (ghost_card) REFERENCES sega_card (id);
|
ADD CONSTRAINT FK_AQUA_NET_USER_ON_CANONICAL_CARD FOREIGN KEY (ghost_card) REFERENCES sega_card (id);
|
||||||
|
|
||||||
CREATE TABLE aqua_net_email_confirmation
|
CREATE TABLE aqua_net_email_confirmation
|
||||||
(
|
(
|
||||||
id BIGINT AUTO_INCREMENT NOT NULL,
|
id BIGINT AUTO_INCREMENT NOT NULL,
|
||||||
token VARCHAR(255) NOT NULL,
|
token VARCHAR(255) NOT NULL,
|
||||||
created_at datetime NOT NULL,
|
created_at datetime NOT NULL,
|
||||||
au_id BIGINT NULL,
|
au_id BIGINT NULL,
|
||||||
CONSTRAINT pk_email_confirmation PRIMARY KEY (id)
|
CONSTRAINT pk_email_confirmation PRIMARY KEY (id)
|
||||||
);
|
);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_email_confirmation
|
ALTER TABLE aqua_net_email_confirmation
|
||||||
ADD CONSTRAINT FK_EMAIL_CONFIRMATION_ON_AQUA_USER FOREIGN KEY (au_id) REFERENCES aqua_net_user (au_id);
|
ADD CONSTRAINT FK_EMAIL_CONFIRMATION_ON_AQUA_USER FOREIGN KEY (au_id) REFERENCES aqua_net_user (au_id);
|
|
@ -1,2 +1,2 @@
|
||||||
ALTER TABLE allnet_keychip_sessions
|
ALTER TABLE allnet_keychip_sessions
|
||||||
ADD game_id VARCHAR(4) NULL;
|
ADD game_id VARCHAR(4) NULL;
|
|
@ -1,19 +1,19 @@
|
||||||
CREATE TABLE allnet_keychip_sessions
|
CREATE TABLE allnet_keychip_sessions
|
||||||
(
|
(
|
||||||
token VARCHAR(32) NOT NULL,
|
token VARCHAR(32) NOT NULL,
|
||||||
au_id BIGINT NULL,
|
au_id BIGINT NULL,
|
||||||
last_use BIGINT NOT NULL,
|
last_use BIGINT NOT NULL,
|
||||||
CONSTRAINT pk_allnet_keychip_sessions PRIMARY KEY (token)
|
CONSTRAINT pk_allnet_keychip_sessions PRIMARY KEY (token)
|
||||||
);
|
);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD keychip VARCHAR(32) NULL;
|
ADD keychip VARCHAR(32) NULL;
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT uc_aqua_net_user_keychip UNIQUE (keychip);
|
ADD CONSTRAINT uc_aqua_net_user_keychip UNIQUE (keychip);
|
||||||
|
|
||||||
# Optimization on session cleanup
|
# Optimization on session cleanup
|
||||||
CREATE INDEX idx_last_use ON allnet_keychip_sessions (last_use);
|
CREATE INDEX idx_last_use ON allnet_keychip_sessions (last_use);
|
||||||
|
|
||||||
ALTER TABLE allnet_keychip_sessions
|
ALTER TABLE allnet_keychip_sessions
|
||||||
ADD CONSTRAINT FK_ALLNET_KEYCHIP_SESSIONS_ON_AU FOREIGN KEY (au_id) REFERENCES aqua_net_user (au_id);
|
ADD CONSTRAINT FK_ALLNET_KEYCHIP_SESSIONS_ON_AU FOREIGN KEY (au_id) REFERENCES aqua_net_user (au_id);
|
|
@ -1,15 +1,15 @@
|
||||||
ALTER TABLE maimai2_user_detail
|
ALTER TABLE maimai2_user_detail
|
||||||
ADD COLUMN point INT DEFAULT 0,
|
ADD COLUMN point INT DEFAULT 0,
|
||||||
ADD COLUMN total_point INT DEFAULT 0;
|
ADD COLUMN total_point INT DEFAULT 0;
|
||||||
|
|
||||||
CREATE TABLE maimai2_user_intimate
|
CREATE TABLE maimai2_user_intimate
|
||||||
(
|
(
|
||||||
id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||||||
user_id BIGINT NULL,
|
user_id BIGINT NULL,
|
||||||
partner_id INT NOT NULL,
|
partner_id INT NOT NULL,
|
||||||
intimate_level INT NOT NULL,
|
intimate_level INT NOT NULL,
|
||||||
intimate_count_rewarded INT NOT NULL,
|
intimate_count_rewarded INT NOT NULL,
|
||||||
CONSTRAINT fku_maimai2_user_intimate FOREIGN KEY (user_id) REFERENCES maimai2_user_detail (id) ON DELETE CASCADE ON UPDATE CASCADE,
|
CONSTRAINT fku_maimai2_user_intimate FOREIGN KEY (user_id) REFERENCES maimai2_user_detail (id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
CONSTRAINT unique_maimai2_user_intimate UNIQUE (user_id, partner_id)
|
CONSTRAINT unique_maimai2_user_intimate UNIQUE (user_id, partner_id)
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
ALTER TABLE chusan_user_data ADD COLUMN trophy_id_sub1 INT NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE chusan_user_data ADD COLUMN trophy_id_sub2 INT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
CREATE TABLE chusan_user_challenge
|
||||||
|
(
|
||||||
|
id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||||||
|
user_id BIGINT NOT NULL,
|
||||||
|
unlock_challenge_id INT NOT NULL,
|
||||||
|
status INT NOT NULL,
|
||||||
|
clear_course_id INT NOT NULL,
|
||||||
|
condition_type INT NOT NULL,
|
||||||
|
score INT NOT NULL,
|
||||||
|
life INT NOT NULL,
|
||||||
|
clear_date VARCHAR(20) NULL,
|
||||||
|
CONSTRAINT fku_chusan_user_challenge FOREIGN KEY (user_id) REFERENCES chusan_user_data (id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
CONSTRAINT unique_user_challenge UNIQUE (user_id, unlock_challenge_id)
|
||||||
|
);
|
|
@ -1,18 +1,18 @@
|
||||||
CREATE TABLE aqua_game_options
|
CREATE TABLE aqua_game_options
|
||||||
(
|
(
|
||||||
id BIGINT AUTO_INCREMENT NOT NULL,
|
id BIGINT AUTO_INCREMENT NOT NULL,
|
||||||
unlock_music BIT(1) NOT NULL,
|
unlock_music BIT(1) NOT NULL,
|
||||||
unlock_chara BIT(1) NOT NULL,
|
unlock_chara BIT(1) NOT NULL,
|
||||||
unlock_collectables BIT(1) NOT NULL,
|
unlock_collectables BIT(1) NOT NULL,
|
||||||
unlock_tickets BIT(1) NOT NULL,
|
unlock_tickets BIT(1) NOT NULL,
|
||||||
CONSTRAINT pk_aquagameoptions PRIMARY KEY (id)
|
CONSTRAINT pk_aquagameoptions PRIMARY KEY (id)
|
||||||
);
|
);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD game_options BIGINT NULL;
|
ADD game_options BIGINT NULL;
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT uc_aquanetuser_gameoptions UNIQUE (game_options);
|
ADD CONSTRAINT uc_aquanetuser_gameoptions UNIQUE (game_options);
|
||||||
|
|
||||||
ALTER TABLE aqua_net_user
|
ALTER TABLE aqua_net_user
|
||||||
ADD CONSTRAINT FK_AQUANETUSER_ON_GAMEOPTIONS FOREIGN KEY (game_options) REFERENCES aqua_game_options (id);
|
ADD CONSTRAINT FK_AQUANETUSER_ON_GAMEOPTIONS FOREIGN KEY (game_options) REFERENCES aqua_game_options (id);
|
|
@ -1,11 +1,11 @@
|
||||||
ALTER TABLE bak_maimai2_user_rate
|
ALTER TABLE bak_maimai2_user_rate
|
||||||
DROP FOREIGN KEY FKfaewgvanchzwo8um;
|
DROP FOREIGN KEY FKfaewgvanchzwo8um;
|
||||||
|
|
||||||
DROP TABLE bak_diva_pv_entry;
|
DROP TABLE bak_diva_pv_entry;
|
||||||
|
|
||||||
DROP TABLE bak_maimai2_user_rate;
|
DROP TABLE bak_maimai2_user_rate;
|
||||||
|
|
||||||
DROP TABLE hibernate_sequence;
|
DROP TABLE hibernate_sequence;
|
||||||
|
|
||||||
ALTER TABLE chusan_user_data
|
ALTER TABLE chusan_user_data
|
||||||
DROP COLUMN rank_up_challenge_results;
|
DROP COLUMN rank_up_challenge_results;
|
|
@ -0,0 +1,157 @@
|
||||||
|
INSERT INTO chusan_game_event (id, type, end_date, start_date, enable)
|
||||||
|
VALUES
|
||||||
|
(51,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(52,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(53,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(1021,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3027,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3217,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3309,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3412,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3514,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3623,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3726,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3808,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(3912,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4010,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4111,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4210,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4323,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4513,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4614,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4710,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4808,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4909,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(4911,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5026,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5112,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5216,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5311,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5360,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5410,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5513,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5630,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5708,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5819,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(5920,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(6020,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(6130,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(6221,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(6319,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(6409,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(6511,9,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(11159,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12580,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12582,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12584,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12586,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12587,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12602,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12611,12,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(12613,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13060,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13451,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13453,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13504,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13506,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13507,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13513,12,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13552,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13553,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13616,7,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13617,7,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(13651,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15150,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15151,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15152,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15156,14,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15157,7,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15158,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15200,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15201,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15202,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15203,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15204,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15205,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15206,11,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15207,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15208,14,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15209,12,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15210,10,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15211,4,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15212,5,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15213,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15250,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15251,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15252,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15253,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15254,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15255,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15256,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15480,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15481,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15482,7,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15483,7,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(15560,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16100,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16101,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16102,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16103,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16104,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16105,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16106,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16107,16,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16108,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16109,4,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16110,5,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16111,11,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16150,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16151,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16152,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16153,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16154,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16155,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16156,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16157,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16158,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16159,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16160,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16161,14,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16162,10,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16163,11,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16164,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16165,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16200,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16201,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16202,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16203,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16204,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16205,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16206,14,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16207,5,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16208,4,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16209,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16250,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16251,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16252,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16253,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16254,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16255,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16256,12,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16257,11,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16258,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16300,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16301,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16302,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16303,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16304,2,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16305,8,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16306,1,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16307,16,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16308,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16309,10,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16310,5,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16311,4,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(16312,11,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(99000,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true),
|
||||||
|
(99001,3,'2029-01-01 00:00:00.000000','2019-01-01 00:00:00.000000',true);
|
Loading…
Reference in New Issue