diff --git a/backend/db/migrations/0012_shiny_customer_inventory.sql b/backend/db/migrations/0012_shiny_customer_inventory.sql new file mode 100644 index 0000000..fb77d89 --- /dev/null +++ b/backend/db/migrations/0012_shiny_customer_inventory.sql @@ -0,0 +1,73 @@ +CREATE TABLE "customerspaces" ( + "id" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "customerspaces_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1), + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "name" text NOT NULL, + "type" text NOT NULL, + "tenant" bigint NOT NULL, + "customer" bigint NOT NULL, + "spaceNumber" text NOT NULL, + "parentSpace" bigint, + "infoData" jsonb DEFAULT '{"zip":"","city":"","streetNumber":""}'::jsonb NOT NULL, + "description" text, + "archived" boolean DEFAULT false NOT NULL, + "updated_at" timestamp with time zone, + "updated_by" uuid +); +--> statement-breakpoint +CREATE TABLE "customerinventoryitems" ( + "id" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "customerinventoryitems_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1), + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "name" text NOT NULL, + "description" text, + "tenant" bigint NOT NULL, + "customer" bigint NOT NULL, + "customerspace" bigint, + "customerInventoryId" text NOT NULL, + "serialNumber" text, + "quantity" bigint DEFAULT 0 NOT NULL, + "manufacturer" text, + "manufacturerNumber" text, + "purchaseDate" date, + "purchasePrice" double precision DEFAULT 0, + "currentValue" double precision, + "product" bigint, + "archived" boolean DEFAULT false NOT NULL, + "updated_at" timestamp with time zone, + "updated_by" uuid +); +--> statement-breakpoint +ALTER TABLE "customerspaces" ADD CONSTRAINT "customerspaces_tenant_tenants_id_fk" FOREIGN KEY ("tenant") REFERENCES "public"."tenants"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerspaces" ADD CONSTRAINT "customerspaces_customer_customers_id_fk" FOREIGN KEY ("customer") REFERENCES "public"."customers"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerspaces" ADD CONSTRAINT "customerspaces_parentSpace_customerspaces_id_fk" FOREIGN KEY ("parentSpace") REFERENCES "public"."customerspaces"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerspaces" ADD CONSTRAINT "customerspaces_updated_by_auth_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."auth_users"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerinventoryitems" ADD CONSTRAINT "customerinventoryitems_tenant_tenants_id_fk" FOREIGN KEY ("tenant") REFERENCES "public"."tenants"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerinventoryitems" ADD CONSTRAINT "customerinventoryitems_customer_customers_id_fk" FOREIGN KEY ("customer") REFERENCES "public"."customers"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerinventoryitems" ADD CONSTRAINT "customerinventoryitems_customerspace_customerspaces_id_fk" FOREIGN KEY ("customerspace") REFERENCES "public"."customerspaces"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerinventoryitems" ADD CONSTRAINT "customerinventoryitems_product_products_id_fk" FOREIGN KEY ("product") REFERENCES "public"."products"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customerinventoryitems" ADD CONSTRAINT "customerinventoryitems_updated_by_auth_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."auth_users"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +CREATE UNIQUE INDEX "customerinventoryitems_tenant_customerInventoryId_idx" ON "customerinventoryitems" USING btree ("tenant","customerInventoryId"); +--> statement-breakpoint +ALTER TABLE "historyitems" ADD COLUMN "customerspace" bigint; +--> statement-breakpoint +ALTER TABLE "historyitems" ADD COLUMN "customerinventoryitem" bigint; +--> statement-breakpoint +ALTER TABLE "historyitems" ADD CONSTRAINT "historyitems_customerspace_customerspaces_id_fk" FOREIGN KEY ("customerspace") REFERENCES "public"."customerspaces"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "historyitems" ADD CONSTRAINT "historyitems_customerinventoryitem_customerinventoryitems_id_fk" FOREIGN KEY ("customerinventoryitem") REFERENCES "public"."customerinventoryitems"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "tenants" ALTER COLUMN "numberRanges" SET DEFAULT '{"vendors":{"prefix":"","suffix":"","nextNumber":10000},"customers":{"prefix":"","suffix":"","nextNumber":10000},"products":{"prefix":"AT-","suffix":"","nextNumber":1000},"quotes":{"prefix":"AN-","suffix":"","nextNumber":1000},"confirmationOrders":{"prefix":"AB-","suffix":"","nextNumber":1000},"invoices":{"prefix":"RE-","suffix":"","nextNumber":1000},"spaces":{"prefix":"LP-","suffix":"","nextNumber":1000},"customerspaces":{"prefix":"KLP-","suffix":"","nextNumber":1000},"inventoryitems":{"prefix":"IA-","suffix":"","nextNumber":1000},"customerinventoryitems":{"prefix":"KIA-","suffix":"","nextNumber":1000},"projects":{"prefix":"PRJ-","suffix":"","nextNumber":1000},"costcentres":{"prefix":"KST-","suffix":"","nextNumber":1000}}'::jsonb; +--> statement-breakpoint +UPDATE "tenants" +SET "numberRanges" = COALESCE("numberRanges", '{}'::jsonb) || jsonb_build_object( + 'customerspaces', COALESCE("numberRanges"->'customerspaces', '{"prefix":"KLP-","suffix":"","nextNumber":1000}'::jsonb), + 'customerinventoryitems', COALESCE("numberRanges"->'customerinventoryitems', '{"prefix":"KIA-","suffix":"","nextNumber":1000}'::jsonb) +); diff --git a/backend/db/migrations/0013_brisk_customer_inventory_vendor.sql b/backend/db/migrations/0013_brisk_customer_inventory_vendor.sql new file mode 100644 index 0000000..ec3b658 --- /dev/null +++ b/backend/db/migrations/0013_brisk_customer_inventory_vendor.sql @@ -0,0 +1,3 @@ +ALTER TABLE "customerinventoryitems" ADD COLUMN "vendor" bigint; +--> statement-breakpoint +ALTER TABLE "customerinventoryitems" ADD CONSTRAINT "customerinventoryitems_vendor_vendors_id_fk" FOREIGN KEY ("vendor") REFERENCES "public"."vendors"("id") ON DELETE no action ON UPDATE no action; diff --git a/backend/db/migrations/0014_smart_memberrelations.sql b/backend/db/migrations/0014_smart_memberrelations.sql new file mode 100644 index 0000000..dbbbebe --- /dev/null +++ b/backend/db/migrations/0014_smart_memberrelations.sql @@ -0,0 +1,20 @@ +CREATE TABLE "memberrelations" ( + "id" bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "memberrelations_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1), + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "tenant" bigint NOT NULL, + "type" text NOT NULL, + "billingInterval" text NOT NULL, + "billingAmount" double precision DEFAULT 0 NOT NULL, + "archived" boolean DEFAULT false NOT NULL, + "updated_at" timestamp with time zone, + "updated_by" uuid +); +--> statement-breakpoint +ALTER TABLE "customers" ADD COLUMN "memberrelation" bigint; +--> statement-breakpoint +ALTER TABLE "memberrelations" ADD CONSTRAINT "memberrelations_tenant_tenants_id_fk" FOREIGN KEY ("tenant") REFERENCES "public"."tenants"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "memberrelations" ADD CONSTRAINT "memberrelations_updated_by_auth_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "public"."auth_users"("id") ON DELETE no action ON UPDATE no action; +--> statement-breakpoint +ALTER TABLE "customers" ADD CONSTRAINT "customers_memberrelation_memberrelations_id_fk" FOREIGN KEY ("memberrelation") REFERENCES "public"."memberrelations"("id") ON DELETE no action ON UPDATE no action; + diff --git a/backend/db/migrations/0015_wise_memberrelation_history.sql b/backend/db/migrations/0015_wise_memberrelation_history.sql new file mode 100644 index 0000000..8aa4254 --- /dev/null +++ b/backend/db/migrations/0015_wise_memberrelation_history.sql @@ -0,0 +1,4 @@ +ALTER TABLE "historyitems" ADD COLUMN "memberrelation" bigint; +--> statement-breakpoint +ALTER TABLE "historyitems" ADD CONSTRAINT "historyitems_memberrelation_memberrelations_id_fk" FOREIGN KEY ("memberrelation") REFERENCES "public"."memberrelations"("id") ON DELETE no action ON UPDATE no action; + diff --git a/backend/db/migrations/meta/_journal.json b/backend/db/migrations/meta/_journal.json index 3c99336..643601e 100644 --- a/backend/db/migrations/meta/_journal.json +++ b/backend/db/migrations/meta/_journal.json @@ -85,6 +85,34 @@ "when": 1773000300000, "tag": "0011_mighty_member_bankaccounts", "breakpoints": true + }, + { + "idx": 12, + "version": "7", + "when": 1773000400000, + "tag": "0012_shiny_customer_inventory", + "breakpoints": true + }, + { + "idx": 13, + "version": "7", + "when": 1773000500000, + "tag": "0013_brisk_customer_inventory_vendor", + "breakpoints": true + }, + { + "idx": 14, + "version": "7", + "when": 1773000600000, + "tag": "0014_smart_memberrelations", + "breakpoints": true + }, + { + "idx": 15, + "version": "7", + "when": 1773000700000, + "tag": "0015_wise_memberrelation_history", + "breakpoints": true } ] } diff --git a/backend/db/schema/customerinventoryitems.ts b/backend/db/schema/customerinventoryitems.ts new file mode 100644 index 0000000..b84c02c --- /dev/null +++ b/backend/db/schema/customerinventoryitems.ts @@ -0,0 +1,66 @@ +import { + pgTable, + bigint, + timestamp, + text, + boolean, + doublePrecision, + uuid, + date, +} from "drizzle-orm/pg-core" + +import { tenants } from "./tenants" +import { customers } from "./customers" +import { customerspaces } from "./customerspaces" +import { products } from "./products" +import { vendors } from "./vendors" +import { authUsers } from "./auth_users" + +export const customerinventoryitems = pgTable("customerinventoryitems", { + id: bigint("id", { mode: "number" }) + .primaryKey() + .generatedByDefaultAsIdentity(), + + createdAt: timestamp("created_at", { withTimezone: true }) + .notNull() + .defaultNow(), + + name: text("name").notNull(), + + description: text("description"), + + tenant: bigint("tenant", { mode: "number" }) + .notNull() + .references(() => tenants.id), + + customer: bigint("customer", { mode: "number" }) + .notNull() + .references(() => customers.id), + + customerspace: bigint("customerspace", { mode: "number" }).references( + () => customerspaces.id + ), + + customerInventoryId: text("customerInventoryId").notNull(), + serialNumber: text("serialNumber"), + + quantity: bigint("quantity", { mode: "number" }).notNull().default(0), + + manufacturer: text("manufacturer"), + manufacturerNumber: text("manufacturerNumber"), + + purchaseDate: date("purchaseDate"), + purchasePrice: doublePrecision("purchasePrice").default(0), + currentValue: doublePrecision("currentValue"), + + product: bigint("product", { mode: "number" }).references(() => products.id), + vendor: bigint("vendor", { mode: "number" }).references(() => vendors.id), + + archived: boolean("archived").notNull().default(false), + + updatedAt: timestamp("updated_at", { withTimezone: true }), + updatedBy: uuid("updated_by").references(() => authUsers.id), +}) + +export type CustomerInventoryItem = typeof customerinventoryitems.$inferSelect +export type NewCustomerInventoryItem = typeof customerinventoryitems.$inferInsert diff --git a/backend/db/schema/customerspaces.ts b/backend/db/schema/customerspaces.ts new file mode 100644 index 0000000..2f6192b --- /dev/null +++ b/backend/db/schema/customerspaces.ts @@ -0,0 +1,54 @@ +import { + pgTable, + bigint, + timestamp, + text, + boolean, + jsonb, + uuid, +} from "drizzle-orm/pg-core" + +import { tenants } from "./tenants" +import { customers } from "./customers" +import { authUsers } from "./auth_users" + +export const customerspaces = pgTable("customerspaces", { + id: bigint("id", { mode: "number" }) + .primaryKey() + .generatedByDefaultAsIdentity(), + + createdAt: timestamp("created_at", { withTimezone: true }) + .notNull() + .defaultNow(), + + name: text("name").notNull(), + type: text("type").notNull(), + + tenant: bigint("tenant", { mode: "number" }) + .notNull() + .references(() => tenants.id), + + customer: bigint("customer", { mode: "number" }) + .notNull() + .references(() => customers.id), + + space_number: text("spaceNumber").notNull(), + + parentSpace: bigint("parentSpace", { mode: "number" }).references( + () => customerspaces.id + ), + + info_data: jsonb("infoData") + .notNull() + .default({ zip: "", city: "", streetNumber: "" }), + + description: text("description"), + + archived: boolean("archived").notNull().default(false), + + updatedAt: timestamp("updated_at", { withTimezone: true }), + updatedBy: uuid("updated_by").references(() => authUsers.id), +}) + +export type CustomerSpace = typeof customerspaces.$inferSelect +export type NewCustomerSpace = typeof customerspaces.$inferInsert diff --git a/backend/db/schema/historyitems.ts b/backend/db/schema/historyitems.ts index 4f82235..dd9f9a9 100644 --- a/backend/db/schema/historyitems.ts +++ b/backend/db/schema/historyitems.ts @@ -20,6 +20,8 @@ import { tasks } from "./tasks" import { vehicles } from "./vehicles" import { bankstatements } from "./bankstatements" import { spaces } from "./spaces" +import { customerspaces } from "./customerspaces" +import { customerinventoryitems } from "./customerinventoryitems" import { costcentres } from "./costcentres" import { ownaccounts } from "./ownaccounts" import { createddocuments } from "./createddocuments" @@ -32,6 +34,7 @@ import { events } from "./events" import { inventoryitemgroups } from "./inventoryitemgroups" import { authUsers } from "./auth_users" import {files} from "./files"; +import { memberrelations } from "./memberrelations"; export const historyitems = pgTable("historyitems", { id: bigint("id", { mode: "number" }) @@ -99,6 +102,12 @@ export const historyitems = pgTable("historyitems", { space: bigint("space", { mode: "number" }).references(() => spaces.id), + customerspace: bigint("customerspace", { mode: "number" }).references(() => customerspaces.id), + + customerinventoryitem: bigint("customerinventoryitem", { mode: "number" }).references(() => customerinventoryitems.id), + + memberrelation: bigint("memberrelation", { mode: "number" }).references(() => memberrelations.id), + config: jsonb("config"), projecttype: bigint("projecttype", { mode: "number" }).references( diff --git a/backend/db/schema/index.ts b/backend/db/schema/index.ts index a3f5416..e0711ba 100644 --- a/backend/db/schema/index.ts +++ b/backend/db/schema/index.ts @@ -19,6 +19,8 @@ export * from "./countrys" export * from "./createddocuments" export * from "./createdletters" export * from "./customers" +export * from "./customerspaces" +export * from "./customerinventoryitems" export * from "./devices" export * from "./documentboxes" export * from "./enums" @@ -44,6 +46,7 @@ export * from "./incominginvoices" export * from "./inventoryitemgroups" export * from "./inventoryitems" export * from "./letterheads" +export * from "./memberrelations" export * from "./movements" export * from "./m2m_api_keys" export * from "./notifications_event_types" diff --git a/backend/db/schema/memberrelations.ts b/backend/db/schema/memberrelations.ts new file mode 100644 index 0000000..1295352 --- /dev/null +++ b/backend/db/schema/memberrelations.ts @@ -0,0 +1,39 @@ +import { + pgTable, + bigint, + timestamp, + text, + boolean, + uuid, + doublePrecision, +} from "drizzle-orm/pg-core" + +import { tenants } from "./tenants" +import { authUsers } from "./auth_users" + +export const memberrelations = pgTable("memberrelations", { + id: bigint("id", { mode: "number" }) + .primaryKey() + .generatedByDefaultAsIdentity(), + + createdAt: timestamp("created_at", { withTimezone: true }) + .notNull() + .defaultNow(), + + tenant: bigint("tenant", { mode: "number" }) + .notNull() + .references(() => tenants.id), + + type: text("type").notNull(), + billingInterval: text("billingInterval").notNull(), + billingAmount: doublePrecision("billingAmount").notNull().default(0), + + archived: boolean("archived").notNull().default(false), + + updatedAt: timestamp("updated_at", { withTimezone: true }), + updatedBy: uuid("updated_by").references(() => authUsers.id), +}) + +export type MemberRelation = typeof memberrelations.$inferSelect +export type NewMemberRelation = typeof memberrelations.$inferInsert + diff --git a/backend/db/schema/tenants.ts b/backend/db/schema/tenants.ts index b798aab..c73cfbf 100644 --- a/backend/db/schema/tenants.ts +++ b/backend/db/schema/tenants.ts @@ -88,7 +88,9 @@ export const tenants = pgTable( confirmationOrders: { prefix: "AB-", suffix: "", nextNumber: 1000 }, invoices: { prefix: "RE-", suffix: "", nextNumber: 1000 }, spaces: { prefix: "LP-", suffix: "", nextNumber: 1000 }, + customerspaces: { prefix: "KLP-", suffix: "", nextNumber: 1000 }, inventoryitems: { prefix: "IA-", suffix: "", nextNumber: 1000 }, + customerinventoryitems: { prefix: "KIA-", suffix: "", nextNumber: 1000 }, projects: { prefix: "PRJ-", suffix: "", nextNumber: 1000 }, costcentres: { prefix: "KST-", suffix: "", nextNumber: 1000 }, }), diff --git a/backend/scripts/generate-de-bank-codes.ts b/backend/scripts/generate-de-bank-codes.ts new file mode 100644 index 0000000..ac835d9 --- /dev/null +++ b/backend/scripts/generate-de-bank-codes.ts @@ -0,0 +1,95 @@ +import fs from "node:fs/promises" +import path from "node:path" +import https from "node:https" + +const DEFAULT_SOURCE_URL = + "https://www.bundesbank.de/resource/blob/602632/bec25ca5df1eb62fefadd8325dafe67c/472B63F073F071307366337C94F8C870/blz-aktuell-txt-data.txt" + +const OUTPUT_NAME_FILE = path.resolve("src/utils/deBankCodes.ts") +const OUTPUT_BIC_FILE = path.resolve("src/utils/deBankBics.ts") + +function fetchBuffer(url: string): Promise { + return new Promise((resolve, reject) => { + https + .get(url, (res) => { + if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + return resolve(fetchBuffer(res.headers.location)) + } + + if (res.statusCode !== 200) { + return reject(new Error(`Download failed with status ${res.statusCode}`)) + } + + const chunks: Buffer[] = [] + res.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))) + res.on("end", () => resolve(Buffer.concat(chunks))) + res.on("error", reject) + }) + .on("error", reject) + }) +} + +function escapeTsString(value: string) { + return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"') +} + +async function main() { + const source = process.env.BLZ_SOURCE_URL || DEFAULT_SOURCE_URL + const sourceFile = process.env.BLZ_SOURCE_FILE + let raw: Buffer + + if (sourceFile) { + console.log(`Reading BLZ source file: ${sourceFile}`) + raw = await fs.readFile(sourceFile) + } else { + console.log(`Downloading BLZ source: ${source}`) + raw = await fetchBuffer(source) + } + const content = raw.toString("latin1") + + const lines = content.split(/\r?\n/) + const nameMap = new Map() + const bicMap = new Map() + + for (const line of lines) { + if (!line || line.length < 150) continue + const blz = line.slice(0, 8).trim() + const name = line.slice(9, 67).trim() + const bic = line.slice(139, 150).trim() + + if (!/^\d{8}$/.test(blz) || !name) continue + if (!nameMap.has(blz)) nameMap.set(blz, name) + if (bic && !bicMap.has(blz)) bicMap.set(blz, bic) + } + + const sortedNames = [...nameMap.entries()].sort(([a], [b]) => a.localeCompare(b)) + const sortedBics = [...bicMap.entries()].sort(([a], [b]) => a.localeCompare(b)) + + const nameOutputLines = [ + "// Lokale Bankleitzahl-zu-Institut Zuordnung (DE).", + "// Quelle: Deutsche Bundesbank, BLZ-Datei (vollstaendig).", + "export const DE_BANK_CODE_TO_NAME: Record = {", + ...sortedNames.map(([blz, name]) => ` "${blz}": "${escapeTsString(name)}",`), + "}", + "", + ] + + const bicOutputLines = [ + "// Lokale Bankleitzahl-zu-BIC Zuordnung (DE).", + "// Quelle: Deutsche Bundesbank, BLZ-Datei (vollstaendig).", + "export const DE_BANK_CODE_TO_BIC: Record = {", + ...sortedBics.map(([blz, bic]) => ` "${blz}": "${escapeTsString(bic)}",`), + "}", + "", + ] + + await fs.writeFile(OUTPUT_NAME_FILE, nameOutputLines.join("\n"), "utf8") + await fs.writeFile(OUTPUT_BIC_FILE, bicOutputLines.join("\n"), "utf8") + console.log(`Wrote ${sortedNames.length} bank names to ${OUTPUT_NAME_FILE}`) + console.log(`Wrote ${sortedBics.length} bank BICs to ${OUTPUT_BIC_FILE}`) +} + +main().catch((err) => { + console.error(err) + process.exit(1) +}) diff --git a/backend/src/routes/banking.ts b/backend/src/routes/banking.ts index 806c25f..22b68c1 100644 --- a/backend/src/routes/banking.ts +++ b/backend/src/routes/banking.ts @@ -6,6 +6,7 @@ import { secrets } from "../utils/secrets" import { insertHistoryItem } from "../utils/history" import { decrypt, encrypt } from "../utils/crypt" import { DE_BANK_CODE_TO_NAME } from "../utils/deBankCodes" +import { DE_BANK_CODE_TO_BIC } from "../utils/deBankBics" import { bankrequisitions, @@ -116,16 +117,20 @@ export default async function bankingRoutes(server: FastifyInstance) { return remainder === 1 } - const resolveBankInstituteFromIbanLocal = (iban: string) => { + const resolveGermanBankDataFromIbanLocal = (iban: string) => { const normalized = normalizeIban(iban) if (!isValidIbanLocal(normalized)) return null // Für DE-IBANs kann die BLZ aus Position 5-12 lokal gelesen werden. if (normalized.startsWith("DE") && normalized.length === 22) { const bankCode = normalized.slice(4, 12) - const bankName = DE_BANK_CODE_TO_NAME[bankCode] - if (bankName) return bankName - return `Unbekannt (BLZ ${bankCode})` + const bankName = DE_BANK_CODE_TO_NAME[bankCode] || `Unbekannt (BLZ ${bankCode})` + const bic = DE_BANK_CODE_TO_BIC[bankCode] || null + return { + bankName, + bic, + bankCode, + } } return null @@ -139,13 +144,14 @@ export default async function bankingRoutes(server: FastifyInstance) { const normalizedIban = normalizeIban(iban) if (!normalizedIban) return null - const bankInstitute = resolveBankInstituteFromIbanLocal(normalizedIban) + const bankData = resolveGermanBankDataFromIbanLocal(normalizedIban) const allAccounts = await server.db .select({ id: entitybankaccounts.id, ibanEncrypted: entitybankaccounts.ibanEncrypted, bankNameEncrypted: entitybankaccounts.bankNameEncrypted, + bicEncrypted: entitybankaccounts.bicEncrypted, }) .from(entitybankaccounts) .where(eq(entitybankaccounts.tenant, tenantId)) @@ -161,19 +167,28 @@ export default async function bankingRoutes(server: FastifyInstance) { }) if (existing?.id) { - if (bankInstitute) { + if (bankData) { let currentBankName = "" + let currentBic = "" try { currentBankName = String(decrypt(existing.bankNameEncrypted as any) || "").trim() } catch { currentBankName = "" } + try { + currentBic = String(decrypt((existing as any).bicEncrypted as any) || "").trim() + } catch { + currentBic = "" + } - if (currentBankName !== bankInstitute) { + const nextBankName = bankData?.bankName || "Unbekannt" + const nextBic = bankData?.bic || "UNBEKANNT" + if (currentBankName !== nextBankName || currentBic !== nextBic) { await server.db .update(entitybankaccounts) .set({ - bankNameEncrypted: encrypt(bankInstitute), + bankNameEncrypted: encrypt(nextBankName), + bicEncrypted: encrypt(nextBic), updatedAt: new Date(), updatedBy: userId, }) @@ -189,8 +204,8 @@ export default async function bankingRoutes(server: FastifyInstance) { .values({ tenant: tenantId, ibanEncrypted: encrypt(normalizedIban), - bicEncrypted: encrypt("UNBEKANNT"), - bankNameEncrypted: encrypt(bankInstitute || "Unbekannt"), + bicEncrypted: encrypt(bankData?.bic || "UNBEKANNT"), + bankNameEncrypted: encrypt(bankData?.bankName || "Unbekannt"), description: "Automatisch aus Bankbuchung übernommen", updatedAt: new Date(), updatedBy: userId, @@ -200,6 +215,30 @@ export default async function bankingRoutes(server: FastifyInstance) { return created?.id ? Number(created.id) : null } + server.get("/banking/iban/:iban", async (req, reply) => { + try { + const { iban } = req.params as { iban: string } + const normalized = normalizeIban(iban) + if (!normalized) { + return reply.code(400).send({ error: "IBAN missing" }) + } + + const valid = isValidIbanLocal(normalized) + const bankData = resolveGermanBankDataFromIbanLocal(normalized) + + return reply.send({ + iban: normalized, + valid, + bic: bankData?.bic || null, + bankName: bankData?.bankName || null, + bankCode: bankData?.bankCode || null, + }) + } catch (err) { + server.log.error(err) + return reply.code(500).send({ error: "Failed to resolve IBAN data" }) + } + }) + const assignIbanFromStatementToCustomer = async (tenantId: number, userId: string, statementId: number, createdDocumentId?: number) => { if (!createdDocumentId) return diff --git a/backend/src/routes/functions.ts b/backend/src/routes/functions.ts index dc96bb7..b198f0d 100644 --- a/backend/src/routes/functions.ts +++ b/backend/src/routes/functions.ts @@ -1,6 +1,6 @@ import { FastifyInstance } from "fastify"; import {createInvoicePDF, createTimeSheetPDF} from "../utils/pdf"; -//import {encodeBase64ToNiimbot, generateLabel, useNextNumberRangeNumber} from "../utils/functions"; +import {encodeBase64ToNiimbot, generateLabel, useNextNumberRangeNumber} from "../utils/functions"; import dayjs from "dayjs"; //import { ready as zplReady } from 'zpl-renderer-js' //import { renderZPL } from "zpl-image"; @@ -15,7 +15,6 @@ import timezone from "dayjs/plugin/timezone.js"; import {generateTimesEvaluation} from "../modules/time/evaluation.service"; import {citys} from "../../db/schema"; import {eq} from "drizzle-orm"; -import {useNextNumberRangeNumber} from "../utils/functions"; import {executeManualGeneration, finishManualGeneration} from "../modules/serialexecution.service"; dayjs.extend(customParseFormat) dayjs.extend(isoWeek) @@ -177,44 +176,20 @@ export default async function functionRoutes(server: FastifyInstance) { await server.services.dokuboxSync.run() }) - - /*server.post('/print/zpl/preview', async (req, reply) => { - const { zpl, widthMm = 50, heightMm = 30, dpmm = 8, asBase64 = false } = req.body as {zpl:string,widthMm:number,heightMm:number,dpmm:number,asBase64:string} - - console.log(widthMm,heightMm,dpmm) - - if (!zpl) { - return reply.code(400).send({ error: 'Missing ZPL string' }) - } - - try { - // 1️⃣ Renderer initialisieren - const { api } = await zplReady - - // 2️⃣ Rendern (liefert base64-encoded PNG) - const base64Png = await api.zplToBase64Async(zpl, widthMm, heightMm, dpmm) - - return await encodeBase64ToNiimbot(base64Png, 'top') - } catch (err) { - console.error('[ZPL Preview Error]', err) - return reply.code(500).send({ error: err.message || 'Failed to render ZPL' }) - } - }) - server.post('/print/label', async (req, reply) => { - const { context, width=584, heigth=354 } = req.body as {context:any,width:number,heigth:number} + const { context, width = 584, height = 354 } = req.body as {context:any,width:number,height:number} try { - const base64 = await generateLabel(context,width,heigth) + const base64 = await generateLabel(context,width,height) return { encoded: await encodeBase64ToNiimbot(base64, 'top'), base64: base64 } } catch (err) { - console.error('[ZPL Preview Error]', err) - return reply.code(500).send({ error: err.message || 'Failed to render ZPL' }) + console.error('[Label Render Error]', err) + return reply.code(500).send({ error: err.message || 'Failed to render label' }) } - })*/ + }) } diff --git a/backend/src/routes/history.ts b/backend/src/routes/history.ts index 010465b..eec50fc 100644 --- a/backend/src/routes/history.ts +++ b/backend/src/routes/history.ts @@ -5,6 +5,7 @@ import { authProfiles, historyitems } from "../../db/schema"; const columnMap: Record = { customers: historyitems.customer, + members: historyitems.customer, vendors: historyitems.vendor, projects: historyitems.project, plants: historyitems.plant, @@ -22,10 +23,14 @@ const columnMap: Record = { documentboxes: historyitems.documentbox, hourrates: historyitems.hourrate, services: historyitems.service, + customerspaces: historyitems.customerspace, + customerinventoryitems: historyitems.customerinventoryitem, + memberrelations: historyitems.memberrelation, }; const insertFieldMap: Record = { customers: "customer", + members: "customer", vendors: "vendor", projects: "project", plants: "plant", @@ -43,6 +48,9 @@ const insertFieldMap: Record = { documentboxes: "documentbox", hourrates: "hourrate", services: "service", + customerspaces: "customerspace", + customerinventoryitems: "customerinventoryitem", + memberrelations: "memberrelation", } const parseId = (value: string) => { diff --git a/backend/src/routes/resources/main.ts b/backend/src/routes/resources/main.ts index 4eb81dc..e0ed07f 100644 --- a/backend/src/routes/resources/main.ts +++ b/backend/src/routes/resources/main.ts @@ -12,7 +12,7 @@ import { import { resourceConfig } from "../../utils/resource.config"; import { useNextNumberRangeNumber } from "../../utils/functions"; -import { insertHistoryItem } from "../../utils/history"; +import { getHistoryEntityLabel, insertHistoryItem } from "../../utils/history"; import { diffObjects } from "../../utils/diff"; import { recalculateServicePricesForTenant } from "../../modules/service-price-recalculation.service"; import { decrypt, encrypt } from "../../utils/crypt"; @@ -67,7 +67,8 @@ function getUserVisibleChanges(oldRecord: Record, updated: Record = { + "10000000": "MARKDEF1100", + "10010010": "PBNKDEFFXXX", + "10010123": "QNTODEB2XXX", + "10010178": "REVODEB2XXX", + "10010200": "TRZODEB2XXX", + "10010300": "KLRNDEBEXXX", + "10010424": "AARBDE5W100", + "10010500": "AFOPDEB2XXX", + "10010700": "FPEGDEB2XXX", + "10011001": "NTSBDEB1XXX", + "10012345": "TRBKDEBBXXX", + "10014000": "SWNBDEBBXXX", + "10014001": "SWNBDEBBXXX", + "10017997": "HOLVDEB1XXX", + "10018000": "FNOMDEB2XXX", + "10019000": "ADYBDEB2XXX", + "10020200": "BHFBDEFF100", + "10020500": "BFSWDE33BER", + "10020510": "BFSWDE33BER", + "10020520": "BFSWDE33BER", + "10020890": "HYVEDEMM488", + "10030200": "BHYPDEB2XXX", + "10030400": "ABKBDEB1XXX", + "10030500": "LOEBDEBBXXX", + "10030700": "DLGHDEB1XXX", + "10030730": "DLGHDEB1XXX", + "10033300": "SCFBDE33XXX", + "10040000": "COBADEBBXXX", + "10040005": "COBADEBBXXX", + "10040010": "COBADEFFXXX", + "10040048": "COBADEFFXXX", + "10040060": "COBADEFFXXX", + "10040061": "COBADEFFXXX", + "10040062": "COBADEFFXXX", + "10040063": "COBADEFFXXX", + "10040085": "COBADEFFXXX", + "10045050": "COBADEFFXXX", + "10050000": "BELADEBEXXX", + "10050020": "SKPADEB1XXX", + "10050500": "LBSODEB1BLN", + "10050999": "DGZFDEFFBER", + "10060198": "GENODED1PA6", + "10061006": "GENODED1KDB", + "10070000": "DEUTDEBBXXX", + "10070024": "DEUTDEDBBER", + "10070100": "DEUTDEBB101", + "10070124": "DEUTDEDB101", + "10070324": "DEUTDEDBP30", + "10070397": "DEUTDEBBP30", + "10070398": "DEUTDEBBP31", + "10070399": "DEUTDEBBP32", + "10070848": "DEUTDEDB110", + "10071324": "DEUTDEDBP31", + "10072324": "DEUTDEDBP32", + "10077777": "NORSDE51XXX", + "10080000": "DRESDEFF100", + "10080005": "DRESDEFFI26", + "10080006": "DRESDEFFXXX", + "10080055": "DRESDEFF112", + "10080057": "DRESDEFF114", + "10080085": "DRESDEFFI53", + "10080086": "DRESDEFFI71", + "10080087": "DRESDEFFI72", + "10080088": "DRESDEFFXXX", + "10080089": "DRESDEFFI73", + "10080900": "DRESDEFF199", + "10089260": "DRESDEFFI14", + "10089999": "DRESDEFFI99", + "10090000": "BEVODEBBXXX", + "10090300": "GENODEF1BSB", + "10090900": "GENODEF1P01", + "10110300": "MACODEB1XXX", + "10110400": "IBBBDEBBXXX", + "10110600": "QUBKDEBBXXX", + "10120100": "WELADED1WBB", + "10130600": "ISBKDEFXXXX", + "10130800": "BIWBDE33XXX", + "10220500": "BOFSDEB1XXX", + "10220600": "SYBKDE22BER", + "10310600": "TRDADEB1PBK", + "10310666": "TRDADEBBDIR", + "10320700": "MPAYDEB2XXX", + "11010100": "SOBKDEBBXXX", + "11010101": "SOBKDEB2XXX", + "11010111": "PNTADEBBXXX", + "12016836": "KFWIDEFF100", + "12030000": "BYLADEM1001", + "12030900": "MEFIDEMM100", + "12040000": "COBADEBB120", + "12050555": "NOLADE21DVS", + "12060000": "GENODEFF120", + "12070000": "DEUTDEBB160", + "12070024": "DEUTDEDB160", + "12070070": "DEUTDEFFVAC", + "12070088": "DEUTDEDBPAL", + "12070400": "DEUTDEBBP33", + "12070424": "DEUTDEDBP33", + "12080000": "DRESDEFF120", + "12096597": "GENODEF1S10", + "13000000": "MARKDEF1130", + "13040000": "COBADEFFXXX", + "13050000": "NOLADE21ROS", + "13051042": "NOLADE21RUE", + "13061008": "GENODEF1WOG", + "13061078": "GENODEF1HWI", + "13061088": "GENODEF1HWR", + "13061128": "GENODEF1DBR", + "13070000": "DEUTDEBRXXX", + "13070024": "DEUTDEDBROS", + "13070405": "DEUTDEBBP35", + "13070424": "DEUTDEDBP35", + "13080000": "DRESDEFF130", + "13090000": "GENODEF1HR1", + "13091054": "GENODEF1HST", + "13091084": "GENODEF1HWV", + "14040000": "COBADEFFXXX", + "14051000": "NOLADE21WIS", + "14051362": "NOLADE21PCH", + "14051462": "NOLADE21SNS", + "14052000": "NOLADE21LWL", + "14061308": "GENODEF1GUE", + "14061438": "GENODEF1GDB", + "14080000": "DRESDEFF140", + "14080011": "DRESDEFFI27", + "14091464": "GENODEF1SN1", + "15000000": "MARKDEF1150", + "15040068": "COBADEFFXXX", + "15050100": "NOLADE21WRN", + "15050200": "NOLADE21NBS", + "15050400": "NOLADE21PSW", + "15050500": "NOLADE21GRW", + "15051732": "NOLADE21MST", + "15061618": "GENODEF1WRN", + "15061638": "GENODEF1ANK", + "15061698": "GENODEF1MAL", + "15080000": "DRESDEFF150", + "15091674": "GENODEF1DM1", + "15091704": "GENODEF1PZ1", + "16010300": "ILBXDE8XXXX", + "16020086": "HYVEDEMM470", + "16040000": "COBADEFFXXX", + "16050000": "WELADED1PMB", + "16050101": "WELADED1PRP", + "16050202": "WELADED1OPR", + "16050500": "LBSODEB1XXX", + "16060122": "GENODEF1PER", + "16061938": "GENODEF1NPP", + "16062008": "GENODEF1LUK", + "16062073": "GENODEF1BRB", + "16080000": "DRESDEFF160", + "16091994": "GENODEF1RN1", + "17020086": "HYVEDEMM471", + "17040000": "COBADEFFXXX", + "17052000": "WELADED1GZE", + "17052302": "WELADED1UMX", + "17054040": "WELADED1MOL", + "17055050": "WELADED1LOS", + "17056060": "WELADED1UMP", + "17062428": "GENODEF1BKW", + "17080000": "DRESDEFF170", + "17092404": "GENODEF1FW1", + "18020086": "HYVEDEMM472", + "18040000": "COBADEFFXXX", + "18050000": "WELADED1CBN", + "18051000": "WELADED1EES", + "18055000": "WELADED1OSL", + "18062678": "GENODEF1FWA", + "18062758": "GENODEF1FOR", + "18080000": "DRESDEFF180", + "18092684": "GENODEF1LN1", + "18092744": "GENODEF1SPM", + "20000000": "MARKDEF1200", + "20010020": "PBNKDEFFXXX", + "20010424": "AARBDE5W200", + "20020200": "ESSEDEFFHAM", + "20020500": "JYBADEHHXXX", + "20020900": "SIBSDEHHXXX", + "20030000": "HYVEDEMM300", + "20030133": "VGAGDEHHXXX", + "20030300": "CHDBDEHHXXX", + "20030301": "CHDBDEHHXXX", + "20030400": "MCRDDEHHXXX", + "20030600": "SYBKDE22HAM", + "20030700": "MEFIDEMM200", + "20040000": "COBADEHHXXX", + "20040005": "COBADEHHXXX", + "20040020": "COBADEFFXXX", + "20040040": "COBADEFFXXX", + "20040048": "COBADEFFXXX", + "20040050": "COBADEFFXXX", + "20040060": "COBADEFFXXX", + "20040061": "COBADEFFXXX", + "20040062": "COBADEFFXXX", + "20040063": "COBADEFFXXX", + "20041111": "COBADEHDXXX", + "20041133": "COBADEHD001", + "20041144": "COBADEHD044", + "20041155": "COBADEHD055", + "20041166": "COBADEHD066", + "20041177": "COBADEHD077", + "20041188": "COBADEHD088", + "20041199": "COBADEHD099", + "20050550": "HASPDEHHXXX", + "20060000": "GENODEFF200", + "20069111": "GENODEF1NDR", + "20069125": "GENODEF1KLK", + "20069130": "GENODEF1BBR", + "20069144": "GENODEF1SST", + "20069177": "GENODEF1GRS", + "20069232": "GENODEF1STV", + "20069641": "GENODEF1OWS", + "20069780": "GENODEF1AST", + "20069782": "GENODEF1APE", + "20069786": "GENODEF1DRO", + "20069800": "GENODEF1HAA", + "20069812": "GENODEF1FRB", + "20069815": "GENODEF1815", + "20069861": "GENODEF1RRZ", + "20069882": "GENODEF1RLT", + "20069965": "GENODEF1WIM", + "20069989": "GENODEF1WUL", + "20070000": "DEUTDEHHXXX", + "20070024": "DEUTDEDBHAM", + "20070404": "DEUTDEHHP34", + "20070424": "DEUTDEDBP34", + "20080000": "DRESDEFF200", + "20080055": "DRESDEFF207", + "20080057": "DRESDEFF208", + "20080085": "DRESDEFFI56", + "20080086": "DRESDEFFI63", + "20080087": "DRESDEFFI64", + "20080088": "DRESDEFFI74", + "20080089": "DRESDEFFI75", + "20080091": "DRESDEFFJ33", + "20080092": "DRESDEFFJ34", + "20080093": "DRESDEFFJ35", + "20080094": "DRESDEFFJ36", + "20080095": "DRESDEFFJ37", + "20089200": "DRESDEFFI06", + "20090400": "DGHYDEH1XXX", + "20090700": "EDEKDEHHXXX", + "20090745": "EDEKDEHHXXX", + "20090900": "GENODEF1P08", + "20110022": "PBNKDEFFXXX", + "20110700": "BOTKDEH1XXX", + "20110800": "BKCHDEFFHMB", + "20120000": "BEGODEHHXXX", + "20120100": "WBWCDEHHXXX", + "20120200": "BHFBDEFF200", + "20120400": "DRBKDEH1XXX", + "20120520": "BFSWDE33HAN", + "20120600": "GOGODEH1XXX", + "20120700": "HSTBDEHHXXX", + "20130400": "GREBDEH1XXX", + "20130600": "BARCDEHAXXX", + "20133300": "SCFBDE33XXX", + "20190003": "GENODEF1HH2", + "20190077": "GENODEF1HH2", + "20190109": "GENODEF1HH4", + "20190206": "GENODEF1HH1", + "20190301": "GENODEF1HH3", + "20190800": "GENODEF1MKB", + "20210200": "MELIDEHHXXX", + "20210300": "SIHRDEH1HAM", + "20220100": "DNBADEHXXXX", + "20220800": "SXPYDEHHXXX", + "20230300": "OSCBDEH1XXX", + "20230600": "ISBKDEFXXXX", + "20230800": "MHSBDEHBXXX", + "20310300": "EIHBDEHHXXX", + "20690500": "GENODEF1S11", + "20730001": "HYVEDEMME01", + "20730002": "HYVEDEMME02", + "20730003": "HYVEDEMME03", + "20730004": "HYVEDEMME04", + "20730005": "HYVEDEMME05", + "20730006": "HYVEDEMME06", + "20730007": "HYVEDEMME07", + "20730008": "HYVEDEMME08", + "20730009": "HYVEDEMME09", + "20730010": "HYVEDEMME10", + "20730011": "HYVEDEMME11", + "20730012": "HYVEDEMME12", + "20730013": "HYVEDEMME13", + "20730014": "HYVEDEMME14", + "20730015": "HYVEDEMME15", + "20730016": "HYVEDEMME16", + "20730017": "HYVEDEMME17", + "20730018": "HYVEDEMME18", + "20730019": "HYVEDEMME19", + "20730020": "HYVEDEMME20", + "20730021": "HYVEDEMME21", + "20730022": "HYVEDEMME22", + "20730023": "HYVEDEMME23", + "20730024": "HYVEDEMME24", + "20730025": "HYVEDEMME25", + "20730026": "HYVEDEMME26", + "20730027": "HYVEDEMME27", + "20730028": "HYVEDEMME28", + "20730029": "HYVEDEMME29", + "20730030": "HYVEDEMME30", + "20730031": "HYVEDEMME31", + "20730032": "HYVEDEMME32", + "20730033": "HYVEDEMME33", + "20730034": "HYVEDEMME34", + "20730035": "HYVEDEMME35", + "20730036": "HYVEDEMME36", + "20730037": "HYVEDEMME37", + "20730038": "HYVEDEMME38", + "20730039": "HYVEDEMME39", + "20730040": "HYVEDEMME40", + "20730041": "HYVEDEMME41", + "20730042": "HYVEDEMME42", + "20730043": "HYVEDEMME43", + "20730044": "HYVEDEMME44", + "20730045": "HYVEDEMME45", + "20730046": "HYVEDEMME46", + "20730047": "HYVEDEMME47", + "20730048": "HYVEDEMME48", + "20730049": "HYVEDEMME49", + "20730050": "HYVEDEMME50", + "20730052": "HYVEDEMME52", + "20730055": "HYVEDEMME55", + "20730056": "HYVEDEMME56", + "20730057": "HYVEDEMME57", + "20730058": "HYVEDEMME58", + "20730059": "HYVEDEMME59", + "20730060": "HYVEDEMME60", + "20730061": "HYVEDEMME61", + "20730062": "HYVEDEMME62", + "20730063": "HYVEDEMME63", + "20730064": "HYVEDEMME64", + "20730065": "HYVEDEMME65", + "20730066": "HYVEDEMME66", + "20730067": "HYVEDEMME67", + "20730068": "HYVEDEMME68", + "20730069": "HYVEDEMME69", + "20730070": "HYVEDEMME70", + "20730071": "HYVEDEMME71", + "20730072": "HYVEDEMME72", + "20730073": "HYVEDEMME73", + "20730074": "HYVEDEMME74", + "20730075": "HYVEDEMME75", + "20730076": "HYVEDEMME76", + "20730077": "HYVEDEMME77", + "20730078": "HYVEDEMME78", + "20730079": "HYVEDEMME79", + "20730080": "HYVEDEMME80", + "20730081": "HYVEDEMME81", + "20730082": "HYVEDEMME82", + "20730083": "HYVEDEMME83", + "20730084": "HYVEDEMME84", + "20730085": "HYVEDEMME85", + "20730086": "HYVEDEMME86", + "20730087": "HYVEDEMME87", + "20730088": "HYVEDEMME88", + "20730089": "HYVEDEMME89", + "20730090": "HYVEDEMME90", + "20730091": "HYVEDEMME91", + "20730092": "HYVEDEMME92", + "20730093": "HYVEDEMME93", + "20730094": "HYVEDEMME94", + "20730095": "HYVEDEMME95", + "20730096": "HYVEDEMME96", + "20730097": "HYVEDEMME97", + "20730098": "HYVEDEMME98", + "20730099": "HYVEDEMME99", + "20750000": "NOLADE21HAM", + "21020600": "SYBKDE22KIE", + "21040010": "COBADEFFXXX", + "21042076": "COBADEFFXXX", + "21050000": "HSHNDEHHXXX", + "21050055": "HHDBDEH2XXX", + "21050170": "NOLADE21KIE", + "21051275": "NOLADE21BOR", + "21051580": "NOLADE21PLN", + "21052090": "NOLADE21ECK", + "21070020": "DEUTDEHH210", + "21070024": "DEUTDEDB210", + "21080050": "DRESDEFF210", + "21089201": "DRESDEFFI07", + "21090007": "GENODEF1KIL", + "21090099": "GENODEF1KIL", + "21090900": "GENODEF1P11", + "21092023": "GENODEF1EFO", + "21240040": "COBADEFFXXX", + "21241540": "COBADEFFXXX", + "21270020": "DEUTDEHH212", + "21270024": "DEUTDEDB212", + "21280002": "DRESDEFF212", + "21290016": "GENODEF1NMS", + "21340010": "COBADEFFXXX", + "21352240": "NOLADE21HOL", + "21390008": "GENODEF1NSH", + "21392218": "GENODEF1EUT", + "21440045": "COBADEFFXXX", + "21450000": "NOLADE21RDB", + "21451205": "NOLADE21BDF", + "21452030": "NOLADE21HWS", + "21463603": "GENODEF1NTO", + "21464671": "GENODEF1TOB", + "21480003": "DRESDEFF214", + "21510600": "SYBKDE22XXX", + "21520100": "UNBNDE21XXX", + "21540060": "COBADEFFXXX", + "21565316": "GENODEF1HDW", + "21570011": "DEUTDEHH215", + "21570024": "DEUTDEDB215", + "21570202": "DEUTDEHHP01", + "21570224": "DEUTDEDBP01", + "21580000": "DRESDEFF215", + "21661719": "GENODEF1RSL", + "21690020": "GENODEF1SLW", + "21740043": "COBADEFFXXX", + "21741674": "COBADEFFXXX", + "21741825": "COBADEFFXXX", + "21750000": "NOLADE21NOS", + "21751230": "NOLADE21BRD", + "21762550": "GENODEF1HUM", + "21763542": "GENODEF1BDS", + "21770011": "DEUTDEHH217", + "21770024": "DEUTDEDB217", + "21791805": "GENODEF1SYL", + "21791906": "GENODEF1WYK", + "21840078": "COBADEFFXXX", + "21841328": "COBADEFFXXX", + "21852310": "NOLADE21WEB", + "21860418": "GENODEF1RHE", + "21890022": "GENODEF1DVR", + "22140028": "COBADEFFXXX", + "22141028": "COBADEFFXXX", + "22141428": "COBADEFFXXX", + "22141628": "COBADEFFXXX", + "22150000": "NOLADE21ELH", + "22151730": "NOLADE21WED", + "22163114": "GENODEF1HTE", + "22180000": "DRESDEFF221", + "22181400": "DRESDEFF206", + "22190030": "GENODEF1ELM", + "22191405": "GENODEF1PIN", + "22240073": "COBADEFFXXX", + "22250020": "NOLADE21WHO", + "22280000": "DRESDEFF201", + "22290031": "GENODEF1VIT", + "23040022": "COBADEFFXXX", + "23050101": "NOLADE21SPL", + "23051030": "NOLADE21SHO", + "23052750": "NOLADE21RZB", + "23061220": "GENODEF1LZN", + "23062124": "GENODEF1BAR", + "23063129": "GENODEF1RLB", + "23064107": "GENODEF1BCH", + "23070203": "DEUTDEHHP02", + "23070224": "DEUTDEDBP02", + "23070700": "DEUTDEDB237", + "23070710": "DEUTDEHH222", + "23080040": "DRESDEFF230", + "23089201": "DRESDEFFI08", + "23090142": "GENODEF1HLU", + "24040000": "COBADEFFXXX", + "24050110": "NOLADE21LBG", + "24060300": "GENODEF1NBU", + "24061392": "GENODEF1DAB", + "24070024": "DEUTDEDB240", + "24070075": "DEUTDE2H240", + "24070324": "DEUTDEDBP22", + "24070368": "DEUTDE2HP22", + "24080000": "DRESDEFF240", + "24090041": "GENODEF1LUE", + "24121000": "GENODED1RKI", + "24140041": "COBADEFFXXX", + "24150001": "BRLADE21CUX", + "24151005": "NOLADE21STS", + "24151116": "NOLADE21STK", + "24151235": "BRLADE21ROB", + "24161594": "GENODEF1SIT", + "24162898": "GENODEF1LAS", + "24180000": "DRESDEFF242", + "24180001": "DRESDEFF241", + "24191015": "GENODEF1SDE", + "25000000": "MARKDEF1250", + "25010030": "PBNKDEFFXXX", + "25010424": "AARBDE5W250", + "25010600": "DEHYDE2HXXX", + "25010900": "CKVHDE21XXX", + "25020200": "BHFBDEFF250", + "25020600": "SCFBDE33XXX", + "25040060": "COBADEFFXXX", + "25040061": "COBADEFFXXX", + "25040066": "COBADEFFXXX", + "25050000": "NOLADE2HXXX", + "25050055": "NOLADE21CSH", + "25050066": "NOLADE21CMV", + "25050180": "SPKHDE2HXXX", + "25055500": "NOLADE21LBS", + "25060000": "GENODEFF250", + "25060180": "HALLDE2HXXX", + "25069168": "GENODEF1DES", + "25069262": "GENODEF1NST", + "25069270": "GENODEF1MUA", + "25069503": "GENODEF1BNT", + "25070024": "DEUTDEDBHAN", + "25070066": "DEUTDE2H265", + "25070070": "DEUTDE2HXXX", + "25070077": "DEUTDE2H256", + "25070084": "DEUTDE2H258", + "25070086": "DEUTDE2H251", + "25070324": "DEUTDEDBP24", + "25070370": "DEUTDE2HP24", + "25080020": "DRESDEFF250", + "25080085": "DRESDEFFI65", + "25089220": "DRESDEFFI09", + "25090300": "GENODEF1BFS", + "25090500": "GENODEF1S09", + "25090900": "GENODEF1P09", + "25120510": "BFSWDE33HAN", + "25151270": "NOLADE21BAH", + "25151371": "NOLADE21BUF", + "25152375": "NOLADE21WAL", + "25152490": "NOLADE21WST", + "25190001": "VOHADE2HXXX", + "25190088": "VOHADE2HXXX", + "25193331": "GENODEF1PAT", + "25250001": "NOLADE21PEI", + "25260010": "GENODEF1PEV", + "25410200": "BHWBDE2HXXX", + "25440047": "COBADEFFXXX", + "25450001": "NOLADE21HMS", + "25450110": "NOLADE21SWB", + "25451345": "NOLADE21PMT", + "25462160": "GENODEF1HMP", + "25462680": "GENODEF1COP", + "25470024": "DEUTDEDB254", + "25470073": "DEUTDE2H254", + "25471024": "DEUTDEDB264", + "25471073": "DEUTDE2H264", + "25480021": "DRESDEFF254", + "25491273": "GENODED1AEZ", + "25541426": "COBADEFFXXX", + "25551480": "NOLADE21SHG", + "25591413": "GENODEF1BCK", + "25621327": "OLBODEH2XXX", + "25641302": "COBADEFFXXX", + "25650106": "NOLADE21NIB", + "25651325": "BRLADE21DHZ", + "25662540": "GENODEF1STY", + "25663584": "GENODEF1HOY", + "25690009": "GENODEF1NIN", + "25691633": "GENODEF1SUL", + "25691699": "GENODEF1SUL", + "25740061": "COBADEFFXXX", + "25750001": "NOLADE21CEL", + "25761894": "GENODEF1WIK", + "25770024": "DEUTDEDB257", + "25770069": "DEUTDE2H257", + "25780022": "DRESDEFF257", + "25791516": "GENODEF1HKB", + "25791635": "GENODEF1HMN", + "25840048": "COBADEFFXXX", + "25841403": "COBADEFFXXX", + "25841708": "COBADEFFXXX", + "25850110": "NOLADE21UEL", + "25851660": "NOLADE21SOL", + "25861990": "GENODEF1CLZ", + "25862292": "GENODEF1EUB", + "25863489": "GENODEF1WOT", + "25891636": "GENODEF1SOL", + "25940033": "COBADEFFXXX", + "25950001": "NOLADE21HIS", + "25950130": "NOLADE21HIK", + "25970024": "DEUTDEDB259", + "25970074": "DEUTDE2H259", + "25971024": "DEUTDEDB253", + "25971071": "DEUTDE2H253", + "25980027": "DRESDEFF259", + "25990011": "GENODEF1HIH", + "25991528": "GENODEF1SLD", + "26000000": "MARKDEF1260", + "26040030": "COBADEFFXXX", + "26050001": "NOLADE21GOE", + "26051260": "NOLADE21DUD", + "26061291": "GENODEF1DUD", + "26061556": "GENODEF1ADE", + "26062433": "GENODEF1DRA", + "26070024": "DEUTDEDB260", + "26070072": "DEUTDE2H260", + "26080024": "DRESDEFF260", + "26090050": "GENODEF1GOE", + "26240039": "COBADEFFXXX", + "26250001": "NOLADE21NOM", + "26251425": "NOLADE21EIN", + "26261492": "GENODEF1EIN", + "26261693": "GENODEF1HDG", + "26271424": "DEUTDEDB262", + "26271471": "DEUTDE2H262", + "26280020": "DRESDEFF261", + "26281420": "DRESDEFF262", + "26340056": "COBADEFFXXX", + "26341072": "COBADEFFXXX", + "26351015": "NOLADE21HZB", + "26351445": "NOLADE21SAC", + "26500000": "MARKDEF1265", + "26520017": "OLBODEH2XXX", + "26521703": "OLBODEH2XXX", + "26522319": "OLBODEH2XXX", + "26540070": "COBADEFFXXX", + "26550105": "NOLADE22XXX", + "26551540": "NOLADE21BEB", + "26552286": "NOLADE21MEL", + "26562490": "GENODEF1HTR", + "26563960": "GENODEF1WHO", + "26565928": "GENODEF1HGM", + "26566939": "GENODEF1MRZ", + "26567943": "GENODEF1NOP", + "26570024": "DEUTDEDB265", + "26570090": "DEUTDE3B265", + "26580070": "DRESDEFF265", + "26589210": "DRESDEFFI10", + "26590025": "GENODEF1OSV", + "26620010": "OLBODEH2XXX", + "26621413": "OLBODEH2XXX", + "26640049": "COBADEFFXXX", + "26650001": "NOLADE21EMS", + "26660060": "GENODEF1LIG", + "26661380": "GENODEF1HLN", + "26661494": "GENODEF1MEP", + "26662932": "GENODEF1LEN", + "26691213": "GENODEF1HAR", + "26720028": "OLBODEH2XXX", + "26740044": "COBADEFFXXX", + "26750001": "NOLADE21NOH", + "26760005": "GENODEF1NDH", + "26770024": "DEUTDEDB267", + "26770095": "DEUTDE3B267", + "26840032": "COBADEFFXXX", + "26850001": "NOLADE21GSL", + "26851410": "NOLADE21CLZ", + "26851620": "NOLADE21SZG", + "26870024": "DEUTDEDB268", + "26870032": "DEUTDE2H268", + "26880063": "DRESDEFF268", + "26890019": "GENODEF1VNH", + "26891484": "GENODEF1OHA", + "26941053": "COBADEFFXXX", + "26951311": "NOLADE21GFW", + "26971024": "DEUTDEDB269", + "26971038": "DEUTDE2H269", + "26981062": "DRESDEFF269", + "26989221": "DRESDEFFI11", + "26991066": "GENODEF1WOB", + "27020000": "VOWADE2BXXX", + "27020001": "AUDFDE21XXX", + "27020003": "SKODDE21XXX", + "27020004": "ECBKDE21XXX", + "27020800": "SEATDE21XXX", + "27032500": "BCLSDE21XXX", + "27040080": "COBADEFFXXX", + "27062290": "GENODEF1BOH", + "27070024": "DEUTDEDB270", + "27070030": "DEUTDE2H270", + "27070031": "DEUTDE2H271", + "27070034": "DEUTDE2H274", + "27070041": "DEUTDE2H279", + "27070042": "DEUTDE2H272", + "27070043": "DEUTDE2H273", + "27070079": "DEUTDE2H275", + "27070324": "DEUTDEDBP23", + "27070369": "DEUTDE2HP23", + "27072524": "DEUTDEDB277", + "27072537": "DEUTDE2H277", + "27072724": "DEUTDEDB276", + "27072736": "DEUTDE2H276", + "27080060": "DRESDEFF270", + "27089221": "DRESDEFFI12", + "27090900": "GENODEF1P02", + "27092555": "GENODEF1WFV", + "27131300": "GENODEF1RTS", + "27240004": "COBADEFFXXX", + "27290087": "GENODEF1HMV", + "27893359": "GENODEF1BLG", + "27893760": "GENODEF1SES", + "28000000": "MARKDEF1280", + "28020050": "OLBODEH2XXX", + "28021002": "OLBODEH2XXX", + "28021301": "OLBODEH2XXX", + "28021504": "OLBODEH2XXX", + "28021623": "OLBODEH2XXX", + "28021705": "OLBODEH2XXX", + "28021906": "OLBODEH2XXX", + "28022015": "OLBODEH2XXX", + "28022412": "OLBODEH2XXX", + "28022511": "OLBODEH2XXX", + "28022620": "OLBODEH2XXX", + "28022822": "OLBODEH2XXX", + "28023224": "OLBODEH2XXX", + "28023325": "OLBODEH2XXX", + "28030300": "FORTDEH4XXX", + "28040046": "COBADEFFXXX", + "28042865": "COBADEFFXXX", + "28050100": "SLZODE22XXX", + "28060228": "GENODEF1OL2", + "28061410": "GENODEF1BRN", + "28061501": "GENODEF1CLP", + "28061679": "GENODEF1DAM", + "28061822": "GENODEF1EDE", + "28062165": "GENODEF1RSE", + "28062249": "GENODEF1HUD", + "28062299": "GENODEF1HUD", + "28062560": "GENODEF1LON", + "28062740": "GENODEF1GBH", + "28062913": "GENODEF1BSL", + "28063253": "GENODEF1WRE", + "28063526": "GENODEF1ESO", + "28063607": "GENODEF1BAM", + "28064179": "GENODEF1VEC", + "28064241": "GENODEF1NHE", + "28065061": "GENODEF1LOG", + "28065108": "GENODEF1DIK", + "28065286": "GENODEF1SAN", + "28066103": "GENODEF1VIS", + "28066214": "GENODEF1WDH", + "28066620": "GENODEF1FOY", + "28067068": "GENODEF1NEO", + "28067170": "GENODEF1GSC", + "28067257": "GENODEF1LAP", + "28068218": "GENODEF1BUT", + "28069052": "GENODEF1ORF", + "28069092": "GENODEF1HAT", + "28069109": "GENODEF1EMK", + "28069128": "GENODEF1GRR", + "28069138": "GENODEF1VAG", + "28069293": "GENODEF1BBH", + "28069381": "GENODEF1WLT", + "28069706": "GENODEF1BOG", + "28069755": "GENODEF1MLO", + "28069773": "GENODEF1WWM", + "28069878": "GENODEF1KBL", + "28069926": "GENODEF1HOO", + "28069935": "GENODEF1LRU", + "28069956": "GENODEF1NEV", + "28069991": "GENODEF1LTH", + "28069994": "GENODEF1SPL", + "28070024": "DEUTDEDB280", + "28070057": "DEUTDEHB280", + "28220026": "OLBODEH2XXX", + "28222208": "OLBODEH2XXX", + "28222621": "OLBODEH2XXX", + "28240023": "COBADEFFXXX", + "28250110": "BRLADE21WHV", + "28252760": "BRLADE21WTM", + "28262254": "GENODEF1JEV", + "28262673": "GENODEF1VAR", + "28270024": "DEUTDEDB282", + "28270056": "DEUTDEHB282", + "28280012": "DRESDEFF282", + "28290063": "GENODEF1WHV", + "28291551": "GENODEF1ESE", + "28320014": "OLBODEH2XXX", + "28321816": "OLBODEH2XXX", + "28350000": "BRLADE21ANO", + "28361592": "GENODEF1MAR", + "28420007": "OLBODEH2XXX", + "28421030": "OLBODEH2XXX", + "28440037": "COBADEFFXXX", + "28450000": "BRLADE21EMD", + "28470024": "DEUTDEDB284", + "28470091": "DEUTDEHB284", + "28520009": "OLBODEH2XXX", + "28521518": "OLBODEH2XXX", + "28540034": "COBADEFFXXX", + "28550000": "BRLADE21LER", + "28562297": "GENODEF1UPL", + "28562716": "GENODEF1WEF", + "28562863": "GENODEF1HTL", + "28563749": "GENODEF1MML", + "28570024": "DEUTDEDB285", + "28570092": "DEUTDEHB285", + "28590075": "GENODEF1LER", + "28591579": "GENODEF1PAP", + "28591654": "GENODEF1WRH", + "29020000": "NEELDE22XXX", + "29020200": "NFHBDE21XXX", + "29030400": "PLUMDE29XXX", + "29040060": "COBADEFFXXX", + "29040061": "COBADEFFXXX", + "29040090": "COBADEFFXXX", + "29050000": "BRLADE22XXX", + "29050101": "SBREDE22XXX", + "29070024": "DEUTDEDBBRE", + "29070050": "DEUTDEHBXXX", + "29070051": "DEUTDEHB292", + "29070052": "DEUTDEHB294", + "29070058": "DEUTDEHB293", + "29070059": "DEUTDEHB290", + "29070324": "DEUTDEDBP21", + "29070367": "DEUTDEHBP21", + "29080010": "DRESDEFF290", + "29089210": "DRESDEFFI13", + "29090900": "GENODEF1P03", + "29121731": "OLBODEH2XXX", + "29151700": "BRLADE21SYK", + "29152300": "BRLADE21OHZ", + "29152550": "BRLADE21SHL", + "29152670": "BRLADE21VER", + "29162394": "GENODEF1OHZ", + "29162453": "GENODEF1SWW", + "29162697": "GENODEF1VER", + "29165545": "GENODEF1OYT", + "29165681": "GENODEF1SUM", + "29166568": "GENODEF1WOP", + "29167624": "GENODEF1SHR", + "29172624": "DEUTDEDB291", + "29172655": "DEUTDEHB291", + "29190024": "GENODEF1HB1", + "29190330": "GENODEF1HB2", + "29190399": "GENODEF1HB2", + "29240024": "COBADEFFXXX", + "29250000": "BRLADE21BRS", + "29250150": "BRLADE21BRK", + "29262722": "GENODEF1BRV", + "29265747": "GENODEF1BEV", + "29280011": "DRESDEFF292", + "29290034": "GENODEF1HBV", + "30000000": "MARKDEF1300", + "30010400": "IKBDDEDDXXX", + "30010444": "IKBDDEDDDIR", + "30010700": "BOTKDEDXXXX", + "30013300": "EBPBDED2XXX", + "30020500": "BHFBDEFF300", + "30020700": "MHCBDEDDXXX", + "30020900": "CMCIDEDDXXX", + "30022000": "NRWBDEDMXXX", + "30030100": "PULSDEDDXXX", + "30030500": "CUABDED1XXX", + "30030600": "ETRIDE31XXX", + "30030880": "TUBDDEDDXXX", + "30030889": "TUBDDEDDXXX", + "30030900": "MEFIDEMM300", + "30040000": "COBADEDDXXX", + "30040005": "COBADEDDXXX", + "30040048": "COBADEFFXXX", + "30040060": "COBADEFFXXX", + "30040061": "COBADEFFXXX", + "30040062": "COBADEFFXXX", + "30040063": "COBADEFFXXX", + "30040098": "COBADEFFCSC", + "30040099": "COBADEFFSTS", + "30050000": "WELADEDDXXX", + "30050110": "DUSSDEDDXXX", + "30060010": "GENODEDDXXX", + "30060601": "DAAEDEDDXXX", + "30060992": "GENODEF1P05", + "30070010": "DEUTDEDDXXX", + "30070024": "DEUTDEDBDUE", + "30070207": "DEUTDEDDP06", + "30070224": "DEUTDEDBP06", + "30080000": "DRESDEFF300", + "30080005": "DRESDEFFXXX", + "30080022": "DRESDEFFI28", + "30080038": "DRESDEFFXXX", + "30080041": "DRESDEFFI29", + "30080053": "DRESDEFFI30", + "30080055": "DRESDEFF309", + "30080057": "DRESDEFF316", + "30080061": "DRESDEFFI31", + "30080074": "DRESDEFFI32", + "30080080": "DRESDEFFI76", + "30080081": "DRESDEFFI77", + "30080082": "DRESDEFFI78", + "30080083": "DRESDEFFI79", + "30080084": "DRESDEFFI80", + "30080085": "DRESDEFFI81", + "30080086": "DRESDEFFI82", + "30080087": "DRESDEFFI83", + "30080088": "DRESDEFFI84", + "30080089": "DRESDEFFI85", + "30080095": "DRESDEFFI33", + "30089300": "DRESDEFFI02", + "30089302": "DRESDEFFI03", + "30110300": "SMBCDEDDXXX", + "30130100": "DHBNDEDDXXX", + "30130200": "UGBIDEDDXXX", + "30130600": "ISBKDEFXDUS", + "30150001": "WELADEDDXXX", + "30150200": "WELADED1KSD", + "30160213": "GENODED1DNE", + "30160266": "GENODED1DNE", + "30220190": "HYVEDEMM414", + "30330800": "BIWBDE33303", + "30351220": "WELADED1HAA", + "30520000": "RCIDDE3NXXX", + "30520037": "RCIDDE3NPAY", + "30524400": "KREDDEDDXXX", + "30530000": "WERHDED1XXX", + "30530500": "WEFZDED1XXX", + "30550000": "WELADEDNXXX", + "30551240": "WELADED1KST", + "30560090": "GENODED1NSS", + "30560548": "GENODED1NLD", + "30560591": "GENODED1NLD", + "31010833": "SCFBDE33XXX", + "31040015": "COBADEFFXXX", + "31040060": "COBADEFFXXX", + "31040061": "COBADEFFXXX", + "31050000": "MGLSDE33XXX", + "31060181": "GENODED1GBM", + "31060517": "GENODED1MRB", + "31062154": "GENODED1KBN", + "31062553": "GENODED1NKR", + "31070001": "DEUTDEDD310", + "31070024": "DEUTDEDB310", + "31070206": "DEUTDEDDP05", + "31070224": "DEUTDEDBP05", + "31080015": "DRESDEFF310", + "31080061": "DRESDEFFI34", + "31251220": "WELADED1ERK", + "31261282": "GENODED1EHE", + "31263359": "GENODED1LOE", + "31460290": "GENODED1VSN", + "31470004": "DEUTDEDD314", + "31470024": "DEUTDEDB314", + "32040024": "COBADEFFXXX", + "32050000": "SPKRDE33XXX", + "32051996": "WELADED1STR", + "32060362": "GENODED1HTK", + "32061384": "GENODED1GDL", + "32061414": "GENODED1KMP", + "32070024": "DEUTDEDB320", + "32070080": "DEUTDEDD320", + "32080010": "DRESDEFF320", + "32250050": "WELADED1GOC", + "32440023": "COBADEFFXXX", + "32450000": "WELADED1KLE", + "32460422": "GENODED1KLL", + "32470024": "DEUTDEDB324", + "32470077": "DEUTDEDD324", + "33020000": "AKFBDE31XXX", + "33020190": "HYVEDEMM809", + "33030000": "GGABDE31XXX", + "33040001": "COBADEFFXXX", + "33040310": "COBADEDHXXX", + "33050000": "WUPSDE33XXX", + "33060098": "GENODED1CVW", + "33060592": "GENODED1SPW", + "33070024": "DEUTDEDBWUP", + "33070090": "DEUTDEDWXXX", + "33080001": "DRESDEFFI86", + "33080030": "DRESDEFF332", + "33080085": "DRESDEFFI87", + "33080086": "DRESDEFFI88", + "33080087": "DRESDEFFI89", + "33080088": "DRESDEFFI90", + "33440035": "COBADEFFXXX", + "33450000": "WELADED1VEL", + "33451220": "WELADED1HGH", + "34040049": "COBADEFFXXX", + "34050000": "WELADEDRXXX", + "34051350": "WELADED1RVW", + "34051570": "WELADED1WMK", + "34060094": "VBRSDE33XXX", + "34070024": "DEUTDEDB340", + "34070093": "DEUTDEDW340", + "34080031": "DRESDEFF340", + "34240050": "COBADEFFXXX", + "34250000": "SOLSDE33XXX", + "34270024": "DEUTDEDB342", + "34270094": "DEUTDEDW342", + "34280032": "DRESDEFF342", + "35040038": "COBADEFFXXX", + "35040085": "COBADEFFXXX", + "35050000": "DUISDE33XXX", + "35060190": "GENODED1DKD", + "35060199": "GENODED1DKD", + "35060386": "GENODED1VRR", + "35070024": "DEUTDEDB350", + "35070030": "DEUTDEDE350", + "35080070": "DRESDEFF350", + "35080085": "DRESDEFFI91", + "35080086": "DRESDEFFI92", + "35080087": "DRESDEFFI93", + "35080088": "DRESDEFFI94", + "35080089": "DRESDEFFI95", + "35090300": "GENODEF1BSD", + "35251000": "WELADED1DIN", + "35261248": "GENODED1DLK", + "35450000": "WELADED1MOR", + "35451460": "WELADED1NVL", + "35451775": "WELADED1RHB", + "35461106": "GENODED1NRH", + "35640064": "COBADEFFXXX", + "35650000": "WELADED1WES", + "35660501": "GENODED1RLW", + "35660599": "GENODED1RLW", + "35850000": "WELADED1EMR", + "35860245": "GENODED1EMR", + "36000000": "MARKDEF1360", + "36010043": "PBNKDEFFXXX", + "36010424": "AARBDE5W360", + "36020030": "NBAGDE3EXXX", + "36020186": "HYVEDEMM360", + "36033300": "SCFBDE33XXX", + "36040039": "COBADEFFXXX", + "36040060": "COBADEFFXXX", + "36040061": "COBADEFFXXX", + "36040085": "COBADEFFXXX", + "36050105": "SPESDE3EXXX", + "36060192": "GENODED1PA2", + "36060295": "GENODED1BBE", + "36060488": "GENODEM1GBE", + "36060591": "GENODED1SPE", + "36070024": "DEUTDEDBESS", + "36070050": "DEUTDEDEXXX", + "36070208": "DEUTDEDEP07", + "36070224": "DEUTDEDBP07", + "36080080": "DRESDEFF360", + "36080085": "DRESDEFFI66", + "36089321": "DRESDEFFI17", + "36240045": "COBADEFFXXX", + "36250000": "SPMHDE3EXXX", + "36270024": "DEUTDEDB362", + "36270048": "DEUTDEDE362", + "36280071": "DRESDEFF362", + "36540046": "COBADEFFXXX", + "36550000": "WELADED1OBH", + "36570024": "DEUTDEDB365", + "36570049": "DEUTDEDE365", + "36580072": "DRESDEFF365", + "37000000": "MARKDEF1370", + "37010050": "PBNKDEFFXXX", + "37010600": "BNPADEFFXXX", + "37010699": "BNPADEFFXXX", + "37011000": "PBNKDEFFXXX", + "37019000": "BUNQDE82XXX", + "37020090": "HYVEDEMM429", + "37020200": "AXABDE31XXX", + "37020400": "TOBADE33XXX", + "37020500": "BFSWDE33XXX", + "37020600": "SCFBDE33XXX", + "37021500": "FDBADE8FXXX", + "37021548": "LRFSDE31XXX", + "37027000": "SCFBDE33XXX", + "37030700": "WWBADE3AXXX", + "37030800": "ISBKDEFXKOL", + "37040037": "COBADEFFXXX", + "37040044": "COBADEFFXXX", + "37040048": "COBADEFFXXX", + "37040060": "COBADEFFXXX", + "37040061": "COBADEFFXXX", + "37050198": "COLSDE33XXX", + "37050299": "COKSDE33XXX", + "37060120": "GENODED1PA7", + "37060193": "GENODED1PAX", + "37060194": "GENODED1PAX", + "37060590": "GENODED1SPK", + "37060993": "GENODEF1P13", + "37062124": "GENODED1BGL", + "37062365": "GENODED1FHH", + "37062600": "GENODED1PAF", + "37063367": "GENODED1FKH", + "37069101": "GENODED1AEG", + "37069103": "GENODED1ALD", + "37069125": "GENODED1RKO", + "37069153": "GENODED1HCK", + "37069164": "GENODED1MBU", + "37069252": "GENODED1ERE", + "37069302": "GENODED1GLK", + "37069303": "GENODED1GKK", + "37069306": "GENODED1GRB", + "37069322": "GENODED1EGY", + "37069330": "GENODED1HAW", + "37069331": "GENODED1KHO", + "37069342": "GENODED1HMB", + "37069354": "GENODED1SEG", + "37069355": "GENODED1AHO", + "37069381": "GENODED1IMM", + "37069401": "GENODED1JUK", + "37069405": "GENODED1KAA", + "37069412": "GENODED1HRB", + "37069427": "GENODED1DHK", + "37069429": "GENODED1KNL", + "37069472": "GENODED1ERF", + "37069520": "GENODED1RST", + "37069521": "GENODED1MNH", + "37069524": "GENODED1MUC", + "37069627": "GENODED1RBC", + "37069639": "GENODED1WND", + "37069642": "GENODED1SMR", + "37069707": "GENODED1SAM", + "37069720": "GENODED1SLE", + "37069805": "GENODED1WVI", + "37069833": "GENODED1WSL", + "37069840": "GENODED1WPF", + "37069991": "GENODED1BRL", + "37070000": "DEUTDEDK402", + "37070024": "DEUTDEDBKOE", + "37070060": "DEUTDEDKXXX", + "37070209": "DEUTDEDKP08", + "37070224": "DEUTDEDBP08", + "37080040": "DRESDEFF370", + "37080085": "DRESDEFFI51", + "37080086": "DRESDEFFI67", + "37080087": "DRESDEFFI96", + "37080088": "DRESDEFFI97", + "37080089": "DRESDEFFI98", + "37080090": "DRESDEFFJ01", + "37080091": "DRESDEFFJ02", + "37080092": "DRESDEFFJ03", + "37080093": "DRESDEFFJ04", + "37080094": "DRESDEFFJ05", + "37080095": "DRESDEFFJ06", + "37080096": "DRESDEFFXXX", + "37080097": "DRESDEFFXXX", + "37080098": "DRESDEFFJ07", + "37080099": "DRESDEFFI36", + "37089340": "DRESDEFFI04", + "37089342": "DRESDEFFI05", + "37160087": "GENODED1CGN", + "37161289": "GENODED1BRH", + "37540050": "COBADEFFXXX", + "37551020": "WELADED1LEI", + "37551440": "WELADEDLLEV", + "37551780": "WELADED1LAF", + "37570024": "DEUTDEDB375", + "37570064": "DEUTDEDK375", + "38010053": "PBNKDEFF380", + "38010700": "PBNKDEFFDSL", + "38010900": "DTABDED1XXX", + "38010999": "DTABDED1AUS", + "38011000": "VZVDDED1XXX", + "38011001": "VZVDDED1001", + "38011002": "VZVDDED1002", + "38011003": "VZVDDED1003", + "38011004": "VZVDDED1004", + "38011005": "VZVDDED1005", + "38011006": "VZVDDED1006", + "38011007": "VZVDDED1007", + "38011008": "VZVDDED1008", + "38020090": "HYVEDEMM402", + "38040007": "COBADEFFXXX", + "38050000": "COLSDE33BON", + "38051290": "WELADED1HON", + "38060186": "GENODED1BRS", + "38070024": "DEUTDEDB380", + "38070059": "DEUTDEDK380", + "38070408": "DEUTDEDKP38", + "38070424": "DEUTDEDBP38", + "38070724": "DEUTDEDBXXX", + "38077724": "DEUTDEDB383", + "38080055": "DRESDEFF380", + "38160220": "GENODED1HBO", + "38250110": "WELADED1EUS", + "38260082": "GENODED1EVB", + "38440016": "COBADEFFXXX", + "38450000": "WELADED1GMB", + "38452490": "WELADED1WIE", + "38462135": "GENODED1WIL", + "38470024": "DEUTDEDB384", + "38470091": "DEUTDEDW384", + "38621500": "GENODED1STB", + "38650000": "WELADED1SGB", + "38651390": "WELADED1HEN", + "39020000": "AABSDE31XXX", + "39040013": "COBADEFFXXX", + "39050000": "AACSDE33XXX", + "39060180": "GENODED1AAC", + "39061981": "GENODED1HNB", + "39070020": "DEUTDEDK390", + "39070024": "DEUTDEDB390", + "39070210": "DEUTDEDKP09", + "39070224": "DEUTDEDBP09", + "39080005": "DRESDEFF390", + "39080098": "DRESDEFFI37", + "39080099": "DRESDEFFI38", + "39160191": "GENODED1PA1", + "39161490": "GENODED1AAS", + "39162980": "GENODED1WUR", + "39362254": "GENODED1RSC", + "39540052": "COBADEFFXXX", + "39550110": "SDUEDE33XXX", + "39560201": "GENODED1DUE", + "39570024": "DEUTDEDB395", + "39570061": "DEUTDEDK395", + "39580041": "DRESDEFF395", + "40022000": "NRWBDEDMMST", + "40030000": "MLBKDEH1MUE", + "40040028": "COBADEFFXXX", + "40050000": "WELADE3MXXX", + "40050150": "WELADED1MST", + "40055555": "LBSWDE31XXX", + "40060000": "GENODEMSXXX", + "40060265": "GENODEM1DKM", + "40060560": "GENODEF1S08", + "40061238": "GENODEM1GRV", + "40069226": "GENODEM1CND", + "40069266": "GENODEM1MAS", + "40069283": "GENODEM1SLN", + "40069348": "GENODEM1MDB", + "40069362": "GENODEM1SAE", + "40069363": "GENODEM1SMB", + "40069371": "GENODEM1BTH", + "40069408": "GENODEM1BAU", + "40069477": "GENODEM1DWU", + "40069546": "GENODEM1SDN", + "40069600": "GENODEM1MAB", + "40069601": "GENODEM1CAN", + "40069606": "GENODEM1ERR", + "40069622": "GENODEM1LSP", + "40069709": "GENODEM1DLR", + "40069716": "GENODEM1SCN", + "40070024": "DEUTDEDB400", + "40070080": "DEUTDE3B400", + "40070211": "DEUTDE3BP10", + "40070224": "DEUTDEDBP10", + "40080040": "DRESDEFF400", + "40080085": "DRESDEFFI68", + "40090900": "GENODEF1P15", + "40150001": "WELADEDDXXX", + "40153768": "WELADED1EMS", + "40154006": "WELADED1GRO", + "40154476": "WELADED1LEN", + "40154530": "WELADE3WXXX", + "40154702": "WELADED1STL", + "40160050": "GENODEM1MSC", + "40163720": "GENODEM1SEE", + "40164024": "GENODEM1GRN", + "40164256": "GENODEM1LAE", + "40164352": "GENODEM1CNO", + "40164528": "GENODEM1LHN", + "40164618": "GENODEM1OTR", + "40164901": "GENODEM1GE1", + "40165366": "GENODEM1SEM", + "40166439": "GENODEM1LLE", + "40166800": "GENODEM1BUL", + "40340030": "COBADEFFXXX", + "40350005": "WELADED1RHN", + "40351060": "WELADED1STF", + "40351220": "WELADED1IBB", + "40361627": "GENODEM1WKP", + "40361906": "GENODEM1IBB", + "40363433": "GENODEM1HRL", + "40370024": "DEUTDEDB403", + "40370079": "DEUTDE3B403", + "41040018": "COBADEFFXXX", + "41041000": "COBADEFFXXX", + "41050095": "WELADED1HAM", + "41051605": "WELADED1WRN", + "41051845": "WELADED1BGK", + "41061011": "GENODEM1HBH", + "41061903": "GENODEM1BAG", + "41062215": "GENODEM1BO1", + "41070024": "DEUTDEDB410", + "41070049": "DEUTDEDE410", + "41240048": "COBADEFFXXX", + "41250035": "WELADED1BEK", + "41260006": "GENODEM1BEK", + "41261324": "GENODEM1EOW", + "41261419": "GENODEM1OEN", + "41262501": "GENODEM1AHL", + "41280043": "DRESDEFF413", + "41440018": "COBADEFFXXX", + "41450075": "WELADED1SOS", + "41451750": "WELADED1WRL", + "41460116": "GENODEM1SOE", + "41462295": "GENODEM1WRU", + "41650001": "WELADED1LIP", + "41651770": "WELADED1HSL", + "41651815": "WELADED1ERW", + "41651965": "WELADED1GES", + "41660124": "GENODEM1LPS", + "41661206": "GENODEM1ANR", + "41661504": "GENODEM1LBH", + "41661719": "GENODEM1BRI", + "41662465": "GENODEM1SGE", + "41662557": "GENODEM1WST", + "41663335": "GENODEM1HOE", + "41670024": "DEUTDEDB416", + "41670027": "DEUTDE3B416", + "41670028": "DEUTDE3B417", + "41670029": "DEUTDE3B414", + "41670030": "DEUTDE3B418", + "42030600": "ISBKDEFXGEL", + "42040040": "COBADEFFXXX", + "42050001": "WELADED1GEK", + "42070024": "DEUTDEDB420", + "42070062": "DEUTDEDE420", + "42080082": "DRESDEFF420", + "42260001": "GENODEM1GBU", + "42450040": "WELADED1GLA", + "42451220": "WELADED1BOT", + "42461435": "GENODEM1KIH", + "42640048": "COBADEFFXXX", + "42650150": "WELADED1REK", + "42651315": "WELADED1HAT", + "42661008": "GENODEM1MRL", + "42661088": "GENODEM1MRL", + "42661330": "GENODEM1HLT", + "42661717": "GENODEM1WLW", + "42662320": "GENODEM1DST", + "42680081": "DRESDEFF426", + "42840005": "COBADEFFXXX", + "42850035": "WELADED1BOH", + "42860003": "GENODEM1BOH", + "42861239": "GENODEM1RKN", + "42861387": "GENODEM1BOB", + "42861515": "GENODEM1BOG", + "42861608": "GENODEM1HEI", + "42861814": "GENODEM1RHD", + "42862451": "GENODEM1RAE", + "42870024": "DEUTDEDB428", + "42870077": "DEUTDE3B428", + "43000000": "MARKDEF1430", + "43040036": "COBADEFFXXX", + "43050001": "WELADED1BOC", + "43051040": "WELADED1HTG", + "43060129": "GENODEM1BOC", + "43060967": "GENODEM1GLS", + "43060988": "GENODEM1GLS", + "43070024": "DEUTDEDB430", + "43070061": "DEUTDEDE430", + "43080083": "DRESDEFF430", + "43250030": "WELADED1HRN", + "44000000": "MARKDEF1440", + "44010046": "PBNKDEFFXXX", + "44020090": "HYVEDEMM808", + "44040037": "COBADEFFXXX", + "44040060": "COBADEFFXXX", + "44040061": "COBADEFFXXX", + "44040085": "COBADEFFXXX", + "44050000": "WELADE3DXXX", + "44050199": "DORTDE33XXX", + "44060122": "GENODEM1DNW", + "44064406": "GENODED1KDD", + "44070024": "DEUTDEDB440", + "44070050": "DEUTDEDE440", + "44080050": "DRESDEFF440", + "44080055": "DRESDEFF446", + "44080057": "DRESDEFF447", + "44080085": "DRESDEFFI69", + "44089320": "DRESDEFFI18", + "44090920": "GENODEF1P04", + "44152370": "WELADED1LUN", + "44152490": "WELADED1SWT", + "44160014": "GENODEM1DOR", + "44340037": "COBADEFFXXX", + "44350060": "WELADED1UNN", + "44351380": "WELADED1KAM", + "44351740": "WELADED1FRN", + "44361342": "GENODEM1KWK", + "44540022": "COBADEFFXXX", + "44550045": "WELADED1ISL", + "44551210": "WELADED1HEM", + "44570004": "DEUTDEDW445", + "44570024": "DEUTDEDB445", + "44580070": "DRESDEFF445", + "44580085": "DRESDEFFI70", + "44761312": "GENODEM1MEN", + "44761534": "GENODEM1NRD", + "45000000": "MARKDEF1450", + "45040042": "COBADEFFXXX", + "45050001": "WELADE3HXXX", + "45051485": "WELADED1HER", + "45060009": "GENODEM1HGN", + "45061524": "GENODEM1HLH", + "45070002": "DEUTDEDW450", + "45070024": "DEUTDEDB450", + "45080060": "DRESDEFF450", + "45240056": "COBADEFFXXX", + "45250035": "WELADED1WTN", + "45251480": "WELADED1WET", + "45251515": "SPSHDE31XXX", + "45260041": "GENODEM1WTN", + "45260475": "GENODEM1BFG", + "45261547": "GENODEM1SPO", + "45450050": "WELADED1GEV", + "45451060": "WELADED1ENE", + "45451555": "WELADED1SLM", + "45660029": "GENODEM1ALA", + "45840026": "COBADEFFXXX", + "45841031": "COBADEFFXXX", + "45850005": "WELADED1LSD", + "45851020": "WELADED1PLB", + "45851665": "WELADED1KMZ", + "45860033": "GENODEM1LHA", + "45861434": "GENODEM1KIE", + "45861617": "GENODEM1MOM", + "46040033": "COBADEFFXXX", + "46050001": "WELADED1SIE", + "46051240": "WELADED1BUB", + "46051733": "WELADED1FRE", + "46051875": "WELADED1HIL", + "46052855": "WELADED1SMB", + "46053480": "WELADED1BEB", + "46060040": "GENODEM1SNS", + "46061724": "GENODEM1FRF", + "46062817": "GENODEM1SMA", + "46063405": "GENODEM1BB1", + "46070024": "DEUTDEDB460", + "46070090": "DEUTDEDK460", + "46080010": "DRESDEFF460", + "46240016": "COBADEFFXXX", + "46250049": "WELADED1OPE", + "46251590": "WELADED1FTR", + "46251630": "WELADED1ALK", + "46260023": "GENODEM1OLP", + "46261607": "GENODEM1GLG", + "46261822": "GENODEM1WDD", + "46262456": "GENODEM1HUL", + "46441003": "COBADEFFXXX", + "46451012": "WELADED1MES", + "46451250": "WELADED1BST", + "46461126": "GENODEM1SRL", + "46462271": "GENODEM1ANO", + "46464453": "GENODEM1RET", + "46640018": "COBADEFFXXX", + "46650005": "WELADED1ARN", + "46660022": "GENODEM1NEH", + "46670007": "DEUTDEDW466", + "46670024": "DEUTDEDB961", + "46670204": "DEUTDEDWP03", + "46670224": "DEUTDEDBP03", + "47000000": "MARKDEF1470", + "47240047": "COBADEFFXXX", + "47250101": "WELADED1PBN", + "47251550": "WELADED1HXB", + "47251740": "WELADED1DEL", + "47260121": "DGPBDE3MXXX", + "47260234": "GENODEM1EWB", + "47260307": "GENODEM1BKC", + "47261429": "GENODEM1WNH", + "47261603": "GENODEM1BUS", + "47262626": "GENODEM1WDE", + "47262703": "GENODEM1DLB", + "47264367": "GENODEM1STM", + "47265383": "GENODEM1WAH", + "47267216": "GENODEM1BOT", + "47270024": "DEUTDEDB472", + "47270029": "DEUTDE3B472", + "47460028": "GENODEM1WBG", + "47640051": "COBADEFFXXX", + "47650130": "WELADE3LXXX", + "47651225": "WELADED1BLO", + "47670023": "DEUTDE3B476", + "47670024": "DEUTDEDB476", + "47670205": "DEUTDE3BP04", + "47670224": "DEUTDEDBP04", + "47691200": "GENODEM1OLB", + "47840065": "COBADEFFXXX", + "47840080": "COBADEFFXXX", + "47850065": "WELADED1GTL", + "47852760": "WELADED1RTG", + "47853355": "WELADED1VSM", + "47853520": "WELADED1WDB", + "47860125": "GENODEM1GTL", + "47861317": "GENODEM1CLL", + "47861518": "GENODEM1HWI", + "47862261": "GENODEM1MFD", + "47862447": "GENODEM1RNE", + "47863373": "GENODEM1VMD", + "47880031": "DRESDEFF478", + "48000000": "MARKDEF1480", + "48020086": "HYVEDEMM344", + "48020151": "HAUKDEFFXXX", + "48021900": "DGPBDE3MBVW", + "48040035": "COBADEFFXXX", + "48040060": "COBADEFFXXX", + "48040061": "COBADEFFXXX", + "48050161": "SPBIDE3BXXX", + "48051580": "WELADED1HAW", + "48060036": "GENODEM1BIE", + "48062051": "GENODEM1HLW", + "48062466": "GENODEM1SHS", + "48070020": "DEUTDE3BXXX", + "48070024": "DEUTDEDBBIE", + "48070040": "DEUTDE3B480", + "48070042": "DEUTDE3B484", + "48070043": "DEUTDE3B489", + "48070044": "DEUTDE3B487", + "48070045": "DEUTDE3B413", + "48070050": "DEUTDE3B481", + "48070052": "DEUTDE3B492", + "48080020": "DRESDEFF480", + "48089350": "DRESDEFFI19", + "48250110": "WELADED1LEM", + "48291490": "GENODEM1BSU", + "49040043": "COBADEFFXXX", + "49050101": "WELADED1MIN", + "49051065": "WELADED1RHD", + "49051285": "WELADED1OEH", + "49051990": "WELADED1PWF", + "49060127": "GENODEM1MPW", + "49060392": "GENODEM1MND", + "49061470": "GENODEM1STR", + "49061510": "GENODEM1EPW", + "49070024": "DEUTDEDB490", + "49070028": "DEUTDE3B490", + "49080025": "DRESDEFF491", + "49092650": "GENODEM1LUB", + "49240096": "COBADEFFXXX", + "49262364": "GENODEM1SNA", + "49440043": "COBADEFFXXX", + "49450120": "WLAHDE44XXX", + "49490070": "GENODEM1HFV", + "50000000": "MARKDEF1500", + "50010060": "PBNKDEFFXXX", + "50010200": "AKBKDEFFXXX", + "50010300": "FCBKDEFFXXX", + "50010424": "AARBDE5W500", + "50010517": "INGDDEFFXXX", + "50010700": "DEGUDEFFXXX", + "50010900": "BOFADEFXXXX", + "50010910": "BOFADEFXVAM", + "50012800": "ALTEDEFAXXX", + "50015001": "JTBPDEFFXXX", + "50016600": "WUIDDEF1XXX", + "50020200": "BHFBDEFF500", + "50020400": "KFWIDEFFXXX", + "50020500": "LAREDEFFXXX", + "50020700": "FBHLDEFFXXX", + "50020800": "BCITDEFFXXX", + "50021000": "INGBDEFFXXX", + "50021100": "FFBKDEFFKRN", + "50021120": "FFBKDEFFTHK", + "50022200": "HCSEDEF1XXX", + "50024024": "DEFFDEFFXXX", + "50025000": "GMGGDE51XXX", + "50026600": "CARDDEFFXXX", + "50030000": "PSADDEF1XXX", + "50030010": "BPNDDE52XXX", + "50030500": "PARBDEFFXXX", + "50030600": "DWPBDEFFXXX", + "50030700": "ESBKDEFFXXX", + "50031000": "TRODDEF1XXX", + "50031900": "BBVADEFFXXX", + "50033300": "SCFBDE33XXX", + "50034200": "OPENDEFFXXX", + "50038800": "ABOCDEFFXXX", + "50040000": "COBADEFFXXX", + "50040005": "COBADEFFXXX", + "50040010": "COBADEFFPAR", + "50040011": "COBADEFFVIE", + "50040012": "COBADEFFMIL", + "50040013": "COBADEFFAMS", + "50040014": "COBADEFFBRU", + "50040015": "COBADEFFMAD", + "50040016": "COBADEFFNYC", + "50040017": "COBADEFFSGP", + "50040018": "COBADEFFLDN", + "50040019": "COBADEFFZUR", + "50040020": "COBADEFFPRA", + "50040021": "COBADEFFMOS", + "50040022": "COBADEFFHBG", + "50040033": "COBADEF1BRS", + "50040038": "COBADEFFXXX", + "50040040": "COBADEFFXXX", + "50040048": "COBADEFFXXX", + "50040050": "COBADEFFXXX", + "50040051": "COBADEFFXXX", + "50040052": "COBADEFFXXX", + "50040060": "COBADEFFXXX", + "50040061": "COBADEFFXXX", + "50040062": "COBADEFFXXX", + "50040063": "COBADEFFXXX", + "50040075": "COBADEFFXXX", + "50040084": "COBADEFFXXX", + "50040085": "COBADEFFXXX", + "50040086": "COBADEFFXXX", + "50040087": "COBADEFFXXX", + "50040088": "COBADEFFXXX", + "50040099": "COBADEFFXXX", + "50042500": "COBADEFFXXX", + "50044444": "COBADEFFXXX", + "50047010": "COBADEFFXXX", + "50050000": "HELADEFFXXX", + "50050201": "HELADEF1822", + "50050222": "HELADEF1822", + "50050999": "DGZFDEFFXXX", + "50060000": "GENODE55XXX", + "50060400": "GENODEFFXXX", + "50060412": "GENODEF1VK1", + "50060413": "GENODEF1VK2", + "50060414": "GENODEF1VK3", + "50060415": "GENODEF1VK4", + "50060416": "GENODEF1VK6", + "50060417": "GENODEF1VK7", + "50060418": "GENODEF1VK8", + "50060419": "GENODEF1VK9", + "50060420": "GENODEF1V20", + "50060421": "GENODEF1V21", + "50060422": "GENODEF1V22", + "50060423": "GENODEF1V23", + "50060424": "GENODEF1V24", + "50060425": "GENODEF1V25", + "50060474": "GENODEFFBRO", + "50061741": "GENODE51OBU", + "50069126": "GENODE51ABO", + "50069146": "GENODE51GRC", + "50069187": "GENODE51EGE", + "50069241": "GENODE51ERB", + "50069345": "GENODE51GWB", + "50069455": "GENODE51HUT", + "50069477": "GENODE51KIF", + "50069693": "GENODE51BH1", + "50069842": "GENODE51SWB", + "50069976": "GENODE51WWI", + "50070010": "DEUTDEFFXXX", + "50070011": "DEUTDEFFSIP", + "50070024": "DEUTDEDBFRA", + "50070050": "DEUTDEFFXXX", + "50070051": "DEUTDEFFXXX", + "50070052": "DEUTDEFFXXX", + "50070053": "DEUTDEFFXXX", + "50070054": "DEUTDEFFXXX", + "50070055": "DEUTDEFFXXX", + "50070056": "DEUTDEFFXXX", + "50070057": "DEUTDEFFXXX", + "50070058": "DEUTDEFFXXX", + "50070059": "DEUTDEFFXXX", + "50070060": "DEUTDEFFXXX", + "50070061": "DEUTDEFFXXX", + "50070062": "DEUTDEFFXXX", + "50070063": "DEUTDEFFXXX", + "50070064": "DEUTDEFFXXX", + "50070065": "DEUTDEFFXXX", + "50070324": "DEUTDEDBP25", + "50070371": "DEUTDEFFS25", + "50070435": "DEUTDEDBEW1", + "50070436": "DEUTDEDBEW2", + "50070437": "DEUTDEDBEW3", + "50070438": "DEUTDEDBEW4", + "50070439": "DEUTDEDBEW5", + "50073019": "DEUTDEFF502", + "50073024": "DEUTDEDB502", + "50073081": "DEUTDE5XXXX", + "50080000": "DRESDEFFXXX", + "50080015": "DRESDEFFI39", + "50080025": "DRESDEFFXXX", + "50080035": "DRESDEFFI40", + "50080055": "DRESDEFF516", + "50080057": "DRESDEFF522", + "50080060": "DRESDEFFXXX", + "50080061": "DRESDEFFLDG", + "50080077": "DRESDEFFBSP", + "50080079": "DRESDEFFXXX", + "50080080": "DRESDEFFI41", + "50080082": "DRESDEFFAVB", + "50080086": "DRESDEFFI49", + "50080087": "DRESDEFFJ08", + "50080088": "DRESDEFFJ09", + "50080089": "DRESDEFFJ10", + "50080091": "DRESDEFFJ11", + "50080092": "DRESDEFFFCO", + "50080099": "DRESDEFFI42", + "50080300": "DRESDEFF500", + "50083007": "DRESDEFF502", + "50083838": "DRESDEFFMBP", + "50089400": "DRESDEFFI01", + "50090500": "GENODEF1S12", + "50090900": "GENODEF1P06", + "50092100": "GENODE51BH2", + "50092200": "GENODE51KEL", + "50092900": "GENODE51USI", + "50093000": "GENODE51RUS", + "50093010": "GENODE51GAA", + "50093400": "GENODE51KBH", + "50110200": "ICBKDEFFXXX", + "50110400": "AUSKDEFFXXX", + "50110500": "NATXDEFFXXX", + "50110636": "SCBLDEFXXXX", + "50110700": "FBGADEF1XXX", + "50110800": "CHASDEFXXXX", + "50110801": "CHASDEFXVR1", + "50110808": "CHASDEF2XXX", + "50110855": "JPMGDEFFXXX", + "50110900": "MNBIDEF1XXX", + "50120100": "ICICDEFFXXX", + "50120383": "DELBDE33XXX", + "50120600": "COMMDEFFXXX", + "50120800": "BMPBDEF2XXX", + "50120900": "TVBADEFFXXX", + "50127000": "BPKODEFFXXX", + "50127700": "PAYODEF2XXX", + "50130000": "NBPADEFFXXX", + "50130400": "MEFIDEMM501", + "50130600": "UBSWDEFFXXX", + "50131000": "ICBVDEFFXXX", + "50131700": "KODBDEFFXXX", + "50190000": "FFVBDEFFXXX", + "50190300": "GENODE51FHC", + "50190400": "GENODE51FGH", + "50210200": "RABODEFFTAR", + "50210295": "RABODEFFXXX", + "50210800": "PRCBDEFFXXX", + "50210900": "CITIDEFFXXX", + "50220085": "SMHBDEFFXXX", + "50220101": "INVODEF2XXX", + "50220300": "HVBKDEFFXXX", + "50220500": "BOFSDEF1XXX", + "50220707": "CAIXDEFFXXX", + "50220900": "HAUKDEFFXXX", + "50228899": "EFIBDEFFXXX", + "50230000": "ABCADEFFXXX", + "50230600": "ISBKDEFXXXX", + "50230700": "METZDEFFXXX", + "50230800": "PLFGDE5AXXX", + "50230888": "PLFGDE5AIKB", + "50234500": "KTAGDEFFXXX", + "50250200": "DLFGDE51XXX", + "50310400": "BARCDEFFXXX", + "50310900": "PCBCDEFFXXX", + "50320000": "OWHBDEFFXXX", + "50320191": "HYVEDEMM430", + "50320500": "BSCHDEFFXXX", + "50320600": "BCMADEFFXXX", + "50320900": "PICTDEFFXXX", + "50324000": "FTSBDEFAXXX", + "50330000": "SBINDEFFXXX", + "50330200": "MHBFDEFFXXX", + "50330201": "RAISDEFFXXX", + "50330300": "IRVTDEFXXXX", + "50330500": "BCDMDEF1XXX", + "50330600": "SEPBDEFFXXX", + "50334400": "BNYMDEF1XXX", + "50339900": "PANXDEF2XXX", + "50400000": "MARKDEFFXXX", + "50510300": "SMBCDEFFXXX", + "50520190": "HYVEDEMM467", + "50530000": "GENODE51CRO", + "50540028": "COBADEFFXXX", + "50550020": "HELADEF1OFF", + "50560102": "GENODE51OF2", + "50561315": "GENODE51OBH", + "50570018": "DEUTDEFF505", + "50570024": "DEUTDEDB505", + "50580005": "DRESDEFF505", + "50580085": "DRESDEFFJ12", + "50590000": "GENODE51OF1", + "50592200": "GENODE51DRE", + "50640015": "COBADEFFXXX", + "50650023": "HELADEF1HAN", + "50652124": "HELADEF1SLS", + "50661639": "GENODEF1LSR", + "50661816": "GENODE51NIH", + "50662299": "GENODEF1BKO", + "50662669": "RBMFDEF1XXX", + "50663699": "GENODEF1RDB", + "50670009": "DEUTDEFF506", + "50670024": "DEUTDEDB506", + "50680002": "DRESDEFF506", + "50680085": "DRESDEFFJ13", + "50690000": "GENODEF1HUV", + "50691300": "DZBMDEF1XXX", + "50692100": "GENODE51SEL", + "50740048": "COBADEFFXXX", + "50750094": "HELADEF1GEL", + "50761333": "GENODE51BUE", + "50763319": "GENODEF1BIR", + "50780006": "DRESDEFF524", + "50790000": "GENODE51GEL", + "50793300": "GENODE51BIV", + "50794300": "GENODE51WBH", + "50810900": "BBSPDE6KXXX", + "50820292": "HYVEDEMM487", + "50835800": "MKGMDE51XXX", + "50840005": "COBADEFFXXX", + "50850049": "HELADEFF508", + "50850150": "HELADEF1DAS", + "50851952": "HELADEF1ERB", + "50852553": "HELADEF1GRG", + "50852651": "HELADEF1DIE", + "50861393": "GENODE51BKZ", + "50861501": "GENODE51ABH", + "50862311": "GENODE51WGH", + "50862408": "GENODE51GRI", + "50862703": "GENODE51REI", + "50862835": "GENODE51SHM", + "50862903": "GENODE51GIN", + "50863513": "GENODE51MIC", + "50865224": "GENODE51MWA", + "50865503": "GENODE51EPT", + "50870005": "DEUTDEFF508", + "50870024": "DEUTDEDB508", + "50870324": "DEUTDEDBP26", + "50870393": "DEUTDEFFS26", + "50880050": "DRESDEFF508", + "50880085": "DRESDEFFJ14", + "50880086": "DRESDEFFJ15", + "50890000": "GENODEF1VBD", + "50950068": "HELADEF1BEN", + "50951469": "HELADEF1HEP", + "50961206": "GENODE51RBU", + "50961592": "GENODE51FHO", + "50961685": "GENODE51ABT", + "50970004": "DEUTDEFF509", + "50970024": "DEUTDEDB509", + "51010400": "AARBDE5WXXX", + "51020000": "BHFBDEFF510", + "51020186": "HYVEDEMM478", + "51040038": "COBADEFFXXX", + "51050015": "NASSDE55XXX", + "51051000": "PULSDE5WXXX", + "51070021": "DEUTDEFF510", + "51070024": "DEUTDEDB510", + "51080060": "DRESDEFF510", + "51080085": "DRESDEFFJ16", + "51080086": "DRESDEFFJ17", + "51089410": "DRESDEFFI20", + "51090000": "WIBADE5WXXX", + "51091500": "GENODE51RGG", + "51091501": "GENODE51RGG", + "51140029": "COBADEFFXXX", + "51150018": "HELADEF1LIM", + "51151919": "HELADEF1WEI", + "51161606": "GENODE51LDD", + "51170010": "DEUTDEFF511", + "51170024": "DEUTDEDB511", + "51180041": "DRESDEFF511", + "51190000": "GENODE51LIM", + "51191800": "GENODE51SBH", + "51192200": "GENODE51WEM", + "51210600": "BNPADEFFXXX", + "51210606": "BNPADEFFXXX", + "51210699": "BNPADEFFXXX", + "51210700": "NZFMDEF1XXX", + "51210800": "SOGEDEFFXXX", + "51210801": "SGSSDEFFXXX", + "51210802": "SOGEDEFFXXX", + "51210803": "SOGEDEFFXXX", + "51211000": "NATXDEFPXXX", + "51220200": "ESSEDEFFXXX", + "51220400": "SIHRDEH1FFM", + "51220700": "TCZBDEFFXXX", + "51220800": "BRASDEFFXXX", + "51220900": "MSFFDEFXXXX", + "51220910": "MSFFDEFXCND", + "51230500": "SCBLDEFXXXX", + "51230502": "SCBLDEFXXXX", + "51230555": "PLFGDE5AIKB", + "51250000": "HELADEF1TSK", + "51340013": "COBADEFFXXX", + "51343224": "COBADEFFXXX", + "51350025": "SKGIDE5FXXX", + "51351526": "HELADEF1GRU", + "51352227": "HELADEF1LAU", + "51361021": "GENODE51HHE", + "51370008": "DEUTDEFF513", + "51370024": "DEUTDEDB513", + "51380040": "DRESDEFF513", + "51380085": "DRESDEFFJ18", + "51390000": "VBMHDE5FXXX", + "51410700": "BKCHDEFFXXX", + "51410800": "BOURDEFFXXX", + "51420200": "MIBEDEFFXXX", + "51420300": "BAERDEF1XXX", + "51430400": "GOLDDEFFXXX", + "51430410": "GOLDDEFBXXX", + "51432100": "SABCDEFFXXX", + "51540037": "COBADEFFXXX", + "51550035": "HELADEF1WET", + "51570008": "DEUTDEFF515", + "51570024": "DEUTDEDB515", + "51580044": "DRESDEFF515", + "51591300": "GENODE51WBO", + "51640043": "COBADEFFXXX", + "51650045": "HELADEF1DIL", + "51690000": "GENODE51DIL", + "51691500": "GENODE51HER", + "51752267": "HELADEF1BAT", + "51762434": "GENODE51BIK", + "51850079": "HELADEF1FRI", + "51861325": "GENODEF1BVB", + "51861403": "GENODE51BUT", + "51861616": "GENODE51REW", + "51861806": "GENODE51OBM", + "51961023": "GENODE51ULR", + "51961515": "GENODE51HSH", + "51961801": "GENODE51FEL", + "51990000": "GENODE51LB1", + "52040021": "COBADEFFXXX", + "52050000": "HELADEFF520", + "52050353": "HELADEF1KAS", + "52051373": "HELADEF1BOR", + "52051555": "HELADEF1FEL", + "52051877": "HELADEF1GRE", + "52052154": "HELADEF1MEG", + "52053458": "HELADEF1SWA", + "52060000": "GENODEFF520", + "52060208": "GENODEF1KS2", + "52060410": "GENODEF1EK1", + "52060420": "GENODEF1EK1", + "52061303": "GENODEF1BOR", + "52062200": "GENODEF1GUB", + "52062601": "GENODEF1HRV", + "52063369": "GENODEF1SPB", + "52063550": "GENODEF1WOH", + "52064156": "GENODEF1BTA", + "52069013": "GENODEF1BHN", + "52069029": "GENODEF1GMD", + "52069065": "GENODEF1BUR", + "52069149": "GENODEF1VLM", + "52069519": "GENODEF1FBK", + "52070012": "DEUTDEFF520", + "52070024": "DEUTDEDB520", + "52071212": "DEUTDEFF521", + "52071224": "DEUTDEDB521", + "52080080": "DRESDEFF520", + "52080085": "DRESDEFFJ19", + "52090000": "GENODE51KS1", + "52240006": "COBADEFFXXX", + "52250030": "HELADEF1ESW", + "52260385": "GENODEF1ESW", + "52270012": "DEUTDEFF522", + "52270024": "DEUTDEDB522", + "52350005": "HELADEF1KOR", + "52360059": "GENODEF1KBW", + "52410300": "RBAGDEF1XXX", + "52410310": "RBAGDEF1CMI", + "52410400": "KOEXDEFAXXX", + "52411000": "RBAGDEF1CMI", + "52411010": "RBAGDEF1CMI", + "52420000": "BSUIDEFFXXX", + "52420300": "SHBKDEFFXXX", + "52420600": "ABGRDEFFXXX", + "52420700": "SECGDEFFXXX", + "52430000": "CMCIDEF1XXX", + "53040012": "COBADEFFXXX", + "53050180": "HELADEF1FDS", + "53051396": "HELADEF1SLU", + "53060180": "GENODE51FUL", + "53061230": "GENODEF1HUE", + "53061313": "GENODE51SLU", + "53062035": "GENODEF1GLU", + "53062350": "GENODEF1PBG", + "53064023": "GENODEF1FLN", + "53070007": "DEUTDEFF530", + "53070024": "DEUTDEDB530", + "53070324": "DEUTDEDBP27", + "53070394": "DEUTDEFFS27", + "53080030": "DRESDEFF530", + "53093200": "GENODE51ALS", + "53093255": "GENODE51AGR", + "53240048": "COBADEFFXXX", + "53250000": "HELADEF1HER", + "53260145": "GENODEF1HFA", + "53261202": "GENODEF1BEB", + "53261342": "GENODEF1RAW", + "53262073": "GENODEF1HNT", + "53262455": "GENODEF1ROH", + "53270012": "DEUTDEFF532", + "53270024": "DEUTDEDB518", + "53280081": "DRESDEFF532", + "53290000": "GENODE51BHE", + "53340024": "COBADEFFXXX", + "53350000": "HELADEF1MAR", + "53370008": "DEUTDEFF533", + "53370024": "DEUTDEDB533", + "53380042": "DRESDEFF533", + "53381843": "DRESDEFF568", + "54020090": "HYVEDEMM482", + "54030011": "SCRUDE51XXX", + "54040042": "COBADEFFXXX", + "54050110": "MALADE51KLS", + "54050220": "MALADE51KLK", + "54051550": "MALADE51KUS", + "54051660": "MALADE51LAS", + "54051990": "MALADE51ROK", + "54061650": "GENODE61LAN", + "54062027": "GENODE61ALB", + "54070024": "DEUTDEDB540", + "54070092": "DEUTDESM540", + "54080021": "DRESDEFF540", + "54090000": "GENODE61KL1", + "54091700": "GENODE61LEK", + "54091800": "GENODE61OB1", + "54092400": "GENODE61GLM", + "54220091": "HYVEDEMM485", + "54240032": "COBADEFFXXX", + "54250010": "MALADE51SWP", + "54261700": "GENODE61ROA", + "54270024": "DEUTDEDB542", + "54270096": "DEUTDESM542", + "54280023": "DRESDEFF542", + "54291200": "GENODE61DAH", + "54500000": "MARKDEF1545", + "54510067": "PBNKDEFFXXX", + "54520194": "HYVEDEMM483", + "54540033": "COBADEFFXXX", + "54550010": "LUHSDE6AXXX", + "54550120": "MALADE51LUH", + "54561310": "GENODE61LBS", + "54570024": "DEUTDEDB545", + "54570094": "DEUTDESM545", + "54580020": "DRESDEFF545", + "54620093": "HYVEDEMM620", + "54640035": "COBADEFFXXX", + "54651240": "MALADE51DKH", + "54661800": "GENODE61FSH", + "54663270": "GENODE61FHR", + "54670024": "DEUTDEDB546", + "54670095": "DEUTDESM546", + "54680022": "DRESDEFF546", + "54691200": "GENODE61DUW", + "54750010": "MALADE51SPY", + "54790000": "GENODE61SPE", + "54850010": "SOLADES1SUW", + "54851440": "MALADE51KAD", + "54861190": "GENODE61EDH", + "54862390": "GENODE61HXH", + "54862500": "GENODE61SUW", + "54891300": "GENODE61BZA", + "55000000": "MARKDEF1550", + "55010400": "AARBDE5WDOM", + "55010424": "AARBDE5W550", + "55010625": "AARBDE5WCLE", + "55010800": "ISBRDE55XXX", + "55020000": "BHFBDEFF550", + "55020100": "BKMZDE51XXX", + "55020486": "HYVEDEMM486", + "55020500": "BFSWDE33MNZ", + "55020555": "BFSWDE33MNZ", + "55020600": "IMMODE5MXXX", + "55020700": "SUFGDE51XXX", + "55030500": "CPLADE55XXX", + "55033300": "SCFBDE33XXX", + "55040022": "COBADEFFXXX", + "55040060": "COBADEFFXXX", + "55040061": "COBADEFFXXX", + "55050000": "SOLADEST550", + "55050120": "MALADE51MNZ", + "55060321": "GENODE51MZ4", + "55060417": "GENODE51MZ2", + "55060611": "GENODE51MZ6", + "55061303": "GENODE51BUD", + "55061507": "GENODE51HDS", + "55061907": "GENODE51NIS", + "55070024": "DEUTDEDBMAI", + "55070040": "DEUTDE5MXXX", + "55070324": "DEUTDEDBP29", + "55070396": "DEUTDE5MP29", + "55080044": "COBADEFFXXX", + "55080065": "DRESDEFF550", + "55080085": "DRESDEFFJ20", + "55080086": "DRESDEFFJ21", + "55080088": "DRESDEFF555", + "55090500": "GENODEF1S01", + "55091200": "GENODE61AZY", + "55150098": "MALADE51EMZ", + "55160195": "GENODED1PA4", + "55190000": "MVBMDE55XXX", + "55340041": "COBADEFFXXX", + "55350010": "MALADE51WOR", + "55361202": "GENODE51AHM", + "55362071": "GENODE51BEC", + "55390000": "GENODE61WO1", + "56020086": "HYVEDEMM515", + "56050180": "MALADE51KRE", + "56051790": "MALADE51SIM", + "56061151": "GENODED1KSL", + "56061472": "GENODED1KHK", + "56062227": "GENODED1RBO", + "56070024": "DEUTDEDB560", + "56070040": "DEUTDE5M560", + "56090000": "GENODE51KRE", + "56240050": "COBADEFFXXX", + "56250030": "BILADE55XXX", + "56261735": "GENODED1FIN", + "56270024": "DEUTDEDB562", + "56270044": "DEUTDE5M562", + "57000000": "MARKDEF1570", + "57020086": "HYVEDEMM401", + "57020301": "MKBKDE51XXX", + "57020500": "OYAKDE5KXXX", + "57020600": "DEBKDE51XXX", + "57040044": "COBADEFFXXX", + "57050120": "MALADE51KOB", + "57051001": "MALADE51BMB", + "57051870": "MALADE51COC", + "57060000": "GENODEDD570", + "57062675": "GENODE51NWA", + "57064221": "GENODED1MKA", + "57069067": "GENODED1LUH", + "57069081": "GENODED1MOK", + "57069144": "GENODED1KAI", + "57069238": "GENODED1ASN", + "57069257": "GENODED1UMO", + "57069315": "GENODED1SRH", + "57069361": "GENODED1WLG", + "57069727": "GENODED1IRR", + "57069806": "GENODED1MBA", + "57070024": "DEUTDEDB570", + "57070045": "DEUTDE5M570", + "57070324": "DEUTDEDBP28", + "57070395": "DEUTDE5MP28", + "57080070": "DRESDEFF570", + "57090000": "GENODE51KOB", + "57090010": "GENODE51KOB", + "57090900": "GENODEF1P12", + "57091000": "GENODE51MON", + "57092800": "GENODE51DIE", + "57263015": "GENODE51ARZ", + "57351030": "MALADE51AKI", + "57361476": "GENODED1GBS", + "57363243": "GENODED1NFB", + "57391200": "GENODE51DAA", + "57391500": "GENODE51HAM", + "57391800": "GENODE51WW1", + "57450120": "MALADE51NWD", + "57460117": "GENODED1NWD", + "57461759": "GENODED1MRW", + "57470024": "DEUTDEDB574", + "57470047": "DEUTDE5M574", + "57650010": "MALADE51MYN", + "57661253": "GENODED1KEH", + "57662263": "GENODED1MPO", + "57751310": "MALADE51AHR", + "57761591": "GENODED1BNA", + "57761599": "GENODED1BNA", + "57762265": "GENODED1GRO", + "58520086": "HYVEDEMM437", + "58540035": "COBADEFFXXX", + "58550130": "TRISDE55XXX", + "58560103": "GENODED1TVB", + "58560294": "GENODED1PA3", + "58561626": "GENODED1SRB", + "58561771": "GENODED1MLW", + "58564788": "GENODED1HWM", + "58570024": "DEUTDEDB585", + "58570048": "DEUTDE5M585", + "58580074": "DRESDEFF585", + "58590900": "GENODEF1P21", + "58650030": "MALADE51BIT", + "58651240": "MALADE51DAU", + "58660101": "GENODED1BIT", + "58661901": "GENODED1WSC", + "58662653": "GENODED1OSE", + "58691500": "GENODED1PRU", + "58751230": "MALADE51BKS", + "58760954": "GENODED1WTL", + "58761343": "GENODED1BPU", + "58771224": "DEUTDEDB587", + "58771242": "DEUTDE5M587", + "59000000": "MARKDEF1590", + "59010011": "PBNKDEFF011", + "59010012": "PBNKDEFF012", + "59010013": "PBNKDEFF013", + "59010014": "PBNKDEFF014", + "59010015": "PBNKDEFF015", + "59010016": "PBNKDEFF016", + "59010017": "PBNKDEFF017", + "59010018": "PBNKDEFF018", + "59010019": "PBNKDEFF019", + "59010021": "PBNKDEFF021", + "59010022": "PBNKDEFF022", + "59010023": "PBNKDEFF023", + "59010024": "PBNKDEFF024", + "59010025": "PBNKDEFF025", + "59010026": "PBNKDEFF026", + "59010027": "PBNKDEFF027", + "59010028": "PBNKDEFF028", + "59010029": "PBNKDEFF029", + "59010031": "PBNKDEFF031", + "59010032": "PBNKDEFF032", + "59010033": "PBNKDEFF033", + "59010034": "PBNKDEFF034", + "59010035": "PBNKDEFF035", + "59010036": "PBNKDEFF036", + "59010037": "PBNKDEFF037", + "59010038": "PBNKDEFF038", + "59010039": "PBNKDEFF039", + "59010040": "PBNKDEFF040", + "59010041": "PBNKDEFF041", + "59010042": "PBNKDEFF042", + "59010044": "PBNKDEFF044", + "59010045": "PBNKDEFF045", + "59010047": "PBNKDEFF047", + "59010048": "PBNKDEFF048", + "59010049": "PBNKDEFF049", + "59010051": "PBNKDEFF051", + "59010052": "PBNKDEFF052", + "59010053": "PBNKDEFF053", + "59010054": "PBNKDEFF054", + "59010055": "PBNKDEFF055", + "59010056": "PBNKDEFF056", + "59010057": "PBNKDEFF057", + "59010058": "PBNKDEFF058", + "59010059": "PBNKDEFF059", + "59010061": "PBNKDEFF061", + "59010062": "PBNKDEFF062", + "59010063": "PBNKDEFF063", + "59010064": "PBNKDEFF064", + "59010065": "PBNKDEFF065", + "59010066": "PBNKDEFFXXX", + "59010068": "PBNKDEFF068", + "59010069": "PBNKDEFF069", + "59010071": "PBNKDEFF071", + "59010072": "PBNKDEFF072", + "59010073": "PBNKDEFF073", + "59010074": "PBNKDEFF074", + "59010400": "SIKBDE55XXX", + "59020090": "HYVEDEMM432", + "59020400": "MEGHDE81XXX", + "59040000": "COBADEFFXXX", + "59050000": "SALADE55XXX", + "59050101": "SAKSDE55XXX", + "59051090": "SALADE51VKS", + "59070000": "DEUTDE5M555", + "59070070": "DEUTDEDB595", + "59080090": "DRESDEFF590", + "59090900": "GENODEF1P19", + "59092000": "GENODE51SB2", + "59099550": "GENODE51NOH", + "59190000": "SABADE5SXXX", + "59190200": "GENODE51SLS", + "59251020": "SALADE51WND", + "59252046": "SALADE51NKS", + "59291000": "GENODE51WEN", + "59291200": "GENODE51BEX", + "59320087": "HYVEDEMM838", + "59350110": "KRSADE55XXX", + "59351040": "MERZDE55XXX", + "59390100": "GENODE51SLF", + "59391200": "GENODE51UBH", + "59392000": "GENODE51DSA", + "59392200": "GENODE51LOS", + "59393000": "GENODE51LEB", + "59450010": "SALADE51HOM", + "59491300": "GENODE51MBT", + "60000000": "MARKDEF1600", + "60010070": "PBNKDEFFXXX", + "60010424": "AARBDE5W600", + "60010700": "LKBWDE6K600", + "60020030": "SOLADEST601", + "60020100": "SCHWDESSXXX", + "60020290": "HYVEDEMM473", + "60030000": "MEBEDE6SDCB", + "60030100": "BHBADES1XXX", + "60030200": "ELGEDES1XXX", + "60030600": "CPLUDES1XXX", + "60030666": "CPLUDES1666", + "60030700": "AKBADES1XXX", + "60030900": "ISBKDEFXSTU", + "60031000": "TRUFDE66XXX", + "60033000": "BSWLDE61XXX", + "60035810": "IBKBDES1XXX", + "60040060": "COBADEFFXXX", + "60040061": "COBADEFFXXX", + "60040071": "COBADEFFXXX", + "60040075": "COBADEFFXXX", + "60050000": "SOLADESTXXX", + "60050101": "SOLADEST600", + "60060000": "GENODESGXXX", + "60060202": "GENODESTXXX", + "60060396": "GENODES1UTV", + "60062775": "GENODES1ECH", + "60062909": "GENODES1MCH", + "60069017": "GENODES1DMS", + "60069066": "GENODES1RBA", + "60069075": "GENODES1RVG", + "60069147": "GENODES1RSF", + "60069158": "GENODES1SAA", + "60069206": "GENODES1AID", + "60069224": "GENODES1GWS", + "60069239": "GENODES1BPF", + "60069242": "GENODES1RGR", + "60069245": "GENODES1RVG", + "60069251": "GENODES1RDI", + "60069302": "GENODES1ERM", + "60069303": "GENODES1RBS", + "60069308": "GENODES1RIN", + "60069315": "GENODES1MDH", + "60069336": "GENODES1RMA", + "60069346": "GENODES1REH", + "60069350": "GENODES1RRG", + "60069355": "GENODES1EHN", + "60069378": "GENODES1DEH", + "60069387": "GENODES1DBE", + "60069417": "GENODES1KIB", + "60069419": "GENODES1UHL", + "60069442": "GENODES1RFS", + "60069455": "GENODES1RVS", + "60069457": "GENODES1OTT", + "60069462": "GENODES1WBB", + "60069463": "GENODES1RKH", + "60069476": "GENODES1DEA", + "60069485": "GENODES1ROW", + "60069505": "GENODES1VMT", + "60069517": "GENODES1SCA", + "60069527": "GENODES1RNS", + "60069538": "GENODES1LOC", + "60069544": "GENODES1RWN", + "60069545": "GENODES1NUF", + "60069553": "GENODES1HAR", + "60069564": "GENODES1RVA", + "60069595": "GENODES1SBB", + "60069639": "GENODES1RIH", + "60069669": "GENODES1EHB", + "60069673": "GENODES1ABR", + "60069680": "GENODES1BRZ", + "60069685": "GENODES1RWA", + "60069705": "GENODES1SLA", + "60069706": "GENODES1MEH", + "60069710": "GENODES1RGF", + "60069714": "GENODES1IBR", + "60069727": "GENODES1ROF", + "60069738": "GENODES1FAN", + "60069766": "GENODES1BBO", + "60069795": "GENODES1HHB", + "60069798": "GENODES1RHB", + "60069817": "GENODES1RMO", + "60069832": "GENODES1URB", + "60069842": "GENODES1DHB", + "60069858": "GENODES1VAI", + "60069860": "GENODES1FED", + "60069876": "GENODES1ROG", + "60069896": "GENODES1PLE", + "60069904": "GENODES1RUW", + "60069905": "GENODES1REM", + "60069911": "GENODES1ERL", + "60069926": "GENODES1VBG", + "60069927": "GENODES1BHB", + "60069931": "GENODES1BGH", + "60069950": "GENODES1TUN", + "60069976": "GENODES1BOE", + "60070024": "DEUTDEDBSTG", + "60070070": "DEUTDESSXXX", + "60070214": "DEUTDESSP13", + "60070224": "DEUTDEDBP13", + "60080000": "DRESDEFF600", + "60080055": "DRESDEFF608", + "60080057": "DRESDEFF609", + "60080085": "DRESDEFFI50", + "60080086": "DRESDEFFI54", + "60080087": "DRESDEFFI57", + "60080088": "DRESDEFFI58", + "60089450": "DRESDEFFI21", + "60090100": "VOBADESSXXX", + "60090133": "VOBADESSXXX", + "60090300": "GENODES1ZUF", + "60090700": "SWBSDESSXXX", + "60090800": "GENODEF1S02", + "60090900": "GENODEF1P20", + "60120200": "BHFBDEFF600", + "60120500": "BFSWDE33STG", + "60133300": "SCFBDE33XXX", + "60241074": "COBADEFFXXX", + "60250010": "SOLADES1WBN", + "60261329": "GENODES1FBB", + "60261622": "GENODES1WNS", + "60261818": "GENODES1RWT", + "60262063": "GENODES1KOR", + "60262693": "GENODES1KRN", + "60270024": "DEUTDEDB606", + "60270073": "DEUTDESS606", + "60290110": "GENODES1VWN", + "60291120": "GENODES1VBK", + "60320291": "HYVEDEMM858", + "60340071": "COBADEFFXXX", + "60350130": "BBKRDE6BXXX", + "60361923": "GENODES1WES", + "60380002": "DRESDEFF601", + "60390000": "GENODES1BBV", + "60390300": "GENODES1LEO", + "60391310": "GENODES1VBH", + "60391420": "GENODES1MAG", + "60420000": "WBAGDE61XXX", + "60420020": "WBAGDEA1XXX", + "60420021": "WBAGDEA1XXX", + "60420186": "HYVEDEMM860", + "60422000": "SABUDES1XXX", + "60440073": "COBADEFFXXX", + "60450050": "SOLADES1LBG", + "60460142": "GENODES1EGL", + "60462808": "GENODES1AMT", + "60470024": "DEUTDEDB604", + "60470082": "DEUTDESS604", + "60480008": "DRESDEFF604", + "60490150": "GENODES1LBG", + "60491430": "GENODES1VBB", + "60661906": "GENODES1WIM", + "60663084": "GENODES1RCW", + "60670024": "DEUTDEDB659", + "60670070": "DEUTDESS659", + "61030000": "MARBDE6GXXX", + "61040014": "COBADEFFXXX", + "61050000": "GOPSDE6GXXX", + "61060500": "GENODES1VGP", + "61070024": "DEUTDEDB610", + "61070078": "DEUTDESS610", + "61080006": "DRESDEFF610", + "61091200": "GENODES1DGG", + "61120286": "HYVEDEMM859", + "61140071": "COBADEFFXXX", + "61150020": "ESSLDE66XXX", + "61161696": "GENODES1NHB", + "61170024": "DEUTDEDB611", + "61170076": "DEUTDESS611", + "61180004": "DRESDEFF611", + "61190110": "GENODES1ESS", + "61191310": "GENODES1VBP", + "61240048": "COBADEFFXXX", + "61261213": "GENODES1TEC", + "61261339": "GENODES1HON", + "61262258": "GENODES1WLF", + "61262345": "GENODES1BBF", + "61281007": "DRESDEFF612", + "61290120": "GENODES1NUE", + "61340079": "COBADEFFXXX", + "61361722": "GENODES1HEU", + "61361975": "GENODES1RML", + "61370024": "DEUTDEDB613", + "61370086": "DEUTDESS613", + "61390140": "GENODES1VGD", + "61391410": "GENODES1WEL", + "61420086": "HYVEDEMM272", + "61440086": "COBADEFFXXX", + "61450050": "OASPDE6AXXX", + "61480001": "DRESDEFF614", + "61490150": "GENODES1AAV", + "61491010": "GENODES1ELL", + "62020000": "HOEBDE61XXX", + "62040060": "COBADEFFXXX", + "62050000": "HEISDE66XXX", + "62061991": "GENODES1VOS", + "62062215": "GENODES1BIA", + "62062643": "GENODES1VFT", + "62063263": "GENODES1VLS", + "62070024": "DEUTDEDB620", + "62070081": "DEUTDESS620", + "62080012": "DRESDEFF620", + "62090100": "GENODES1VHN", + "62091400": "GENODES1VBR", + "62091600": "GENODES1VMN", + "62091800": "GENODES1VHL", + "62220000": "BSHHDE61XXX", + "62240048": "COBADEFFXXX", + "62250030": "SOLADES1SHA", + "62251550": "SOLADES1KUN", + "62280012": "DRESDEFF622", + "62290110": "GENODES1SHA", + "62291020": "GENODES1CRV", + "62391420": "GENODES1VVT", + "63000000": "MARKDEF1630", + "63020086": "HYVEDEMM461", + "63040053": "COBADEFFXXX", + "63050000": "SOLADES1ULM", + "63061486": "GENODES1LBK", + "63070024": "DEUTDEDB630", + "63070088": "DEUTDESS630", + "63080015": "DRESDEFF630", + "63080085": "DRESDEFFI59", + "63090100": "ULMVDE66XXX", + "63091010": "GENODES1EHI", + "63091200": "GENODES1BLA", + "63091300": "GENODES1LAI", + "63220090": "HYVEDEMM271", + "63240016": "COBADEFFXXX", + "63250030": "SOLADES1HDH", + "63290110": "GENODES1HDH", + "64000000": "MARKDEF1640", + "64020186": "HYVEDEMM374", + "64040033": "COBADEFFXXX", + "64040045": "COBADEFFXXX", + "64050000": "SOLADES1REU", + "64061854": "GENODES1STW", + "64070024": "DEUTDEDB640", + "64070085": "DEUTDESS640", + "64070215": "DEUTDESSP14", + "64070224": "DEUTDEDBP14", + "64080014": "DRESDEFF640", + "64090100": "VBRTDE6RXXX", + "64091200": "GENODES1MTZ", + "64091300": "GENODES1MUN", + "64140036": "COBADEFFXXX", + "64150020": "SOLADES1TUB", + "64161397": "GENODES1AMM", + "64161608": "GENODES1RHK", + "64161956": "GENODES1VMO", + "64163225": "GENODES1VHZ", + "64180014": "DRESDEFF641", + "64190110": "GENODES1TUE", + "64191030": "GENODES1NAG", + "64191700": "GENODES1HOR", + "64240048": "COBADEFFXXX", + "64240071": "COBADEFFXXX", + "64250040": "SOLADES1RWL", + "64251060": "SOLADES1FDS", + "64261363": "GENODES1BAI", + "64261626": "GENODES1MMO", + "64261853": "GENODES1PGW", + "64262408": "GENODES1VDS", + "64290120": "GENODES1VRW", + "64291010": "GENODES1FDS", + "64291420": "GENODES1VDL", + "64292020": "GENODES1SBG", + "64292310": "GENODES1TRO", + "64350070": "SOLADES1TUT", + "64361359": "GENODES1RDH", + "64380011": "DRESDEFF643", + "64390130": "GENODES1TUT", + "65020186": "HYVEDEMM588", + "65040073": "COBADEFFXXX", + "65050110": "SOLADES1RVB", + "65061219": "GENODES1AUL", + "65062577": "GENODES1RRV", + "65063086": "GENODES1SAG", + "65070024": "DEUTDEDB650", + "65070084": "DEUTDESS650", + "65080009": "DRESDEFF650", + "65091040": "GENODES1LEU", + "65091300": "GENODES1BWB", + "65091600": "GENODES1VWG", + "65092010": "GENODES1WAN", + "65092200": "GENODES1VAH", + "65093020": "GENODES1SLG", + "65110200": "IBBFDE81XXX", + "65140072": "COBADEFFXXX", + "65161497": "GENODES1GMB", + "65162832": "GENODES1OTE", + "65180005": "DRESDEFF651", + "65190110": "GENODES1VFN", + "65191500": "GENODES1TET", + "65340004": "COBADEFFXXX", + "65341204": "COBADEFFXXX", + "65351050": "SOLADES1SIG", + "65351260": "SOLADES1BAL", + "65361469": "GENODES1HBM", + "65361898": "GENODES1WLB", + "65361989": "GENODES1ONS", + "65362499": "GENODES1GEI", + "65370024": "DEUTDEDB653", + "65370075": "DEUTDESS653", + "65380003": "DRESDEFF653", + "65390120": "GENODES1EBI", + "65391210": "GENODES1BAL", + "65392030": "GENODES1TAI", + "65440087": "COBADEFFXXX", + "65450070": "SBCRDE66XXX", + "65461878": "GENODES1WAR", + "65462231": "GENODES1ERO", + "65491320": "GENODES1VBL", + "65491510": "GENODES1VRR", + "66000000": "MARKDEF1660", + "66010075": "PBNKDEFFXXX", + "66010200": "BBSPDE6KXXX", + "66010700": "LKBWDE6KXXX", + "66020020": "SOLADEST663", + "66020286": "HYVEDEMM475", + "66020500": "BFSWDE33KRL", + "66020566": "BFSWDE33KRL", + "66030600": "ISBKDEFXXXX", + "66040018": "COBADEFFXXX", + "66040026": "COBADEFFXXX", + "66050000": "SOLADEST660", + "66050101": "KARSDE66XXX", + "66051220": "SOLADES1ETT", + "66060000": "GENODE6KXXX", + "66060300": "GENODE61KA3", + "66061407": "GENODE61RH2", + "66061724": "GENODE61WGA", + "66062138": "GENODE61EGG", + "66062366": "GENODE61DET", + "66069103": "GENODE61ELZ", + "66069104": "GENODE61DAC", + "66069342": "GENODE61KTH", + "66070004": "DEUTDESM660", + "66070024": "DEUTDEDB660", + "66070213": "DEUTDESMP12", + "66070224": "DEUTDEDBP12", + "66080052": "DRESDEFF660", + "66090800": "GENODE61BBB", + "66090900": "GENODEF1P10", + "66091200": "GENODE61ETT", + "66190000": "GENODE61KA1", + "66240002": "COBADEFFXXX", + "66250030": "SOLADES1BAD", + "66251434": "SOLADES1BHL", + "66261092": "GENODE61BHT", + "66261416": "GENODE61ALR", + "66270001": "DEUTDESM662", + "66270024": "DEUTDEDB662", + "66280053": "DRESDEFF662", + "66290000": "VBRADE6KXXX", + "66291300": "GENODE61ACH", + "66291400": "GENODE61BHL", + "66340018": "COBADEFFXXX", + "66350036": "BRUSDE66XXX", + "66391200": "GENODE61BTT", + "66391600": "GENODE61ORH", + "66432700": "FAITDE66XXX", + "66440084": "COBADEFFXXX", + "66450050": "SOLADES1OFG", + "66451346": "SOLADES1GEB", + "66451548": "SOLADES1HAL", + "66451862": "SOLADES1KEL", + "66452776": "SOLADES1WOF", + "66470024": "DEUTDEDB968", + "66470035": "DEUTDE6F664", + "66490000": "GENODE61OG1", + "66491800": "GENODE61BHL", + "66492600": "GENODE61APP", + "66492700": "GENODE61KZT", + "66550070": "SOLADES1RAS", + "66562053": "GENODE61DUR", + "66562300": "GENODE61IFF", + "66640035": "COBADEFFXXX", + "66650085": "PZHSDE66XXX", + "66661244": "GENODE61NBT", + "66661329": "GENODE61KBR", + "66661454": "GENODE61NFO", + "66662155": "GENODE61ERS", + "66662220": "GENODE61KBS", + "66670006": "DEUTDESM666", + "66670024": "DEUTDEDB666", + "66680013": "DRESDEFF666", + "66690000": "VBPFDE66XXX", + "66692300": "GENODE61WIR", + "66762332": "GENODE61KIR", + "66762433": "GENODE61NEU", + "67020190": "HYVEDEMM489", + "67040031": "COBADEFFXXX", + "67040060": "COBADEFFXXX", + "67040061": "COBADEFFXXX", + "67040085": "COBADEFFXXX", + "67050505": "MANSDE66XXX", + "67051203": "SOLADES1HOC", + "67060031": "GENODE61MA3", + "67070010": "DEUTDESMXXX", + "67070024": "DEUTDEDBMAN", + "67080050": "DRESDEFF670", + "67080085": "DRESDEFFI60", + "67080086": "DRESDEFFI61", + "67089440": "DRESDEFFI22", + "67090000": "GENODE61MA2", + "67092300": "GENODE61WNM", + "67220286": "HYVEDEMM479", + "67230000": "MLPBDE61XXX", + "67230001": "MLPBDE61001", + "67240039": "COBADEFFXXX", + "67250020": "SOLADES1HDB", + "67262243": "GENODE61WIB", + "67262550": "GENODE61LRO", + "67270003": "DEUTDESM672", + "67270024": "DEUTDEDB672", + "67280051": "DRESDEFF672", + "67290000": "GENODE61HD1", + "67290100": "GENODE61HD3", + "67291700": "GENODE61NGD", + "67291900": "GENODE61SSH", + "67292200": "GENODE61WIE", + "67352565": "SOLADES1TBB", + "67390000": "GENODE61WTH", + "67450048": "SOLADES1MOS", + "67460041": "GENODE61MOS", + "67461424": "GENODE61BUC", + "67461733": "GENODE61RNG", + "67462368": "GENODE61LMB", + "68000000": "MARKDEF1680", + "68020186": "HYVEDEMM357", + "68030000": "BKMADE61XXX", + "68040007": "COBADEFFXXX", + "68050101": "FRSPDE66XXX", + "68051004": "SOLADES1HSW", + "68051207": "SOLADES1BND", + "68052230": "SOLADES1STB", + "68052328": "SOLADES1STF", + "68052863": "SOLADES1SCH", + "68061505": "GENODE61IHR", + "68062105": "GENODE61DEN", + "68062730": "GENODE61WYH", + "68063479": "GENODE61VOK", + "68064222": "GENODE61GUN", + "68070024": "DEUTDEDBFRE", + "68070030": "DEUTDE6FXXX", + "68070212": "DEUTDE6FP11", + "68070224": "DEUTDEDBP11", + "68080030": "DRESDEFF680", + "68080031": "DRESDEFFI44", + "68080085": "DRESDEFFI62", + "68080086": "DRESDEFFJ22", + "68090000": "GENODE61FR1", + "68090900": "GENODEF1P07", + "68091900": "GENODE61MHL", + "68092000": "GENODE61EMM", + "68092300": "GENODE61STF", + "68270024": "DEUTDEDB682", + "68270033": "DEUTDE6F682", + "68290000": "GENODE61LAH", + "68340058": "COBADEFFXXX", + "68350048": "SKLODE66XXX", + "68351557": "SOLADES1SFH", + "68351865": "SOLADES1MGL", + "68370024": "DEUTDEDB683", + "68370034": "DEUTDE6F683", + "68390000": "VOLODE66XXX", + "68391500": "GENODE61SPF", + "68452290": "SKHRDE6WXXX", + "68462427": "GENODE61WUT", + "68490000": "GENODE61BSK", + "68492200": "GENODE61WT1", + "69020190": "HYVEDEMM591", + "69040045": "COBADEFFXXX", + "69050001": "SOLADES1KNZ", + "69051410": "SOLADES1REN", + "69051620": "SOLADES1PFD", + "69051725": "SOLADES1SAL", + "69061800": "GENODE61UBE", + "69070024": "DEUTDEDB690", + "69070032": "DEUTDE6F690", + "69091200": "GENODE61HAG", + "69091600": "GENODE61PFD", + "69220186": "HYVEDEMM590", + "69240075": "COBADEFFXXX", + "69250035": "SOLADES1SNG", + "69251445": "SOLADES1ENG", + "69251755": "SOLADES1STO", + "69270024": "DEUTDEDB692", + "69270038": "DEUTDE6F692", + "69280035": "DRESDEFF692", + "69290000": "GENODE61SIN", + "69291000": "GENODE61RAD", + "69291099": "GENODE61RAD", + "69362032": "GENODE61MES", + "69400000": "MARKDEF1694", + "69440007": "COBADEFFXXX", + "69440060": "COBADEFFXXX", + "69450065": "SOLADES1VSS", + "69470024": "DEUTDEDB694", + "69470039": "DEUTDE6F694", + "69490000": "GENODE61VS1", + "69491700": "GENODE61TRI", + "70000000": "MARKDEF1700", + "70010080": "PBNKDEFFXXX", + "70010424": "AARBDE5W700", + "70010500": "REBMDEMMXXX", + "70010555": "REBMDEMM555", + "70010570": "REBMDE7CXXX", + "70010800": "KHMIDEMMXXX", + "70011200": "VONTDEM1XXX", + "70011400": "BFWODE71XXX", + "70011500": "SIBADEMMXXX", + "70011600": "WEGBDE77XXX", + "70011900": "ICRDDE71XXX", + "70012000": "CLABDEM1XXX", + "70012300": "VBANDEMMXXX", + "70012600": "SUSKDEM1XXX", + "70012700": "DEPDDEMMXXX", + "70012900": "FXBBDEM2XXX", + "70013000": "EBSGDEMXXXX", + "70013010": "EFSGDEM1XXX", + "70013400": "CSHHDE71XXX", + "70013500": "HERZDEM1XXX", + "70015000": "TEZGDEB1XXX", + "70015015": "TEZGDEB1001", + "70015025": "TEZGDEB1002", + "70015035": "TEZGDEB1003", + "70017000": "PAGMDEM1XXX", + "70020270": "HYVEDEMMXXX", + "70020300": "WKVBDEM1XXX", + "70020500": "BFSWDE33MUE", + "70020570": "BFSWDE33MUE", + "70020800": "BCITDEFFMUC", + "70021180": "HYVEDEMM418", + "70022424": "SCABDEMMXXX", + "70025175": "HYVEDEMM643", + "70030300": "CHDBDEHHXXX", + "70030400": "MEFIDEMMXXX", + "70031000": "BHLSDEM1XXX", + "70032500": "GAKDDEM1XXX", + "70033100": "BDWBDEMMXXX", + "70035000": "OLBODEH2700", + "70040041": "COBADEFFXXX", + "70040045": "COBADEFFXXX", + "70040048": "COBADEFFXXX", + "70040060": "COBADEFFXXX", + "70040061": "COBADEFFXXX", + "70040062": "COBADEFFXXX", + "70040063": "COBADEFFXXX", + "70040070": "COBADEFFXXX", + "70045050": "COBADEFFXXX", + "70050000": "BYLADEMMXXX", + "70051003": "BYLADEM1FSI", + "70051540": "BYLADEM1DAH", + "70051995": "BYLADEM1ERD", + "70052060": "BYLADEM1LLD", + "70053070": "BYLADEM1FFB", + "70054306": "BYLADEM1WOR", + "70070010": "DEUTDEMMXXX", + "70070024": "DEUTDEDBMUC", + "70070324": "DEUTDEDBP16", + "70070362": "DEUTDEMMP16", + "70080000": "DRESDEFF700", + "70080056": "DRESDEFF714", + "70080057": "DRESDEFF724", + "70080085": "DRESDEFFI55", + "70080086": "DRESDEFFJ23", + "70080087": "DRESDEFFJ24", + "70080088": "DRESDEFFJ25", + "70089470": "DRESDEFFI23", + "70089472": "DRESDEFFI45", + "70090100": "GENODEF1M04", + "70090124": "GENODEF1MU4", + "70090500": "GENODEF1S04", + "70091500": "GENODEF1DCA", + "70091510": "GENODEF1DCA", + "70091600": "GENODEF1DSS", + "70091900": "GENODEF1EDV", + "70093200": "GENODEF1STH", + "70093400": "GENODEF1ISV", + "70110088": "PBNKDEFFXXX", + "70110500": "MHYPDEMMXXX", + "70110570": "MHYPDEMMSCA", + "70120100": "SBOSDEMXXXX", + "70120400": "DABBDEMMXXX", + "70120500": "FMBKDEMMXXX", + "70120600": "AGBMDEMMXXX", + "70120700": "OBKLDEMXXXX", + "70130800": "GENODEF1M06", + "70133300": "SCFBDE33XXX", + "70150000": "SSKMDEMMXXX", + "70160000": "GENODEFF701", + "70163370": "GENODEF1FFB", + "70166486": "GENODEF1OHC", + "70169132": "GENODEF1HFG", + "70169165": "GENODEF1SBC", + "70169168": "GENODEF1RIW", + "70169186": "GENODEF1ODZ", + "70169190": "GENODEF1GKT", + "70169191": "GENODEF1TEI", + "70169195": "GENODEF1TRU", + "70169310": "GENODEF1ALX", + "70169331": "GENODEF1SSB", + "70169333": "GENODEF1EUR", + "70169351": "GENODEF1ELB", + "70169356": "GENODEF1EDR", + "70169382": "GENODEF1GIL", + "70169383": "GENODEF1GMU", + "70169388": "GENODEF1HMA", + "70169402": "GENODEF1HHK", + "70169410": "GENODEF1HZO", + "70169413": "GENODEF1HUA", + "70169450": "GENODEF1ASG", + "70169459": "GENODEF1MTW", + "70169460": "GENODEF1MOO", + "70169464": "GENODEF1M07", + "70169465": "GENODEF1M08", + "70169466": "GENODEF1M03", + "70169470": "GENODEF1GAA", + "70169474": "GENODEF1NSV", + "70169476": "GENODEF1NBK", + "70169509": "GENODEF1PEI", + "70169521": "GENODEF1RIG", + "70169524": "GENODEF1RME", + "70169530": "GENODEF1RWZ", + "70169538": "GENODEF1SWO", + "70169541": "GENODEF1THG", + "70169543": "GENODEF1HHS", + "70169558": "GENODEF1SGA", + "70169566": "GENODEF1TAV", + "70169568": "GENODEF1TAE", + "70169571": "GENODEF1DTZ", + "70169575": "GENODEF1TRH", + "70169576": "GENODEF1TUS", + "70169585": "GENODEF1UNS", + "70169598": "GENODEF1MIB", + "70169599": "GENODEF1WEI", + "70169602": "GENODEF1WM1", + "70169605": "GENODEF1ISE", + "70169614": "GENODEF1FSR", + "70169619": "GENODEF1ZOR", + "70169653": "GENODEF1AIG", + "70169693": "GENODEF1RHT", + "70190000": "GENODEF1M01", + "70190010": "GENODEF1M1Y", + "70220000": "LFFBDEMMXXX", + "70220200": "BHFBDEFF700", + "70220300": "BMWBDEMUXXX", + "70220900": "DRESDEFFBFC", + "70230600": "ISBKDEFXMUN", + "70250150": "BYLADEM1KMS", + "70320090": "HYVEDEMM654", + "70321194": "HYVEDEMM466", + "70322192": "HYVEDEMM664", + "70350000": "BYLADEM1GAP", + "70351030": "BYLADEM1WHM", + "70362595": "GENODEF1WAK", + "70380006": "DRESDEFF703", + "70390000": "GENODEF1GAP", + "70390010": "GENODEF1GAP", + "70391800": "GENODEF1PZB", + "71020072": "HYVEDEMM410", + "71021270": "HYVEDEMM629", + "71022182": "HYVEDEMM453", + "71023173": "HYVEDEMM632", + "71050000": "BYLADEM1BGL", + "71052050": "BYLADEM1TST", + "71061009": "GENODEF1AOE", + "71062802": "GENODEF1AGE", + "71090000": "GENODEF1BGL", + "71120077": "HYVEDEMM448", + "71120078": "HYVEDEMM644", + "71121176": "HYVEDEMM438", + "71122183": "HYVEDEMM457", + "71140041": "COBADEFFXXX", + "71141041": "COBADEFFXXX", + "71142041": "COBADEFFXXX", + "71150000": "BYLADEM1ROS", + "71151020": "BYLADEM1MDF", + "71152570": "BYLADEM1MIB", + "71152680": "BYLADEM1WSB", + "71160000": "GENODEF1VRR", + "71160161": "GENODEF1ROR", + "71161964": "GENODEF1PRV", + "71162355": "GENODEF1OBD", + "71162804": "GENODEF1ASU", + "71165150": "GENODEF1AIB", + "71180005": "DRESDEFF711", + "71190000": "GENODEF1ROV", + "71191000": "GENODEF1MUL", + "72000000": "MARKDEF1720", + "72012300": "BTVADE61XXX", + "72020070": "HYVEDEMM408", + "72021271": "HYVEDEMM236", + "72021876": "HYVEDEMM259", + "72030014": "FUBKDE71XXX", + "72030227": "ANHODE77XXX", + "72030260": "ANHODE7AXXX", + "72040046": "COBADEFFXXX", + "72050000": "AUGSDE77XXX", + "72050101": "BYLADEM1AUG", + "72051210": "BYLADEM1AIC", + "72051840": "BYLADEM1GZK", + "72062152": "GENODEF1MTG", + "72069002": "GENODEF1ADZ", + "72069005": "GENODEF1AIL", + "72069034": "GENODEF1BSI", + "72069036": "GENODEF1BOI", + "72069043": "GENODEF1GZ2", + "72069105": "GENODEF1HTF", + "72069113": "GENODEF1HZH", + "72069119": "GENODEF1ICH", + "72069123": "GENODEF1JET", + "72069126": "GENODEF1BBT", + "72069132": "GENODEF1KRR", + "72069135": "GENODEF1LST", + "72069155": "GENODEF1MRI", + "72069179": "GENODEF1BWI", + "72069181": "GENODEF1OFF", + "72069193": "GENODEF1RLI", + "72069209": "GENODEF1RGB", + "72069220": "GENODEF1SMU", + "72069235": "GENODEF1THS", + "72069263": "GENODEF1WTS", + "72069274": "GENODEF1ZUS", + "72069308": "GENODEF1WDN", + "72069329": "GENODEF1NOE", + "72069736": "GENODEF1BLT", + "72069789": "GENODEF1PFA", + "72070001": "DEUTDEMM720", + "72070024": "DEUTDEDB720", + "72070324": "DEUTDEDBP19", + "72070365": "DEUTDEMMP19", + "72080001": "DRESDEFF720", + "72090000": "GENODEF1AUB", + "72090500": "GENODEF1S03", + "72090900": "GENODEF1P14", + "72091800": "GENODEF1GZ1", + "72120078": "HYVEDEMM426", + "72122181": "HYVEDEMM665", + "72140052": "COBADEFFXXX", + "72150000": "BYLADEM1ING", + "72151340": "BYLADEM1EIS", + "72151650": "BYLADEM1PAF", + "72151880": "BYLADEM1SSH", + "72152070": "BYLADEM1NEB", + "72160818": "GENODEF1INP", + "72169013": "GENODEF1ARH", + "72169080": "GENODEF1GSB", + "72169218": "GENODEF1SBN", + "72169246": "GENODEF1WFN", + "72169380": "GENODEF1BLN", + "72169745": "GENODEF1WDF", + "72169756": "GENODEF1ND2", + "72169764": "GENODEF1WRI", + "72169812": "GENODEF1GAH", + "72169831": "GENODEF1RBL", + "72170007": "DEUTDEMM721", + "72170024": "DEUTDEDB721", + "72170324": "DEUTDEDBP17", + "72170363": "DEUTDEMMP17", + "72180002": "DRESDEFF721", + "72220074": "HYVEDEMM255", + "72223182": "HYVEDEMM263", + "72250000": "BYLADEM1NLG", + "72250160": "BYLADEM1DON", + "72251520": "BYLADEM1DLG", + "72261754": "GENODEF1RLH", + "72262401": "GENODEF1DLG", + "72290100": "GENODEF1DON", + "73050000": "BYLADEM1NUL", + "73061191": "GENODEF1NU1", + "73120075": "HYVEDEMM436", + "73140046": "COBADEFFXXX", + "73150000": "BYLADEM1MLM", + "73160000": "GENODEF1MIR", + "73180011": "DRESDEFF731", + "73190000": "GENODEF1MM1", + "73320073": "HYVEDEMM428", + "73321177": "HYVEDEMM567", + "73322380": "HYVEDEMM570", + "73331700": "GABLDE71XXX", + "73340046": "COBADEFFXXX", + "73350000": "BYLADEM1ALG", + "73369264": "GENODEF1DTA", + "73369821": "GENODEF1LBB", + "73369823": "GENODEF1WWA", + "73369826": "GENODEF1LIA", + "73369851": "GENODEF1AIT", + "73369854": "GENODEF1FCH", + "73369859": "GENODEF1BIN", + "73369871": "GENODEF1EGB", + "73369902": "GENODEF1KM1", + "73369918": "GENODEF1OKI", + "73369920": "GENODEF1SFO", + "73369933": "GENODEF1RHP", + "73369936": "GENODEF1SER", + "73369954": "GENODEF1WGO", + "73370008": "DEUTDEMM733", + "73370024": "DEUTDEDB733", + "73380004": "DRESDEFF733", + "73390000": "GENODEF1KEV", + "73392000": "GENODEF1IMV", + "73420071": "HYVEDEMM427", + "73421478": "HYVEDEMM666", + "73440048": "COBADEFFXXX", + "73450000": "BYLADEM1KFB", + "73451450": "BYLADEM1SOG", + "73480013": "DRESDEFF734", + "74020074": "HYVEDEMM445", + "74020100": "RZOODE77XXX", + "74020150": "RZOODE77050", + "74040082": "COBADEFFXXX", + "74050000": "BYLADEM1PAS", + "74051230": "BYLADEM1FRG", + "74061101": "GENODEF1RGS", + "74061564": "GENODEF1NUI", + "74061670": "GENODEF1ORT", + "74061813": "GENODEF1PFK", + "74061814": "GENODEF1PFK", + "74062490": "GENODEF1VIR", + "74062786": "GENODEF1TIE", + "74064593": "GENODEF1WSD", + "74065782": "GENODEF1SZT", + "74066749": "GENODEF1HZN", + "74067000": "GENODEF1POC", + "74069744": "GENODEF1GRT", + "74069752": "GENODEF1HHU", + "74069758": "GENODEF1TKI", + "74069768": "GENODEF1NHD", + "74090000": "GENODEF1PA1", + "74120071": "HYVEDEMM415", + "74131000": "TEKRDE71XXX", + "74140048": "COBADEFFXXX", + "74150000": "BYLADEM1DEG", + "74151450": "BYLADEM1REG", + "74160025": "GENODEF1DEG", + "74161608": "GENODEF1HBW", + "74164149": "GENODEF1RGE", + "74165013": "GENODEF1AUS", + "74180009": "DRESDEFF741", + "74190000": "GENODEF1DGV", + "74191000": "GENODEF1LND", + "74220075": "HYVEDEMM452", + "74221170": "HYVEDEMM675", + "74240062": "COBADEFFXXX", + "74250000": "BYLADEM1SRG", + "74251020": "BYLADEM1CHM", + "74260110": "GENODEF1SR2", + "74261024": "GENODEF1CHA", + "74290000": "GENODEF1SR1", + "74290100": "CBSRDE71XXX", + "74320073": "HYVEDEMM433", + "74340077": "COBADEFFXXX", + "74350000": "BYLADEM1LAH", + "74351430": "BYLADEM1EGF", + "74351740": "BYLADEM1MSB", + "74361211": "GENODEF1ARF", + "74362663": "GENODEF1ERG", + "74364689": "GENODEF1PFF", + "74369068": "GENODEF1LWE", + "74369088": "GENODEF1GPF", + "74369130": "GENODEF1PST", + "74369146": "GENODEF1RZK", + "74369656": "GENODEF1ENA", + "74369662": "GENODEF1EBV", + "74369704": "GENODEF1MKO", + "74380007": "DRESDEFF743", + "74390000": "GENODEF1LH1", + "74391400": "GENODEF1EGR", + "74392300": "GENODEF1VBV", + "75000000": "MARKDEF1750", + "75020073": "HYVEDEMM447", + "75021174": "HYVEDEMM804", + "75040062": "COBADEFFXXX", + "75050000": "BYLADEM1RBG", + "75051040": "BYLADEM1SAD", + "75051565": "BYLADEM1KEH", + "75060150": "GENODEF1R02", + "75061168": "GENODEF1SWN", + "75061851": "GENODEF1REF", + "75062026": "GENODEF1DST", + "75069014": "GENODEF1ABS", + "75069015": "GENODEF1NGG", + "75069020": "GENODEF1BUK", + "75069038": "GENODEF1FKS", + "75069050": "GENODEF1GRW", + "75069055": "GENODEF1HGA", + "75069061": "GENODEF1HEM", + "75069078": "GENODEF1SZV", + "75069081": "GENODEF1KTZ", + "75069094": "GENODEF1PAR", + "75069110": "GENODEF1NKN", + "75069171": "GENODEF1SWD", + "75070013": "DEUTDEMM750", + "75070024": "DEUTDEDB750", + "75080003": "DRESDEFF750", + "75090000": "GENODEF1R01", + "75090300": "GENODEF1M05", + "75090500": "GENODEF1S05", + "75090900": "GENODEF1P18", + "75091400": "GENODEF1BLF", + "75220070": "HYVEDEMM405", + "75240000": "COBADEFFXXX", + "75250000": "BYLADEM1ABG", + "75261700": "GENODEF1SZH", + "75290000": "GENODEF1AMV", + "75320075": "HYVEDEMM454", + "75340090": "COBADEFFXXX", + "75350000": "BYLADEM1WEN", + "75351960": "BYLADEM1ESB", + "75360011": "GENODEF1WEO", + "75362039": "GENODEF1FLS", + "75363189": "GENODEF1NEW", + "75390000": "GENODEF1WEV", + "76000000": "MARKDEF1760", + "76010085": "PBNKDEFFXXX", + "76020070": "HYVEDEMM460", + "76020099": "HYVEDEMMCAR", + "76026000": "NORSDE71XXX", + "76030080": "CSDBDE71XXX", + "76030600": "ISBKDEFXNUR", + "76030800": "BIWBDE33760", + "76032000": "TEAMDE71XXX", + "76032001": "TEAMDE71TAT", + "76035000": "UMWEDE7NXXX", + "76040060": "COBADEFFXXX", + "76040061": "COBADEFFXXX", + "76040062": "COBADEFFXXX", + "76040065": "COBADEFFXXX", + "76050000": "BYLADEMMXXX", + "76050101": "SSKNDE77XXX", + "76052080": "BYLADEM1NMA", + "76060000": "GENODEFF760", + "76060618": "GENODEF1N02", + "76060620": "GENODEF1N02", + "76061025": "GENODEF1LAU", + "76061482": "GENODEF1HSB", + "76069369": "GENODEF1AUO", + "76069372": "GENODEF1WDS", + "76069378": "GENODEF1BEH", + "76069404": "GENODEF1DSB", + "76069409": "GENODEF1DIH", + "76069410": "GENODEF1DIM", + "76069440": "GENODEF1FEC", + "76069441": "GENODEF1FEW", + "76069448": "GENODEF1FRD", + "76069449": "GENODEF1FYS", + "76069462": "GENODEF1GDG", + "76069468": "GENODEF1GU1", + "76069486": "GENODEF1HSC", + "76069512": "GENODEF1N08", + "76069553": "GENODEF1NM1", + "76069559": "GENODEF1NEA", + "76069564": "GENODEF1BTO", + "76069576": "GENODEF1BPL", + "76069602": "GENODEF1HSE", + "76069611": "GENODEF1SDM", + "76069635": "GENODEF1URS", + "76069663": "GENODEF1WBA", + "76069669": "GENODEF1ZIR", + "76070012": "DEUTDEMM760", + "76070024": "DEUTDEDB760", + "76070324": "DEUTDEDBP15", + "76070361": "DEUTDEMMP15", + "76080040": "DRESDEFF760", + "76080053": "DRESDEFFAGI", + "76080055": "DRESDEFFI25", + "76080085": "DRESDEFFJ26", + "76080086": "DRESDEFFJ27", + "76089480": "DRESDEFFI24", + "76089482": "DRESDEFFI46", + "76090400": "GENODEF1N03", + "76090500": "GENODEF1S06", + "76090900": "GENODEF1P17", + "76211900": "GENODEF1WHD", + "76220073": "HYVEDEMM419", + "76240011": "COBADEFFXXX", + "76250000": "BYLADEM1SFU", + "76251020": "BYLADEM1NEA", + "76260451": "GENODEF1FUE", + "76320072": "HYVEDEMM417", + "76340061": "COBADEFFXXX", + "76350000": "BYLADEM1ERH", + "76351040": "BYLADEM1FOR", + "76351560": "BYLADEM1HOS", + "76360033": "GENODEF1ER1", + "76391000": "GENODEF1FOH", + "76420080": "HYVEDEMM065", + "76450000": "BYLADEM1SRS", + "76460015": "GENODEF1SWR", + "76461485": "GENODEF1HPN", + "76520071": "HYVEDEMM406", + "76550000": "BYLADEM1ANS", + "76551020": "BYLADEM1DKB", + "76551540": "BYLADEM1GUN", + "76551860": "BYLADEM1ROT", + "76560060": "GENODEF1ANS", + "76591000": "GENODEF1DKV", + "77020070": "HYVEDEMM411", + "77040080": "COBADEFFXXX", + "77050000": "BYLADEM1SKB", + "77060100": "GENODEF1BA2", + "77061004": "GENODEF1ALK", + "77061425": "GENODEF1EBR", + "77062014": "GENODEF1BGB", + "77062139": "GENODEF1SFF", + "77069044": "GENODEF1KC2", + "77069051": "GENODEF1HIS", + "77069052": "GENODEF1HOB", + "77069091": "GENODEF1SFD", + "77069461": "GENODEF1GBF", + "77069739": "GENODEF1THA", + "77069764": "GENODEF1KEM", + "77069782": "GENODEF1SPK", + "77069836": "GENODEF1BGO", + "77069868": "GENODEF1MGA", + "77069870": "GENODEF1SZF", + "77069906": "GENODEF1WSZ", + "77069908": "GENODEF1ZSP", + "77091800": "GENODEF1LIF", + "77120073": "HYVEDEMM289", + "77140061": "COBADEFFXXX", + "77150000": "BYLADEM1KUB", + "77190000": "GENODEF1KU1", + "77320072": "HYVEDEMM412", + "77322200": "FODBDE77XXX", + "77340076": "COBADEFFXXX", + "77350110": "BYLADEM1SBT", + "77363749": "GENODEF1GFS", + "77365792": "GENODEF1HWA", + "78020070": "HYVEDEMM424", + "78040081": "COBADEFFXXX", + "78050000": "BYLADEM1HOF", + "78055050": "BYLADEM1FIG", + "78060896": "GENODEF1HO1", + "78140000": "COBADEFFXXX", + "78160069": "GENODEF1MAK", + "78161575": "GENODEF1WSS", + "78320076": "HYVEDEMM480", + "78340091": "COBADEFFXXX", + "78350000": "BYLADEM1COB", + "78360000": "GENODEF1COS", + "79000000": "MARKDEF1790", + "79020076": "HYVEDEMM455", + "79030001": "FUCEDE77XXX", + "79032038": "BSHADE71XXX", + "79040047": "COBADEFFXXX", + "79050000": "BYLADEM1SWU", + "79063060": "GENODEF1EFD", + "79063122": "GENODEF1HBG", + "79065028": "GENODEF1BRK", + "79069001": "GENODEF1WED", + "79069010": "GENODEF1ATE", + "79069031": "GENODEF1BHD", + "79069150": "GENODEF1GEM", + "79069165": "GENODEF1MLV", + "79069181": "GENODEF1NDL", + "79069188": "GENODEF1SLZ", + "79069213": "GENODEF1RNM", + "79070016": "DEUTDEMM790", + "79070024": "DEUTDEDB790", + "79080052": "DRESDEFF790", + "79080085": "DRESDEFFJ28", + "79090000": "GENODEF1WU1", + "79161058": "GENODEF1ERN", + "79161499": "GENODEF1OBR", + "79190000": "GENODEF1KT1", + "79320075": "HYVEDEMM451", + "79330111": "FLESDEMMXXX", + "79340054": "COBADEFFXXX", + "79350000": "BYLADEM1SSW", + "79350101": "BYLADEM1KSW", + "79351010": "BYLADEM1KIS", + "79351730": "BYLADEM1HAS", + "79353090": "BYLADEM1NES", + "79362081": "GENODEF1GZH", + "79363016": "GENODEF1NDT", + "79363151": "GENODEF1HAS", + "79364069": "GENODEF1FWH", + "79380051": "DRESDEFF793", + "79520070": "HYVEDEMM407", + "79540049": "COBADEFFXXX", + "79550000": "BYLADEM1ASA", + "79561348": "GENODEF1BAG", + "79562514": "GENODEF1AB1", + "79565568": "GENODEF1WAA", + "79567531": "GENODEF1ALZ", + "79568518": "GENODEF1HAC", + "79570024": "DEUTDEDB795", + "79570051": "DEUTDEFF795", + "79570324": "DEUTDEDBP18", + "79570364": "DEUTDEFFS18", + "79580099": "DRESDEFF795", + "79589402": "DRESDEFFI47", + "79590000": "GENODEF1AB2", + "79650000": "BYLADEM1MIL", + "79665540": "GENODEF1EAU", + "79666548": "GENODEF1OBE", + "79668509": "GENODEF1ENB", + "79690000": "GENODEF1MIL", + "80020086": "HYVEDEMM440", + "80020087": "HYVEDEMM462", + "80040000": "COBADEFFXXX", + "80050500": "NOLADE21MQU", + "80053000": "NOLADE21BLK", + "80053572": "NOLADE21DES", + "80053622": "NOLADE21KOT", + "80053722": "NOLADE21BTF", + "80053762": "NOLADE21HAL", + "80054000": "NOLADE21WSF", + "80055008": "NOLADE21EIL", + "80055500": "NOLADE21SES", + "80062608": "GENODEF1JE1", + "80063508": "GENODEF1QLB", + "80063558": "GENODEF1SGH", + "80063598": "GENODEF1WB1", + "80063628": "GENODEF1KOE", + "80063648": "GENODEF1NMB", + "80063678": "GENODEF1ZTZ", + "80063718": "GENODEF1EIL", + "80080000": "DRESDEFF800", + "80093574": "GENODEF1DS1", + "80093784": "GENODEF1HAL", + "80550101": "NOLADE21WBL", + "80550200": "NOLADE21ZER", + "81000000": "MARKDEF1810", + "81010400": "NOLADE21LSA", + "81020500": "BFSWDE33MAG", + "81040000": "COBADEFFXXX", + "81050555": "NOLADE21SDL", + "81052000": "NOLADE21HRZ", + "81053272": "NOLADE21MDG", + "81054000": "NOLADE21JEL", + "81055000": "NOLADE21HDL", + "81055555": "NOLADE21SAW", + "81063028": "GENODEF1KAB", + "81063238": "GENODEF1BRG", + "81068106": "GENODED1KDM", + "81069052": "GENODEF1WZL", + "81070000": "DEUTDE8MXXX", + "81070024": "DEUTDEDBMAG", + "81080000": "DRESDEFF810", + "81093034": "GENODEF1GA1", + "81093054": "GENODEF1SDL", + "81093274": "GENODEF1MD1", + "82000000": "MARKDEF1820", + "82020086": "HYVEDEMM498", + "82020087": "HYVEDEMM098", + "82020088": "HYVEDEMM824", + "82040000": "COBADEFFXXX", + "82040085": "COBADEFFXXX", + "82050000": "HELADEFF820", + "82051000": "HELADEF1WEM", + "82052020": "HELADEF1GTH", + "82054052": "HELADEF1NOR", + "82055000": "HELADEF1KYF", + "82056060": "HELADEF1MUE", + "82057070": "HELADEF1EIC", + "82060197": "GENODED1PA5", + "82064038": "GENODEF1MU2", + "82064088": "GENODEF1ESA", + "82064168": "GENODEF1GTH", + "82064188": "GENODEF1WE1", + "82064228": "ERFBDE8EXXX", + "82070000": "DEUTDE8EXXX", + "82070024": "DEUTDEDBERF", + "82070324": "DEUTDEDBP20", + "82070366": "DEUTDE8EP20", + "82080000": "DRESDEFF827", + "82094004": "GENODEF1HIG", + "82094054": "GENODEF1NDS", + "83020086": "HYVEDEMM468", + "83020087": "HYVEDEMM463", + "83020088": "HYVEDEMM484", + "83040000": "COBADEFFXXX", + "83050000": "HELADEF1GER", + "83050200": "HELADEF1ALT", + "83050303": "HELADEF1SAR", + "83050505": "HELADEF1SOK", + "83053030": "HELADEF1JEN", + "83064488": "GENODEF1HMF", + "83065408": "GENODEF1SLR", + "83080000": "DRESDEFF830", + "83094444": "GENODEF1PN1", + "83094454": "GENODEF1RUJ", + "83094494": "GENODEF1ESN", + "83094495": "GENODEF1ETK", + "84020087": "HYVEDEMM458", + "84040000": "COBADEFFXXX", + "84050000": "HELADEF1RRS", + "84051010": "HELADEF1ILK", + "84054040": "HELADEF1HIL", + "84054722": "HELADEF1SON", + "84055050": "HELADEF1WAK", + "84064798": "GENODEF1MLF", + "84069065": "GENODEF1SSG", + "84080000": "DRESDEFF843", + "84094754": "GENODEF1SAL", + "84094755": "GENODEF1SAL", + "84094814": "GENODEF1SHL", + "85010500": "SABDDE81XXX", + "85020086": "HYVEDEMM496", + "85020500": "BFSWDE33DRE", + "85040000": "COBADEFFXXX", + "85040060": "COBADEFFXXX", + "85040061": "COBADEFFXXX", + "85050100": "WELADED1GRL", + "85050300": "OSDDDE81XXX", + "85055000": "SOLADES1MEI", + "85060000": "GENODEF1PR2", + "85065028": "GENODEF1SEB", + "85080000": "DRESDEFF850", + "85080085": "DRESDEFFJ29", + "85080086": "DRESDEFFJ30", + "85080200": "DRESDEFF857", + "85089270": "DRESDEFFI15", + "85090000": "GENODEF1DRS", + "85094984": "GENODEF1RIE", + "85095004": "GENODEF1MEI", + "85550000": "SOLADES1BAT", + "85590000": "GENODEF1BZV", + "85590100": "GENODEF1NGS", + "85591000": "GENODEF1GR1", + "86000000": "MARKDEF1860", + "86010090": "PBNKDEFFXXX", + "86010424": "AARBDE5W860", + "86020086": "HYVEDEMM495", + "86020500": "BFSWDE33LPZ", + "86021000": "AIPGDE82XXX", + "86033300": "SCFBDE33XXX", + "86040000": "COBADEFFXXX", + "86040060": "COBADEFFXXX", + "86040061": "COBADEFFXXX", + "86050000": "SOLADEST861", + "86050200": "SOLADES1GRM", + "86050600": "WELADED1TGU", + "86055002": "SOLADES1DES", + "86055462": "SOLADES1DLN", + "86055592": "WELADE8LXXX", + "86065448": "GENODEF1BOA", + "86065468": "GENODEF1DL1", + "86065483": "GENODEF1GMR", + "86069070": "GENODEF1TGB", + "86070000": "DEUTDE8LXXX", + "86070024": "DEUTDEDBLEG", + "86070407": "DEUTDE8LP37", + "86070424": "DEUTDEDBP37", + "86080000": "DRESDEFF860", + "86080055": "DRESDEFF862", + "86080057": "DRESDEFF867", + "86080085": "DRESDEFFJ31", + "86080086": "DRESDEFFJ32", + "86089280": "DRESDEFFI16", + "86095484": "GENODEF1GMV", + "86095554": "GENODEF1DZ1", + "86095604": "GENODEF1LVB", + "87000000": "MARKDEF1870", + "87020086": "HYVEDEMM497", + "87020087": "HYVEDEMM481", + "87020088": "HYVEDEMM441", + "87040000": "COBADEFFXXX", + "87050000": "CHEKDE81XXX", + "87051000": "WELADED1MTW", + "87052000": "WELADED1FGX", + "87054000": "WELADED1STB", + "87055000": "WELADED1ZWI", + "87058000": "WELADED1PLX", + "87069075": "GENODEF1MBG", + "87069077": "GENODEF1BST", + "87070000": "DEUTDE8CXXX", + "87070024": "DEUTDEDBCHE", + "87070406": "DEUTDE8CP36", + "87070424": "DEUTDEDBP36", + "87080000": "DRESDEFF870", + "87095824": "GENODEF1PL1", + "87095899": "GENODEF1EXT", + "87095934": "GENODEF1Z01", + "87095974": "GENODEF1GC1", + "87096124": "GENODEF1MIW", + "87096214": "GENODEF1CH1", +} diff --git a/backend/src/utils/deBankCodes.ts b/backend/src/utils/deBankCodes.ts index 1f1101f..77f7aa4 100644 --- a/backend/src/utils/deBankCodes.ts +++ b/backend/src/utils/deBankCodes.ts @@ -698,7 +698,7 @@ export const DE_BANK_CODE_TO_NAME: Record = { "28022822": "Oldenburgische Landesbank AG", "28023224": "Oldenburgische Landesbank AG", "28023325": "Oldenburgische Landesbank AG", - "28030300": "Oldenburgische Landesbank AG (vormals W. Fortmann & Söhne", + "28030300": "Oldenburgische Landesbank AG (vormals W. Fortmann & Söhne)", "28040046": "Commerzbank", "28042865": "Commerzbank", "28050100": "Landessparkasse zu Oldenburg", @@ -1186,7 +1186,7 @@ export const DE_BANK_CODE_TO_NAME: Record = { "39570061": "Deutsche Bank", "39580041": "Commerzbank vormals Dresdner Bank", "40022000": "NRW.BANK", - "40030000": "Münsterländische Bank Thie,Zndl. d.VR-Bank Westmünst.-a", + "40030000": "Münsterländische Bank Thie,Zndl. d.VR-Bank Westmünst.-alt-", "40040028": "Commerzbank", "40050000": "Landesbank Hessen-Thüringen Girozentrale NL. Düsseldorf", "40050150": "Sparkasse Münsterland Ost", @@ -3214,7 +3214,7 @@ export const DE_BANK_CODE_TO_NAME: Record = { "76260451": "Raiffeisen-Volksbank Fürth -alt-", "76320072": "UniCredit Bank - HypoVereinsbank", "76340061": "Commerzbank Erlangen", - "76350000": "Stadt- u. Kreissparkasse Erlangen Höchstadt Herzogenaurac", + "76350000": "Stadt- u. Kreissparkasse Erlangen Höchstadt Herzogenaurach", "76351040": "Sparkasse Forchheim", "76351560": "Kreissparkasse Höchstadt", "76360033": "VR-Bank Erlangen-Höchstadt-Herzogenaurach -alt-", diff --git a/backend/src/utils/diffTranslations.ts b/backend/src/utils/diffTranslations.ts index e5b57ab..5d61d0e 100644 --- a/backend/src/utils/diffTranslations.ts +++ b/backend/src/utils/diffTranslations.ts @@ -236,8 +236,11 @@ export const diffTranslations: Record< sellingPriceComposed: { label: "Verkaufspreis Zusammensetzung" }, purchaseDate: { label: "Kaufdatum" }, serialNumber: { label: "Seriennummer" }, + customerInventoryId: { label: "Kundeninventar-ID" }, + customerinventoryitems: { label: "Kundeninventar" }, usePlanning: { label: "In Plantafel verwenden" }, currentSpace: { label: "Lagerplatz" }, + customerspace: { label: "Kundenlagerplatz" }, customer: { label: "Kunde", diff --git a/backend/src/utils/functions.ts b/backend/src/utils/functions.ts index 3b6dc7d..eaa4ab6 100644 --- a/backend/src/utils/functions.ts +++ b/backend/src/utils/functions.ts @@ -1,11 +1,8 @@ -import {FastifyInstance} from "fastify"; -// import { PNG } from 'pngjs' -// import { ready as zplReady } from 'zpl-renderer-js' -// import { Utils } from '@mmote/niimbluelib' -// import { createCanvas } from 'canvas' -// import bwipjs from 'bwip-js' -// import Sharp from 'sharp' -// import fs from 'fs' +import { FastifyInstance } from "fastify" +import { PNG } from "pngjs" +import { Utils } from "@mmote/niimbluelib" +import bwipjs from "bwip-js" +import Sharp from "sharp" import { tenants } from "../../db/schema" import { eq } from "drizzle-orm" @@ -15,7 +12,6 @@ export const useNextNumberRangeNumber = async ( tenantId: number, numberRange: string ) => { - // 1️⃣ Tenant laden const [tenant] = await server.db .select() .from(tenants) @@ -33,23 +29,20 @@ export const useNextNumberRangeNumber = async ( const current = numberRanges[numberRange] - // 2️⃣ Used Number generieren const usedNumber = (current.prefix || "") + current.nextNumber + (current.suffix || "") - // 3️⃣ nextNumber erhöhen const updatedRanges = { // @ts-ignore ...numberRanges, [numberRange]: { ...current, - nextNumber: current.nextNumber + 1 - } + nextNumber: current.nextNumber + 1, + }, } - // 4️⃣ Tenant aktualisieren await server.db .update(tenants) .set({ numberRanges: updatedRanges }) @@ -58,24 +51,17 @@ export const useNextNumberRangeNumber = async ( return { usedNumber } } - -/* -export async function encodeBase64ToNiimbot(base64Png, printDirection = 'top') { - // 1️⃣ PNG dekodieren - const buffer = Buffer.from(base64Png, 'base64') - const png = PNG.sync.read(buffer) // liefert {width, height, data: Uint8Array(RGBA)} +export async function encodeBase64ToNiimbot(base64Png: string, printDirection: "top" | "left" = "top") { + const buffer = Buffer.from(base64Png, "base64") + const png = PNG.sync.read(buffer) const { width, height, data } = png - console.log(width, height, data) - const cols = printDirection === 'left' ? height : width - const rows = printDirection === 'left' ? width : height - const rowsData = [] + const cols = printDirection === "left" ? height : width + const rows = printDirection === "left" ? width : height + const rowsData: any[] = [] - console.log(cols) + if (cols % 8 !== 0) throw new Error("Column count must be multiple of 8") - if (cols % 8 !== 0) throw new Error('Column count must be multiple of 8') - - // 2️⃣ Zeilenweise durchgehen und Bits bilden for (let row = 0; row < rows; row++) { let isVoid = true let blackPixelsCount = 0 @@ -84,8 +70,8 @@ export async function encodeBase64ToNiimbot(base64Png, printDirection = 'top') { for (let colOct = 0; colOct < cols / 8; colOct++) { let pixelsOctet = 0 for (let colBit = 0; colBit < 8; colBit++) { - const x = printDirection === 'left' ? row : colOct * 8 + colBit - const y = printDirection === 'left' ? height - 1 - (colOct * 8 + colBit) : row + const x = printDirection === "left" ? row : colOct * 8 + colBit + const y = printDirection === "left" ? height - 1 - (colOct * 8 + colBit) : row const idx = (y * width + x) * 4 const lum = 0.299 * data[idx] + 0.587 * data[idx + 1] + 0.114 * data[idx + 2] const isBlack = lum < 128 @@ -99,7 +85,7 @@ export async function encodeBase64ToNiimbot(base64Png, printDirection = 'top') { } const newPart = { - dataType: isVoid ? 'void' : 'pixels', + dataType: isVoid ? "void" : "pixels", rowNumber: row, repeat: 1, rowData: isVoid ? undefined : rowData, @@ -111,14 +97,15 @@ export async function encodeBase64ToNiimbot(base64Png, printDirection = 'top') { } else { const last = rowsData[rowsData.length - 1] let same = newPart.dataType === last.dataType - if (same && newPart.dataType === 'pixels') { + if (same && newPart.dataType === "pixels") { same = Utils.u8ArraysEqual(newPart.rowData, last.rowData) } if (same) last.repeat++ else rowsData.push(newPart) + if (row % 200 === 199) { rowsData.push({ - dataType: 'check', + dataType: "check", rowNumber: row, repeat: 0, rowData: undefined, @@ -131,44 +118,69 @@ export async function encodeBase64ToNiimbot(base64Png, printDirection = 'top') { return { cols, rows, rowsData } } -export async function generateLabel(context,width,height) { - // Canvas für Hintergrund & Text - const canvas = createCanvas(width, height) - const ctx = canvas.getContext('2d') +function escapeXml(value: string) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/\"/g, """) + .replace(/'/g, "'") +} - // Hintergrund weiß - ctx.fillStyle = '#FFFFFF' - ctx.fillRect(0, 0, width, height) +export async function generateLabel(context: any = {}, width = 584, height = 354) { + const normalizedWidth = Math.ceil(Number(width) / 8) * 8 + const normalizedHeight = Math.max(1, Number(height) || 203) - // Überschrift - ctx.fillStyle = '#000000' - ctx.font = '32px Arial' - ctx.fillText(context.text, 20, 40) + const idFont = Math.max(24, Math.round(normalizedHeight * 0.125)) + const nameFont = Math.max(17, Math.round(normalizedHeight * 0.078)) + const customerFont = Math.max(14, Math.round(normalizedHeight * 0.06)) + const serialFont = Math.max(12, Math.round(normalizedHeight * 0.052)) + + const labelId = context.customerInventoryId || context.datamatrix || context.id || "N/A" + const labelName = context.name || context.text || "Kundeninventarartikel" + const customerName = context.customerName || "" + const serial = context.serialNumber ? `SN: ${context.serialNumber}` : "" + const nameLine1 = String(labelName).slice(0, 30) + const nameLine2 = String(labelName).slice(30, 60) - // 3) DataMatrix const dataMatrixPng = await bwipjs.toBuffer({ - bcid: 'datamatrix', - text: context.datamatrix, - scale: 6, + bcid: "datamatrix", + text: String(labelId), + scale: normalizedWidth >= 560 ? 7 : 5, + includetext: false, }) + const dataMatrixMeta = await Sharp(dataMatrixPng).metadata() + const dataMatrixWidth = dataMatrixMeta.width || 0 + const dataMatrixHeight = dataMatrixMeta.height || 0 + const dmLeft = Math.max(8, normalizedWidth - dataMatrixWidth - 28) + const dmTop = Math.max(8, Math.floor((normalizedHeight - dataMatrixHeight) / 2)) + const textMaxWidth = Math.max(120, dmLeft - 20) - // Basisbild aus Canvas - const base = await Sharp(canvas.toBuffer()) - .png() - .toBuffer() + const textSvg = ` + + + ${escapeXml(String(labelId).slice(0, 26))} + ${escapeXml(nameLine1)} + ${escapeXml(nameLine2)} + ${escapeXml(String(customerName).slice(0, 40))} + ${escapeXml(String(serial).slice(0, 42))} + +`.trim() - // Alles zusammen compositen - const final = await Sharp(base) + const final = await Sharp({ + create: { + width: normalizedWidth, + height: normalizedHeight, + channels: 3, + background: { r: 255, g: 255, b: 255 }, + }, + }) .composite([ - { input: dataMatrixPng, top: 60, left: 20 }, + { input: Buffer.from(textSvg), top: 0, left: 0 }, + { input: dataMatrixPng, top: dmTop, left: dmLeft }, ]) .png() .toBuffer() - fs.writeFileSync('label.png', final) - - // Optional: Base64 zurückgeben (z.B. für API) - const base64 = final.toString('base64') - - return base64 -}*/ + return final.toString("base64") +} diff --git a/backend/src/utils/history.ts b/backend/src/utils/history.ts index 411ab04..3f9346c 100644 --- a/backend/src/utils/history.ts +++ b/backend/src/utils/history.ts @@ -1,6 +1,43 @@ import { FastifyInstance } from "fastify" import { historyitems } from "../../db/schema"; +const HISTORY_ENTITY_LABELS: Record = { + customers: "Kunden", + members: "Mitglieder", + vendors: "Lieferanten", + projects: "Projekte", + plants: "Objekte", + contacts: "Kontakte", + inventoryitems: "Inventarartikel", + customerinventoryitems: "Kundeninventar", + products: "Artikel", + profiles: "Mitarbeiter", + absencerequests: "Abwesenheiten", + events: "Termine", + tasks: "Aufgaben", + vehicles: "Fahrzeuge", + costcentres: "Kostenstellen", + ownaccounts: "zusätzliche Buchungskonten", + documentboxes: "Dokumentenboxen", + hourrates: "Stundensätze", + services: "Leistungen", + roles: "Rollen", + checks: "Überprüfungen", + spaces: "Lagerplätze", + customerspaces: "Kundenlagerplätze", + trackingtrips: "Fahrten", + createddocuments: "Dokumente", + inventoryitemgroups: "Inventarartikelgruppen", + bankstatements: "Buchungen", + incominginvoices: "Eingangsrechnungen", + files: "Dateien", + memberrelations: "Mitgliedsverhältnisse", +} + +export function getHistoryEntityLabel(entity: string) { + return HISTORY_ENTITY_LABELS[entity] || entity +} + export async function insertHistoryItem( server: FastifyInstance, params: { @@ -14,16 +51,18 @@ export async function insertHistoryItem( text?: string } ) { + const entityLabel = getHistoryEntityLabel(params.entity) const textMap = { - created: `Neuer Eintrag in ${params.entity} erstellt`, - updated: `Eintrag in ${params.entity} geändert`, - unchanged: `Eintrag in ${params.entity} unverändert`, - archived: `Eintrag in ${params.entity} archiviert`, - deleted: `Eintrag in ${params.entity} gelöscht` + created: `Neuer Eintrag in ${entityLabel} erstellt`, + updated: `Eintrag in ${entityLabel} geändert`, + unchanged: `Eintrag in ${entityLabel} unverändert`, + archived: `Eintrag in ${entityLabel} archiviert`, + deleted: `Eintrag in ${entityLabel} gelöscht` } const columnMap: Record = { customers: "customer", + members: "customer", vendors: "vendor", projects: "project", plants: "plant", @@ -43,12 +82,15 @@ export async function insertHistoryItem( roles: "role", checks: "check", spaces: "space", + customerspaces: "customerspace", + customerinventoryitems: "customerinventoryitem", trackingtrips: "trackingtrip", createddocuments: "createddocument", inventoryitemgroups: "inventoryitemgroup", bankstatements: "bankstatement", incominginvoices: "incomingInvoice", files: "file", + memberrelations: "memberrelation", } const fkColumn = columnMap[params.entity] diff --git a/backend/src/utils/resource.config.ts b/backend/src/utils/resource.config.ts index 0d5d2e7..3b51c70 100644 --- a/backend/src/utils/resource.config.ts +++ b/backend/src/utils/resource.config.ts @@ -9,6 +9,8 @@ import { contracttypes, costcentres, createddocuments, + customerinventoryitems, + customerspaces, customers, files, filetags, @@ -18,6 +20,7 @@ import { inventoryitemgroups, inventoryitems, letterheads, + memberrelations, ownaccounts, plants, productcategories, @@ -46,7 +49,7 @@ export const resourceConfig = { }, customers: { searchColumns: ["name", "customerNumber", "firstname", "lastname", "notes"], - mtmLoad: ["contacts","projects","plants","createddocuments","contracts"], + mtmLoad: ["contacts","projects","plants","createddocuments","contracts","customerinventoryitems","customerspaces"], table: customers, numberRangeHolder: "customerNumber", }, @@ -57,6 +60,10 @@ export const resourceConfig = { numberRangeHolder: "customerNumber", relationKey: "customer", }, + memberrelations: { + table: memberrelations, + searchColumns: ["type", "billingInterval"], + }, contacts: { searchColumns: ["firstName", "lastName", "email", "phone", "notes"], table: contacts, @@ -99,6 +106,12 @@ export const resourceConfig = { table: inventoryitems, numberRangeHolder: "articleNumber", }, + customerinventoryitems: { + table: customerinventoryitems, + numberRangeHolder: "customerInventoryId", + mtoLoad: ["customer", "customerspace", "product", "vendor"], + searchColumns: ["name", "customerInventoryId", "serialNumber", "description", "manufacturer", "manufacturerNumber"], + }, inventoryitemgroups: { table: inventoryitemgroups }, @@ -133,6 +146,13 @@ export const resourceConfig = { searchColumns: ["name","space_number","type","info_data"], numberRangeHolder: "spaceNumber", }, + customerspaces: { + table: customerspaces, + searchColumns: ["name","space_number","type","info_data","description"], + numberRangeHolder: "space_number", + mtoLoad: ["customer"], + mtmLoad: ["customerinventoryitems"], + }, ownaccounts: { table: ownaccounts, searchColumns: ["name","description","number"], diff --git a/frontend/components/BankAccountAssignInput.vue b/frontend/components/BankAccountAssignInput.vue index 4e02ed1..de4ac30 100644 --- a/frontend/components/BankAccountAssignInput.vue +++ b/frontend/components/BankAccountAssignInput.vue @@ -16,6 +16,7 @@ const toast = useToast() const accounts = ref([]) const ibanSearch = ref("") const showCreate = ref(false) +const resolvingIban = ref(false) const createPayload = ref({ iban: "", @@ -78,6 +79,25 @@ const createAndAssign = async () => { showCreate.value = false } +const resolveCreatePayloadFromIban = async () => { + const normalized = normalizeIban(createPayload.value.iban) + if (!normalized) return + + resolvingIban.value = true + try { + const data = await useFunctions().useBankingResolveIban(normalized) + if (!data) return + + createPayload.value.iban = data.iban || normalized + if (data.bic) createPayload.value.bic = data.bic + if (data.bankName) createPayload.value.bankName = data.bankName + } catch (e) { + // intentionally ignored: user can still enter fields manually + } finally { + resolvingIban.value = false + } +} + loadAccounts() @@ -125,7 +145,21 @@ loadAccounts()
- + + + + Ermitteln + + diff --git a/frontend/components/EntityShow.vue b/frontend/components/EntityShow.vue index 6d6fd31..8cb3ecc 100644 --- a/frontend/components/EntityShow.vue +++ b/frontend/components/EntityShow.vue @@ -2,6 +2,7 @@ import EntityShowSubTimes from "~/components/EntityShowSubTimes.vue"; import WikiEntityWidget from "~/components/wiki/WikiEntityWidget.vue"; +import LabelPrintModal from "~/components/LabelPrintModal.vue"; const props = defineProps({ type: { @@ -136,6 +137,18 @@ const changePinned = async () => { } +const openCustomerInventoryLabelPrint = () => { + modal.open(LabelPrintModal, { + context: { + id: props.item.id, + customerInventoryId: props.item.customerInventoryId, + name: props.item.name, + customerName: props.item.customer?.name, + serialNumber: props.item.serialNumber + } + }) +} +