]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
DNA basics (#14724)
authorfaint <46868845+ficcialfaint@users.noreply.github.com>
Fri, 31 Mar 2023 04:49:25 +0000 (07:49 +0300)
committerGitHub <noreply@github.com>
Fri, 31 Mar 2023 04:49:25 +0000 (22:49 -0600)
* DNA component

* Commit numba 2

* Added DNA into Station Records Computer

* commit numba 3

* commit numba 4

* Vomit also contain DNA component now

* fixed DNA field not clearing after scanning another item

* commit numba 10
Drinking leaves DNA on an object. Breaking glasses, bottles and beakers leave DNA and leave fingerprints/fibers with 40% chance on glass shards. + lotta fixes

* 11

* 12

* 14

* Added DNA guide entry

* FIX

25 files changed:
Content.Client/Forensics/ForensicScannerMenu.xaml.cs
Content.Client/StationRecords/GeneralStationRecordConsoleWindow.xaml.cs
Content.Server/Body/Systems/BloodstreamSystem.cs
Content.Server/Destructible/Thresholds/Behaviors/SpawnEntitiesBehavior.cs
Content.Server/Forensics/Components/DnaComponent.cs [new file with mode: 0644]
Content.Server/Forensics/Components/ForensicScannerComponent.cs
Content.Server/Forensics/Components/ForensicsComponent.cs
Content.Server/Forensics/Systems/ForensicScannerSystem.cs
Content.Server/Forensics/Systems/ForensicsSystem.cs
Content.Server/Medical/VomitSystem.cs
Content.Server/Nutrition/EntitySystems/DrinkSystem.cs
Content.Server/StationRecords/Systems/StationRecordsSystem.cs
Content.Shared/Forensics/ForensicScannerEvent.cs
Content.Shared/StationRecords/GeneralStationRecord.cs
Resources/Locale/en-US/forensics/forensics.ftl
Resources/Locale/en-US/guidebook/guides.ftl
Resources/Locale/en-US/station-records/general-station-records.ftl
Resources/Prototypes/Entities/Mobs/Species/base.yml
Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml
Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml
Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
Resources/Prototypes/Guidebook/security.yml [new file with mode: 0644]
Resources/Prototypes/Guidebook/shiftandcrew.yml
Resources/Server Info/Guidebook/Security/DNA.xml [new file with mode: 0644]
Resources/Server Info/Guidebook/Security/Security.xml [new file with mode: 0644]

index 98561727f417427523b1f67e1b118a3974092857..84ffd7969e7446efb525a7f0ad5e72b995fc6dde 100644 (file)
@@ -52,6 +52,12 @@ namespace Content.Client.Forensics
             {
                 text.AppendLine(fiber);
             }
+            text.AppendLine();
+            text.AppendLine(Loc.GetString("forensic-scanner-interface-dnas"));
+            foreach (var dna in msg.DNAs)
+            {
+                text.AppendLine(dna);
+            }
             Diagnostics.Text = text.ToString();
         }
     }
index 91b3c3d8b708fe94af9476ad406cf85d9d9ee080..b5aa896aeb0b1ac75321f19c50dfcb844d3d4476 100644 (file)
@@ -118,7 +118,11 @@ public sealed partial class GeneralStationRecordConsoleWindow : DefaultWindow
             },
             new Label()
             {
-                Text = Loc.GetString("general-station-record-console-record-fingerprint", ("fingerprint", record.Fingerprint is null ? Loc.GetString("generic-not-available-shorthand") : record.Fingerprint))
+                Text = Loc.GetString("general-station-record-console-record-fingerprint", ("fingerprint", record.Fingerprint ?? Loc.GetString("generic-not-available-shorthand")))
+            },
+            new Label()
+            {
+                Text = Loc.GetString("general-station-record-console-record-dna", ("dna", record.DNA ?? Loc.GetString("generic-not-available-shorthand")))
             }
         };
 
index 4d548dbb3813eb4cbf58aad33f3048a31b31188f..0f37aa9fce61b1ae15a36ff239d2e2b31c4ffa25 100644 (file)
@@ -2,6 +2,7 @@ using Content.Server.Body.Components;
 using Content.Server.Chemistry.EntitySystems;
 using Content.Server.Chemistry.ReactionEffects;
 using Content.Server.Fluids.EntitySystems;
+using Content.Server.Forensics;
 using Content.Server.HealthExaminable;
 using Content.Server.Popups;
 using Content.Shared.Chemistry.Components;
@@ -292,7 +293,14 @@ public sealed class BloodstreamSystem : EntitySystem
             // Pass some of the chemstream into the spilled blood.
             var temp = component.ChemicalSolution.SplitSolution(component.BloodTemporarySolution.Volume / 10);
             component.BloodTemporarySolution.AddSolution(temp, _prototypeManager);
-            _spillableSystem.SpillAt(uid, component.BloodTemporarySolution, "PuddleBlood", false);
+            var puddle = _spillableSystem.SpillAt(uid, component.BloodTemporarySolution, "PuddleBlood", false);
+            if (puddle != null)
+            {
+                var comp = EnsureComp<ForensicsComponent>(puddle.Owner); //TODO: Get rid of .Owner
+                if (TryComp<DnaComponent>(uid, out var dna))
+                    comp.DNAs.Add(dna.DNA);
+            }
+
             component.BloodTemporarySolution.RemoveAllSolution();
         }
 
@@ -331,6 +339,13 @@ public sealed class BloodstreamSystem : EntitySystem
         component.BloodTemporarySolution.RemoveAllSolution();
         tempSol.AddSolution(component.ChemicalSolution, _prototypeManager);
         component.ChemicalSolution.RemoveAllSolution();
-        _spillableSystem.SpillAt(uid, tempSol, "PuddleBlood", true);
+        var puddle = _spillableSystem.SpillAt(uid, tempSol, "PuddleBlood", true);
+
+        if (puddle != null)
+        {
+            var comp = EnsureComp<ForensicsComponent>(puddle.Owner); //TODO: Get rid of .Owner
+            if (TryComp<DnaComponent>(uid, out var dna))
+                comp.DNAs.Add(dna.DNA);
+        }
     }
 }
index a665fc615500e780ec646808709fe89ce7742007..62e8cf6aaba93e425d672dcb82f1dc9985c16c2c 100644 (file)
@@ -1,7 +1,9 @@
+using Content.Server.Forensics;
 using Content.Server.Stack;
 using Content.Shared.Prototypes;
 using Content.Shared.Stacks;
 using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
 
 namespace Content.Server.Destructible.Thresholds.Behaviors
@@ -19,6 +21,9 @@ namespace Content.Server.Destructible.Thresholds.Behaviors
         [DataField("offset")]
         public float Offset { get; set; } = 0.5f;
 
+        [DataField("transferForensics")]
+        public bool DoTransferForensics = false;
+
         public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null)
         {
             var position = system.EntityManager.GetComponent<TransformComponent>(owner).MapPosition;
@@ -37,15 +42,34 @@ namespace Content.Server.Destructible.Thresholds.Behaviors
                 {
                     var spawned = system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector()));
                     system.StackSystem.SetCount(spawned, count);
+
+                    TransferForensics(spawned, system, owner);
                 }
                 else
                 {
                     for (var i = 0; i < count; i++)
                     {
-                        system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector()));
+                        var spawned = system.EntityManager.SpawnEntity(entityId, position.Offset(getRandomVector()));
+
+                        TransferForensics(spawned, system, owner);
                     }
                 }
             }
         }
+
+        public void TransferForensics(EntityUid spawned, DestructibleSystem system, EntityUid owner)
+        {
+            if (!DoTransferForensics ||
+                !system.EntityManager.TryGetComponent<ForensicsComponent>(owner, out var forensicsComponent))
+                return;
+
+            var comp = system.EntityManager.EnsureComponent<ForensicsComponent>(spawned);
+            comp.DNAs = forensicsComponent.DNAs;
+
+            if (!system.Random.Prob(0.4f))
+                return;
+            comp.Fingerprints = forensicsComponent.Fingerprints;
+            comp.Fibers = forensicsComponent.Fibers;
+        }
     }
 }
diff --git a/Content.Server/Forensics/Components/DnaComponent.cs b/Content.Server/Forensics/Components/DnaComponent.cs
new file mode 100644 (file)
index 0000000..101b9a0
--- /dev/null
@@ -0,0 +1,11 @@
+namespace Content.Server.Forensics;
+
+/// <summary>
+/// This component is for mobs that have DNA.
+/// </summary>
+[RegisterComponent]
+public sealed class DnaComponent : Component
+{
+    [DataField("dna"), ViewVariables(VVAccess.ReadWrite)]
+    public string DNA = String.Empty;
+}
index f82ffff9e918b980357795ad4f13043a79609453..7e64a5a05bee7ca40efe7efba8496b226f5f2d82 100644 (file)
@@ -20,6 +20,12 @@ namespace Content.Server.Forensics
         [ViewVariables(VVAccess.ReadOnly)]
         public List<string> Fibers = new();
 
+        /// <summary>
+        /// DNA that the forensic scanner found from the <see cref="DNAComponent"/> on an entity.
+        /// </summary>
+        [ViewVariables(VVAccess.ReadOnly)]
+        public List<string> DNAs = new();
+
         /// <summary>
         /// What is the name of the entity that was scanned last?
         /// </summary>
index bc054d96e1c8a8967e3ba850bf507d285101d734..e814cd025fb00a24ff6b7ad4820841c3bfb33ab0 100644 (file)
@@ -8,5 +8,8 @@ namespace Content.Server.Forensics
 
         [DataField("fibers")]
         public HashSet<string> Fibers = new();
+
+        [DataField("dnas")]
+        public HashSet<string> DNAs = new();
     }
 }
index 1f7df3d82fa1194b969bcb6b3f7615248e5d32b0..83dfc87223af0156c4f5b26c6d858829a392d291 100644 (file)
@@ -47,6 +47,7 @@ namespace Content.Server.Forensics
             var state = new ForensicScannerBoundUserInterfaceState(
                 component.Fingerprints,
                 component.Fibers,
+                component.DNAs,
                 component.LastScannedName,
                 component.PrintCooldown,
                 component.PrintReadyAt);
@@ -69,12 +70,14 @@ namespace Content.Server.Forensics
                 {
                     scanner.Fingerprints = new();
                     scanner.Fibers = new();
+                    scanner.DNAs = new();
                 }
 
                 else
                 {
                     scanner.Fingerprints = forensics.Fingerprints.ToList();
                     scanner.Fibers = forensics.Fibers.ToList();
+                    scanner.DNAs = forensics.DNAs.ToList();
                 }
 
                 scanner.LastScannedName = MetaData(args.Args.Target.Value).EntityName;
@@ -211,6 +214,12 @@ namespace Content.Server.Forensics
             {
                 text.AppendLine(fiber);
             }
+            text.AppendLine();
+            text.AppendLine(Loc.GetString("forensic-scanner-interface-dnas"));
+            foreach (var dna in component.DNAs)
+            {
+                text.AppendLine(dna);
+            }
 
             _paperSystem.SetContent(printed, text.ToString());
             _audioSystem.PlayPvs(component.SoundPrint, uid,
@@ -230,6 +239,7 @@ namespace Content.Server.Forensics
 
             component.Fingerprints = new();
             component.Fibers = new();
+            component.DNAs = new();
             component.LastScannedName = string.Empty;
 
             UpdateUserInterface(uid, component);
index e122ea4555a88fe0d440e23b41eb4ef70df306f4..e59ec9361467bd8835b8ff9875822e40b1843a0f 100644 (file)
@@ -11,7 +11,8 @@ namespace Content.Server.Forensics
         public override void Initialize()
         {
             SubscribeLocalEvent<FingerprintComponent, ContactInteractionEvent>(OnInteract);
-            SubscribeLocalEvent<FingerprintComponent, ComponentInit>(OnInit);
+            SubscribeLocalEvent<FingerprintComponent, ComponentInit>(OnFingeprintInit);
+            SubscribeLocalEvent<DnaComponent, ComponentInit>(OnDNAInit);
         }
 
         private void OnInteract(EntityUid uid, FingerprintComponent component, ContactInteractionEvent args)
@@ -19,11 +20,16 @@ namespace Content.Server.Forensics
             ApplyEvidence(uid, args.Other);
         }
 
-        private void OnInit(EntityUid uid, FingerprintComponent component, ComponentInit args)
+        private void OnFingeprintInit(EntityUid uid, FingerprintComponent component, ComponentInit args)
         {
             component.Fingerprint = GenerateFingerprint();
         }
 
+        private void OnDNAInit(EntityUid uid, DnaComponent component, ComponentInit args)
+        {
+            component.DNA = GenerateDNA();
+        }
+
         private string GenerateFingerprint()
         {
             byte[] fingerprint = new byte[16];
@@ -31,6 +37,19 @@ namespace Content.Server.Forensics
             return Convert.ToHexString(fingerprint);
         }
 
+        private string GenerateDNA()
+        {
+            var letters = new List<string> { "A", "C", "G", "T" };
+            string DNA = String.Empty;
+
+            for (int i = 0; i < 16; i++)
+            {
+                DNA += letters[_random.Next(letters.Count)];
+            }
+
+            return DNA;
+        }
+
         private void ApplyEvidence(EntityUid user, EntityUid target)
         {
             var component = EnsureComp<ForensicsComponent>(target);
index 8751bc6409a1d893a4d9663e5284a4236ce75f5c..ed02bee666be47038fa01cf71e0e31f122b3a4da 100644 (file)
@@ -2,6 +2,7 @@ using Content.Server.Body.Components;
 using Content.Server.Body.Systems;
 using Content.Server.Chemistry.EntitySystems;
 using Content.Server.Fluids.Components;
+using Content.Server.Forensics;
 using Content.Server.Nutrition.Components;
 using Content.Server.Nutrition.EntitySystems;
 using Content.Server.Popups;
@@ -49,6 +50,10 @@ namespace Content.Server.Medical
 
             var puddle = EntityManager.SpawnEntity("PuddleVomit", Transform(uid).Coordinates);
 
+            var forensics = EnsureComp<ForensicsComponent>(puddle);
+            if (TryComp<DnaComponent>(uid, out var dna))
+                forensics.DNAs.Add(dna.DNA);
+
             var puddleComp = Comp<PuddleComponent>(puddle);
 
             SoundSystem.Play("/Audio/Effects/Fluids/splat.ogg", Filter.Pvs(uid), uid, AudioHelpers.WithVariation(0.2f).WithVolume(-4f));
index 678875d61e2dab5ffdc8a7043c8499f445402b2c..933efc268a54fd521160ec54d44b4480cd09573c 100644 (file)
@@ -4,6 +4,7 @@ using Content.Server.Chemistry.Components.SolutionManager;
 using Content.Server.Chemistry.EntitySystems;
 using Content.Server.DoAfter;
 using Content.Server.Fluids.EntitySystems;
+using Content.Server.Forensics;
 using Content.Server.Nutrition.Components;
 using Content.Server.Popups;
 using Content.Shared.Administration.Logs;
@@ -377,6 +378,10 @@ namespace Content.Server.Nutrition.EntitySystems
 
             component.ForceDrink = false;
             args.Handled = true;
+
+            var comp = EnsureComp<ForensicsComponent>(uid);
+            if (TryComp<DnaComponent>(args.Args.Target, out var dna))
+                comp.DNAs.Add(dna.DNA);
         }
 
         private void AddDrinkVerb(EntityUid uid, DrinkComponent component, GetVerbsEvent<AlternativeVerb> ev)
index 8ab2ca21295f09ed2128f0edffd3d2ef2c5db9a1..4b90e64193776f196b352e1da5ccbb52739d5a74 100644 (file)
@@ -74,8 +74,9 @@ public sealed class StationRecordsSystem : EntitySystem
         }
 
         TryComp<FingerprintComponent>(player, out var fingerprintComponent);
+        TryComp<DnaComponent>(player, out var dnaComponent);
 
-        CreateGeneralRecord(station, idUid.Value, profile.Name, profile.Age, profile.Species, profile.Gender, jobId, fingerprintComponent?.Fingerprint, profile, records);
+        CreateGeneralRecord(station, idUid.Value, profile.Name, profile.Age, profile.Species, profile.Gender, jobId, fingerprintComponent?.Fingerprint, dnaComponent?.DNA, profile, records);
     }
 
 
@@ -97,13 +98,16 @@ public sealed class StationRecordsSystem : EntitySystem
     ///     this call will cause an exception. Ensure that a general record starts out with a job
     ///     that is currently a valid job prototype.
     /// </param>
+    /// <param name="mobFingerprint">Fingerprint of the character.</param>
+    /// <param name="dna">DNA of the character.</param>
+    ///
     /// <param name="profile">
     ///     Profile for the related player. This is so that other systems can get further information
     ///     about the player character.
     ///     Optional - other systems should anticipate this.
     /// </param>
     /// <param name="records">Station records component.</param>
-    public void CreateGeneralRecord(EntityUid station, EntityUid? idUid, string name, int age, string species, Gender gender, string jobId, string? mobFingerprint, HumanoidCharacterProfile? profile = null,
+    public void CreateGeneralRecord(EntityUid station, EntityUid? idUid, string name, int age, string species, Gender gender, string jobId, string? mobFingerprint, string? dna, HumanoidCharacterProfile? profile = null,
         StationRecordsComponent? records = null)
     {
         if (!Resolve(station, ref records))
@@ -126,7 +130,8 @@ public sealed class StationRecordsSystem : EntitySystem
             Species = species,
             Gender = gender,
             DisplayPriority = jobPrototype.Weight,
-            Fingerprint = mobFingerprint
+            Fingerprint = mobFingerprint,
+            DNA = dna
         };
 
         var key = AddRecord(station, records);
index 6ea4179c906f0e3a44b7a83f0f125df471c8bbb4..f305125b99ef6eb412b620c9ea8191336fb546b7 100644 (file)
@@ -7,6 +7,7 @@ namespace Content.Shared.Forensics
     {
         public readonly List<string> Fingerprints = new();
         public readonly List<string> Fibers = new();
+        public readonly List<string> DNAs = new();
         public readonly string LastScannedName = string.Empty;
         public readonly TimeSpan PrintCooldown = TimeSpan.Zero;
         public readonly TimeSpan PrintReadyAt = TimeSpan.Zero;
@@ -14,12 +15,14 @@ namespace Content.Shared.Forensics
         public ForensicScannerBoundUserInterfaceState(
             List<string> fingerprints,
             List<string> fibers,
+            List<string> dnas,
             string lastScannedName,
             TimeSpan printCooldown,
             TimeSpan printReadyAt)
         {
             Fingerprints = fingerprints;
             Fibers = fibers;
+            DNAs = dnas;
             LastScannedName = lastScannedName;
             PrintCooldown = printCooldown;
             PrintReadyAt = printReadyAt;
index 74964178c6fd053cf71a022740520ae1004b0b17..de4cda8f251ccd01a184346d5155fc444134364b 100644 (file)
@@ -62,4 +62,10 @@ public sealed class GeneralStationRecord
     /// </summary>
     [ViewVariables]
     public string? Fingerprint;
+
+    /// <summary>
+    ///     DNA of the person.
+    /// </summary>
+    [ViewVariables]
+    public string? DNA;
 }
index f08ac7677837ca6fbe26dd460914fe8149d8a811..88494820ec0ec499e8ee63e1a825cbe6e025920f 100644 (file)
@@ -1,6 +1,7 @@
 forensic-scanner-interface-title = Forensic scanner
 forensic-scanner-interface-fingerprints = Fingerprints
 forensic-scanner-interface-fibers = Fibers
+forensic-scanner-interface-dnas = DNAs
 forensic-scanner-interface-no-data = No scan data available
 forensic-scanner-interface-print = Print
 forensic-scanner-interface-clear = Clear
index deb439a88df7e1128a6daa6e5fd6485f7ed93145..287e47f291b6a72e26534f56a01b7ef46a7be9c7 100644 (file)
@@ -21,3 +21,6 @@ guide-entry-xenoarchaeology = Xenoarchaeology
 guide-entry-artifact-reports = Artifact Reports
 guide-entry-traversal-distorter = Traversal Distorter
 guide-entry-machine-upgrading = Machine Upgrading
+
+guide-entry-security = Security
+guide-entry-dna = DNA
index a041a8cbee73d423779a268b4adedb620f345ddb..7bbde02f74dc559246f4ea513bd5645415ce6eb5 100644 (file)
@@ -8,3 +8,4 @@ general-station-record-console-record-title = Job: {$job}
 general-station-record-console-record-species = Species: {$species}
 general-station-record-console-record-gender = Gender: {$gender}
 general-station-record-console-record-fingerprint = Fingerprint: {$fingerprint}
+general-station-record-console-record-dna = DNA: {$dna}
index 0e09e636b3a773a29c3cfb5e77832c39d3779e21..3c9b8eb85f83d6d22cc8ba59473628c0aa6dac61 100644 (file)
       proper: true
   - type: StandingState
   - type: Fingerprint
+  - type: Dna
   - type: MobPrice
     price: 1500 # Kidnapping a living person and selling them for cred is a good move.
     deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less.
index 2cc7ceb86f8bfd8201a424ec103d28bec7b37552..43b9a64e7ae8fa94ce95f4e9d386cfaa05e6d93f 100644 (file)
@@ -54,6 +54,7 @@
           ShardGlass:
             min: 1
             max: 1
+        transferForensics: true
       - !type:DoActsBehavior
         acts: [ "Destruction" ]
   - type: DamageOnLand
index c41671830f1239dd3492aa82f09316b23026c948..f879ee78ccb907b9a378b5ed12aa17c280e95bfb 100644 (file)
@@ -56,6 +56,7 @@
           BrokenBottle:
             min: 1
             max: 1
+        transferForensics: true
       - !type:DoActsBehavior
         acts: [ "Destruction" ]
   - type: Tag
index 3737054ffdc1d4aa1b6372747b5215678d718852..c27ceb7f8a44d58630b7d6d5f8880b163d18a86b 100644 (file)
@@ -65,6 +65,7 @@
           ShardGlass:
             min: 1
             max: 1
+        transferForensics: true
       - !type:DoActsBehavior
         acts: [ "Destruction" ]
   - type: DamageOnLand
diff --git a/Resources/Prototypes/Guidebook/security.yml b/Resources/Prototypes/Guidebook/security.yml
new file mode 100644 (file)
index 0000000..903cf93
--- /dev/null
@@ -0,0 +1,11 @@
+- type: guideEntry
+  id: Security
+  name: guide-entry-security
+  text: "/Server Info/Guidebook/Security/Security.xml"
+  children:
+    - DNA
+
+- type: guideEntry
+  id: DNA
+  name: guide-entry-dna
+  text: "/Server Info/Guidebook/Security/DNA.xml"
index 80880ddb9523ec36a78e91e8151bace8335fa57f..bfd98014ef3c3de322c15b86c3309d2980ed17cf 100644 (file)
@@ -6,6 +6,7 @@
   - Botany
   - Engineering
   - Science
+  - Security
 
 - type: guideEntry
   id: Survival
diff --git a/Resources/Server Info/Guidebook/Security/DNA.xml b/Resources/Server Info/Guidebook/Security/DNA.xml
new file mode 100644 (file)
index 0000000..1a2820a
--- /dev/null
@@ -0,0 +1,18 @@
+<Document>
+  # DNA
+
+  ## How to get someone’s DNA?
+
+  You can scan blood puddles, vomit, glasses, bottles, cans and other liquid containers using the [color=#a4885c]forensic scanner[/color] to get DNA of any person.
+  <Box>
+    <GuideEntityEmbed Entity="ForensicScanner"/>
+  </Box>
+  So be careful before fighting with someone.
+
+  ## I got DNA. How do I recognize whose it is?
+
+  You can print the forensic information of the object you scanned so you never miss it. Now with the paper containing DNA you can simply find a [color=#a4885c]Station Records Computer[/color] and look for a person whose DNA matches.
+  <Box>
+    <GuideEntityEmbed Entity="ComputerStationRecords"/>
+  </Box>
+</Document>
diff --git a/Resources/Server Info/Guidebook/Security/Security.xml b/Resources/Server Info/Guidebook/Security/Security.xml
new file mode 100644 (file)
index 0000000..3faf9bc
--- /dev/null
@@ -0,0 +1,3 @@
+<Document>
+
+</Document>