Giter Site home page Giter Site logo

wdbxeditor's Introduction

WDBX Editor

Latest Download Bountysource WoWDevDiscord

Build Status

CI Build
AppVeyor Build status

About

This editor has full support for reading and saving all release versions of DBC, DB2, WDB, ADB and DBCache. This does include support for Legion DB2 and DBCache files and works with all variants (header flags) of these. Like the other editors I've used a definition based system whereby definitions tell the editor how to interpret each file's columns - this is a lot more reliable than guessing column types but does mean the definitions must be maintained. So far, I've mapped almost all expansions with MoP being ~50% complete and everything else being 99%+ (excluding column names).

You will need Microsoft .NET Framework 4.6.1 to run this application

Features:

  • Full support of release versions of DBC, DB2, WDB, ADB and DBCache (WCH3 and WCH4 are not supported as I deem them depreciated)
  • Supports being the default file assocation
  • Opening and having open multiple files regardless of type and build
  • Open DBC/DB2 files from both MPQ archives and CASC directories
  • Save single (to file) and save all (to folder)
  • Standard CRUD operations as well as go to, copy row, paste row, undo and redo
  • Hide, show, hide empty and sort columns
  • A relatively powerful column filter system (similar to boolean search)
  • Displaying and editing columns in hex (numeric columns only)
  • Exporting to a SQL database, SQL file, CSV file and MPQ archives
  • Importing from a SQL database and a CSV file
  • An Excel style Find and Replace
  • Shortcuts for common tasks using common shortcut key combinations
  • A help file to try and cover off some of the pitfalls and caveats of the program (needs some work)
  • A simple memory reader to get player's co-ordinates from the client
  • A colour picker for LightData and LightIntBand

Tools:

  • Definition editor for maintaining the definitions
  • WotLK Item Import to remove the dreaded red question mark from custom items
  • Legion Parser which is an attempt to automatically parse the structure of WDB5 and WDB6 files

Project Goal:

The goal of this project is to create a communal program that is compatible with all file variants, is feature rich and negates the need to use multiple different programs. This means any and all contribution in the form of commits, change requests, issues etc are more than welcome!

Credits:

Credits go to Ladislav Zezula for the awesome StormLib and thanks to all those that contribute to the WoWDev wiki. I've also patched the definitions together for various sources across the internet, there are too many to name, but thanks to all.

wdbxeditor's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wdbxeditor's Issues

Copy rows does not set db2 to modified

Hello, heres the issue:

When I copy a row in the item.db2 from current legion patch and insert it into a new row. Without changing any data WDBX does not recognize any changes and therefor not saves the new entry. After reload its gone. Theres also no * after the File indicating any changes.

https://gyazo.com/91d1719e3067efdd739491b7721d64b7

Steops to reproduce:

  1. Open item.db2
  2. Copy any row
  3. insert row in complete new Row.
  4. Save
  5. Reopen
  6. Entry gone.

This can be prevented by changing any colum entry to a diffrent value. Still a huge bug though.

[Suggestion] Index colums editable

As it is now Index couls like ID's cant be edited. But they need to. For example:

Item.db2 colum 1 refernces ItemSparse.db2 colum 1. So these need to be Identical.
I cant edit them. Would be great if you could make those editable.

WDC2 support

Life isn't fair, I know. Expecting wiki to get updated in the next few days.

IDs not being refreshed

If you accidentally create an empty line, then delete it, and after that create a new one, it will have the ID of that empty line + 1, not the same ID as it's supposed to

Definitions 7.3.5 25632

CharacterFacialHairstyles
Field Name="ID" Type="int" IsIndex="true"
Field Name="Geoset" Type="uint" ArraySize="5"
Field Name="Race" Type="byte"
Field Name="Sex" Type="byte"
Field Name="Mesh_ID" Type="byte" /

CharHairGeosets
Field Name="ID" Type="int" IsIndex="true"
Field Name="RootGeosetID" Type="uint"
Field Name="Race" Type="byte"
Field Name="Sex" Type="byte"
Field Name="CharSection_ID" Type="byte"
Field Name="Flag" Type="byte"
Field Name="Expansion" Type="byte"
Field Name="Field0D" Type="byte"
Field Name="Field0E" Type="byte"
Field Name="Field0F" Type="byte"
Field Name="Field10" Type="byte"

CharSections
Field Name="ID" Type="int" IsIndex="true"
Field Name="TextureFileDataID" Type="uint" ArraySize="3"
Field Name="Flags" Type="ushort"
Field Name="Race" Type="byte"
Field Name="Gender" Type="byte"
Field Name="GenType" Type="byte"
Field Name="Type" Type="byte"
Field Name="Color" Type="byte"

ChrRaces
Field Name="ClientPrefix" Type="string"
Field Name="ClientFileString" Type="string"
Field Name="Name" Type="string"
Field Name="NameFemale" Type="string"
Field Name="LowercaseName" Type="string"
Field Name="LowercaseNameFemale" Type="string"
Field Name="Flags" Type="int"
Field Name="MaleDisplayID" Type="int"
Field Name="FemaleDisplayID" Type="int"
Field Name="CreateScreenFileDataID" Type="int"
Field Name="SelectScreenFileDataID" Type="int"
Field Name="MaleCustomizeOffset" Type="float" ArraySize="3"
Field Name="FemaleCustomizeOffset" Type="float" ArraySize="3"
Field Name="LowResScreenFileDataID" Type="int"
Field Name="StartingLevel" Type="int"
Field Name="UIDisplayOrder" Type="int"
Field Name="FactionID" Type="ushort"
Field Name="ResSicknessSpellID" Type="ushort"
Field Name="SplashSoundID" Type="ushort"
Field Name="CinematicSequenceID" Type="ushort"
Field Name="BaseLanguage" Type="byte"
Field Name="CreatureType" Type="byte"
Field Name="TeamID" Type="byte"
Field Name="RaceRelated" Type="byte"
Field Name="UnalteredVisualRaceID" Type="byte"
Field Name="CharComponentTextureLayoutID" Type="byte"
Field Name="DefaultClassID" Type="byte"
Field Name="NeutralRaceID" Type="byte"
Field Name="ItemAppearanceFrameRaceID" Type="byte"
Field Name="CharComponentTexLayoutHiResID" Type="byte"
Field Name="ID" Type="int" IsIndex="true"
Field Name="HighResMaleDisplayID" Type="int"
Field Name="HighResFemaleDisplayID" Type="int"
Field Name="HeritageArmorAchievementID" Type="int"
Field Name="MaleCorpseBonesModelFileDataID" Type="int"
Field Name="FemaleCorpseBonesModelFileDataID" Type="int"
Field Name="AlteredFormTransitionSpellVisualID" Type="int" ArraySize="3"
Field Name="AlteredFormTransitionSpellVisualKitID" Type="int" ArraySize="3"

CreatureDisplayInfo
Field Name="ID" Type="int" IsIndex="true"
Field Name="CreatureModelScale" Type="float"
Field Name="ModelID" Type="ushort"
Field Name="NPCSoundID" Type="ushort"
Field Name="SizeClass" Type="byte"
Field Name="Flags" Type="byte"
Field Name="Gender" Type="byte"
Field Name="ExtendedDisplayInfoID" Type="uint"
Field Name="PortraitTextureFileDataID" Type="uint"
Field Name="CreatureModelAlpha" Type="byte"
Field Name="SoundID" Type="ushort"
Field Name="PlayerModelScale" Type="float"
Field Name="PortraitCreatureDisplayInfoID" Type="int"
Field Name="BloodID" Type="int"
Field Name="ParticleColorID" Type="int"
Field Name="CreatureGeosetData" Type="int"
Field Name="ObjectEffectPackageID" Type="int"
Field Name="AnimReplacementSetID" Type="int"
Field Name="UnarmedWeaponSubclass" Type="int"
Field Name="StateSpellVisualKitID" Type="int"
Field Name="InstanceOtherPlayerPetScale" Type="float"
Field Name="MountSpellVisualKitID" Type="int"
Field Name="TextureVariation" Type="int" ArraySize="3"

CreatureDisplayInfoExtra
Field Name="ID" Type="int" IsIndex="true"
Field Name="FileDataID" Type="int"
Field Name="HDFileDataID" Type="int"
Field Name="DisplayRaceID" Type="byte"
Field Name="DisplaySexID" Type="byte"
Field Name="DisplayClassID" Type="byte"
Field Name="SkinID" Type="byte"
Field Name="FaceID" Type="byte"
Field Name="HairStyleID" Type="byte"
Field Name="HairColorID" Type="byte"
Field Name="FacialHairID" Type="byte"
Field Name="CustomDisplayOption" Type="byte" ArraySize="3"
Field Name="Flags" Type="byte"

CreatureModelData
Field Name="ID" Type="int" IsIndex="true"
Field Name="ModelScale" Type="float"
Field Name="FootprintTextureLength" Type="float"
Field Name="FootprintTextureWidth" Type="float"
Field Name="FootprintParticleScale" Type="float"
Field Name="CollisionWidth" Type="float"
Field Name="CollisionHeight" Type="float"
Field Name="MountHeight" Type="float"
Field Name="GeoBoxMin" Type="float" ArraySize="3"
Field Name="GeoBoxMax" Type="float" ArraySize="3"
Field Name="WorldEffectScale" Type="float"
Field Name="AttachedEffectScale" Type="float"
Field Name="MissileCollisionRadius" Type="float"
Field Name="MissileCollisionPush" Type="float"
Field Name="MissileCollisionRaise" Type="float"
Field Name="OverrideLootEffectScale" Type="float"
Field Name="OverrideNameScale" Type="float"
Field Name="OverrideSelectionRadius" Type="float"
Field Name="TamedPetBaseScale" Type="float"
Field Name="HoverHeight" Type="float"
Field Name="Flags" Type="int"
Field Name="FileDataID" Type="int"
Field Name="SizeClass" Type="byte"
Field Name="BloodID" Type="int"
Field Name="FootprintTextureID" Type="byte"
Field Name="FoleyMaterialID" Type="byte"
Field Name="FootstepEffectID" Type="byte"
Field Name="DeathThudEffectID" Type="byte"
Field Name="SoundID" Type="int"
Field Name="CreatureGeosetDataID" Type="int"

ItemDisplayInfo
Field Name="ID" Type="int" IsIndex="true"
Field Name="Field01" Type="int"
Field Name="Field02" Type="int"
Field Name="ItemVisualID" Type="int"
Field Name="Field04" Type="int"
Field Name="Field05" Type="int"
Field Name="Field06" Type="int"
Field Name="Field07" Type="int"
Field Name="Field08" Type="int"
Field Name="Field09" Type="int"
Field Name="Field0A" Type="int"
Field Name="Modelfiledata" Type="int" ArraySize="2"
Field Name="Texturefiledata" Type="int" ArraySize="2"
Field Name="Field0D" Type="int" ArraySize="4"
Field Name="Field0E" Type="int" ArraySize="4"
Field Name="GeosetFlag" Type="int" ArraySize="2"

Light
Field Name="ID" Type="int" IsIndex="true"
Field Name="Pos" Type="float" ArraySize="3"
Field Name="FalloffStart" Type="float"
Field Name="FalloffEnd" Type="float"
Field Name="MapID" Type="ushort"
Field Name="LightParamsID" Type="ushort" ArraySize="8"

LightParams
Field Name="Field00" Type="float"
Field Name="Field04" Type="float"
Field Name="Field08" Type="float"
Field Name="Field0C" Type="float"
Field Name="Field10" Type="float"
Field Name="Field14" Type="int" ArraySize="3"
Field Name="LightSkyboxID" Type="ushort"
Field Name="Field22" Type="byte"
Field Name="Field23" Type="byte"
Field Name="Field24" Type="byte"
Field Name="ID" Type="int" IsIndex="true"

LightSkybox
Field Name="ID" Type="int" IsIndex="true"
Field Name="SkyboxPathName" Type="string"
Field Name="Field2" Type="int"
Field Name="Field3" Type="int"
Field Name="Field4" Type="byte"

NpcModelItemSlotDisplayInfo
Field Name="ID" Type="int" IsIndex="true"
Field Name="DisplayID" Type="int"
Field Name="Slot" Type="byte"

SoundKit
Field Name="ID" Type="int" IsIndex="true"
Field Name="VolumeFloat" Type="float"
Field Name="MinDistance" Type="float"
Field Name="DistanceCutoff" Type="float"
Field Name="Field04" Type="ushort"
Field Name="Field05" Type="ushort"
Field Name="Field06" Type="byte"
Field Name="Field07" Type="byte"
Field Name="Field08" Type="byte"
Field Name="Field09" Type="float"
Field Name="Field0A" Type="float"
Field Name="Field0B" Type="float"
Field Name="Field0C" Type="float"
Field Name="Field0D" Type="float"
Field Name="Field0E" Type="float"
Field Name="Field0F" Type="float"

SoundKitName
Field Name="ID" Type="int" IsIndex="true"
Field Name="name" Type="string"

export sql on file on computers outside enUS wrong punkt/comma behavior

if you let windows make translate between single and string,
then he will take the current locale (deDE) as global command and replace "." with ","
in result the count of columns is wrong in parsed SQL string

in the function ToSQL you can make a additional check for float

`
public static string ToSql(this DataRow row)
{
StringBuilder sb = new StringBuilder();
DataColumnCollection cols = row.Table.Columns;

        for (int i = 0; i < cols.Count; i++)
        {
            if (cols[i].DataType.Name.Equals("string", StringComparison.CurrentCultureIgnoreCase)) //Escape formatting
            {
                string val = row[i].ToString().Replace(@"'", @"\'").Replace(@"""", @"\""");
                sb.Append("\"" + val + "\",");
            }
            else if (cols[i].DataType.Name.Equals("single", StringComparison.CurrentCultureIgnoreCase))//Escape formatting
            {
                sb.Append(row[i].ToString().Replace(",", ".") + ",");
            }
            else
                sb.Append(row[i] + ",");
        }

        return sb.ToString().TrimEnd(',');
    }

`

SpellXSpellVisual.db2

first thx for the great tool

the problem when I try to open SpellXSpellVisual.db2 it give this error (Id column contains duplicates)

\ Characters are not escaped properly

When exporting, "" is exported as "" which causes the character to disappear. I tried looking through your code and could only get to DataRow.toSql(), A simple solution is to replace every \ character with \\

wotlk SpellVisualKit.dbc

3.5.5a SpellVisualKit structure does not include "animKitID" so all of the field values are moved one step left because "animKitID" is originally the "headEffect" . For example "baseEffect" would be the the "leftHandEffect" :

bug

Results are always erased

Every time I load a Legion DB2 file, the results are loaded in the table, but a second later they are all erased and only the column headers are shown. No errors are displayed, until I try to manipulate the table, then a NullReferenceException is raised in WDBXEditor.Main.NewLine().

Something went wrong with db2 saving

When opening ItemSparse.db2 for 7.3.5 - everything is fine. After saving, filesize changes even if no changes made and db2 file ingame (replaced serverside) causes different bugs such as missmatching item slots.

TextureFileData.db2 build 7.3.5 25XXX

Hi again, sorry but your solution does not seem to work even after getting the size limit of the ID column
being an int22. I don't understand cause base texture work but not the added ones. My brain hurts x)

As a somewhat frequent user, I wish for opening the same file/storage repeatedly to be easier

I usually do a "Load from CASC" for the same source (the WOW client). However, every time I do that I have to fully navigate the entire file system in my search for the folder, regardless of whether or not it has changed. This is taking a lot of time and it's unnecessarily annoying, making working with the editor on a regular basis a bit of a hassle.

A few suggestions to resolve this issue:

  • Add a "Recent files" feature, as many programs do, allowing me to open the same few files/containers more easily. It's not a problem if it has to rescan, so obviously I wouldn't expect it to save anything more than the path/file names; it's the selecting that takes most of the time anyway
  • Change the "Open from CASC" (and, presumably, similar dialogs) to use a different selection system, so that paths can be copied and pasted at the very least. There's an edit box right next to the "Browse" button, but alas - it is read-only!

Unfortunately I am clueless when it comes to .NET, which means I am unable to provide a solution that is ready to merge via PR at this time :(

Edit: I just noticed that if the opening process fails, the path is even saved in the edit box. However, there is no way to re-open it and try again, so all that remains is to click "Browse" and navigate the entire path once more. Maybe adding a second button to open the path given in said box would be helpful? If the box was made writeable then it could also be used to manually enter the path instead of having to select it via the terrible GUI element.

PS: If there's an easier way that I missed, please enlighten me!

Errors in Visual Studio 2017.

I can't build it in MS VS2017.

Error code: CS0234, Dataflow not exist in System.Threading.Tasks

Fix please, thank you.

WDBX gives an error on opening multiple files

WDBX crashes on navigating between multiple files. Tested on opening GroundEffectTexture.dbc and GroundEfffectDoodad.dbc at the same time. Switching between them causes an error. Wotlk.

complie error

where can i found AdvanceDataGridView.dll?
Second, c# has no 'long'

Critical bug

Well, I can't get the reason of bug, but each time I editing Spell.dbc (1.12.1 version), its become corrupted (all DoTs timers are broken). I think there's some issue with m_effectAmplitude decrypt method.
Sorry, really can show you more info, except of where the problem is.
P.S. for rend effectamplitude should be 3000, but in WDBX its shows 4,203895E-42 , and when importing to SQL it become 4... And when patching SQL>DBC its become 0.

btw would be nice if someone can check other possible broken rows with same issue(it bet its possible)

Spell.db2 7.3.5 (25xxx)

Cannot be edited. The following error is being shown:

ERROR Spell.db2 : Id column contains duplicates.

Would be nice if you could fix it somehow.

New data formats in 7.3 should be supported.

I haven't done much digging but I've been messing around with a couple of tables and noticed you don't support some things (or don't show it at least).

Take for example the Achievement db in 7.3 (24492).
There are two anomalies that should be accounted for:

  • The ID is a short, not an int. But you force ints. This can be fairly easy if you just cast the short to an int.
  • The IconID is now a three byte little endian number. This is definitely harder to handle than the previous one but still should be accounted for.

(Also I think the field count should be Suggested, not enforced. Or at least provide a way to name array elements.)

There's probably many more things that blizz's changed as well but these are things that I've noticed in the past couple of hours.

map.db2 build 24793 : definition

<Field Name="ID" Type="int" IsIndex="true" />
<Field Name="Directory" Type="string" />
<Field Name="Flags" Type="uint" ArraySize="2" />
<Field Name="MinimapIconScale" Type="float" />
<Field Name="Corpse" Type="float" ArraySize="2" />
<Field Name="MapNameLocale" Type="string" />
<Field Name="MapDescLocale_1" Type="string" />
<Field Name="MapDescLocale_2" Type="string" />
<Field Name="ShortDescription" Type="string" />
<Field Name="LongDescription" Type="string" />
<Field Name="AreaTableID" Type="ushort" />
<Field Name="LoadingScreenID" Type="ushort" />
<Field Name="CorpseMapID" Type="short" />
<Field Name="TimeOfDayOverride" Type="ushort" />
<Field Name="ParentMapID" Type="short" />
<Field Name="CosmeticParentMapID" Type="short" />
<Field Name="WindSettingsID" Type="ushort" />
<Field Name="InstanceType" Type="byte" />
<Field Name="unk5" Type="byte" />
<Field Name="ExpansionID" Type="byte" />
<Field Name="MaxPlayers" Type="byte" />
<Field Name="TimeOffset" Type="byte" />

7.3.5 db2, bad handling of editions

So I tried lot's of configuration, brut editing in the software, CSV importing, SQL importing.
TextureFileData is not saved well, it fucks up in game.
ModelFileData too.
Both are saved well at first glance but in game it's fucked up.

Itemdisplayinfo too. CSV, SQL not saved + can't brut edit it since the software is crashing upon scrolling and going to the cell. Can't even save the new value that I wrote. Software just stop working and i can't even quit it the normal way.

CreatureDisplayInfo too, hotfix table works but not the wdbx edit, CSV + SQL, can't even open it anymore after saving the changes.

Some other errors like CharSections.db2, in CSV format sometimes I got an error when importing the csv. Datatype problem whereas with SQL import there's no problem.

Hope it helps you !

6.2.3 bug with SpellXSpellVisual.db2

when I edit SpellXSpellVisual.db2 from 6.2.3
it bugged some of it colunms and it corrupt the db2 file
like SpellVisual is shown on playercondtion
SpellVisual1 and SpellVisual2 is always 0 and I tried to add you in discord
yet most other db2 I tested work perfectly

MoP Map.dbc

ERROR Map.dbc : Definition exceeds record size

Tried Cata, MoP and WoD definitions - all same

Map.zip

MoP CharSections.dbc

ERROR CharSections.dbc : Id column contains duplicates.

This dbc is from a WoD character models for MoP patch, and it works ingame, but I can't edit it due to the error above

CharSections.zip

Will this tool work on the latest builds?

I seem to be getting "No Records Found" errors when running this against the latest. Just wanted to check if I'm doing something wrong.

I'm running this against the QuestCache.wdb file.

Error while loading Map.dbc

Hi there :)

I'm having an issue with the French version of Map.dbc for WOTLK client.
Everytime I try to open it, I get : "ERROR Map.dbc : Definition exceeds record size".

If I try it with the English version of the DBC, it opens with no problem.
Maps.zip

Adding a line when first m_ID is not 0

I noticed something very disturbing, whenever the first line's m_ID is not 0, it will automatically add a line with m_ID 0, causing the m_ID 1 to become the 0, the 2 becoming the 1 and so on, leading to a huge mess, what can I do to fix this ?

Can't use custom

https://transfer.sh/CBkhi/2018-03-13_20-37-49.webm

https://i.imgur.com/Cp0yf9x.png

If we have an id higher than 1048575, WDBX can save (if we bypass) but it don't use the ID we've put in it. He maybe use custom added texture with a FileDataID higher than 1048575 and that's why his texture is fucked up in game.

The last FileDataID from 7.3.5.26124 is 1869802, so higher than 1048575. And there's multiples rows who get a FileDataID higher than that in CreatureModelData.db2... I hope a fix, thanks for your work Barn!

Saving parsed definitions is just bad

Clicking save gives no feedback (other than asking you to overwrite it if it exists already)
The build you enter is never used.
Seems to just overwrite whichever pre-installed definitions is closest to it.
Definitions reset to default when you exit the program.

Problem while saving db2 file

creaturedisplayinfo.db2 (25864) edit with version 1.1.1a
whenever try to save it, following message showed up
"Error exporting to file One or more errors occurred"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.