classDiagram

    class RelayServer{
        +IpAddress ip
        +PublicKey pk
        
    }
    class Event{
        +Int64 modelHash
        +RelayServer[] relays
        +Commit getCommit()
        
    }
    class Tag{
	    +bool isMaster
			+bool isDeltaModel
			+bool isHead
			+bool isEncrypted
			+bool isMerge
    }
    class Commit{
        +Int64 modelHashID
        +PublicKey author  
        +Int64 authorSignature  
        +DateTime timestamp
        +Tag tag       
        +string commitMessage        
        
        +byte[] getFullModel()
        +bool checkValid()  
        +void rebaseToMaster()
        +double getCompressionRatio()
    }
    class SingleParentModel{
	    +Event parentModel	    	    
    }
    class MergeModel{
	    +Event[] parentModels	    	    
    }
    class DeltaModel{
	    +byte[] modelDelta	    
    }
    class FullModel{
	    +byte[] modelBin
    }    
    SingleParentModel --> Event
    MergeModel --> Event
    Event --> RelayServer
	  Commit <|--SingleParentModel
    Commit <|--MergeModel
    SingleParentModel <|-- DeltaModel
    SingleParentModel <|-- FullModel
    Commit --> Tag