/// <summary>
        /// Creates and seeds a new fragment.
        /// </summary>
        /// <param name="item">The item this part should belong to.</param>
        /// <param name="location">The location.</param>
        /// <param name="baseText">The base text.</param>
        /// <returns>A new fragment.</returns>
        /// <exception cref="ArgumentNullException">item or location or
        /// baseText</exception>
        public override ITextLayerFragment GetFragment(
            IItem item, string location, string baseText)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            if (location == null)
            {
                throw new ArgumentNullException(nameof(location));
            }
            if (baseText == null)
            {
                throw new ArgumentNullException(nameof(baseText));
            }

            Faker f = new Faker();
            ApparatusLayerFragment fr = new ApparatusLayerFragment
            {
                Location = location,
                Tag      = f.Lorem.Word()
            };
            int n = Randomizer.Seed.Next(1, 4);

            for (int i = 1; i <= n; i++)
            {
                ApparatusEntry entry = new ApparatusEntry
                {
                    Type = (ApparatusEntryType)Randomizer.Seed.Next(0, 4)
                };
                if (Randomizer.Seed.Next(1, 6) == 1)
                {
                    entry.Tag = f.Lorem.Word();
                }

                // note
                if (entry.Type == ApparatusEntryType.Note)
                {
                    entry.Note = f.Lorem.Sentence();
                    // authors
                    foreach (string author in SeedHelper.RandomPickOf(_authors, 2))
                    {
                        entry.Authors.Add(
                            new ApparatusAnnotatedValue {
                            Value = author
                        });
                    }
                }
                // variant
                else
                {
                    entry.Value      = f.Lorem.Word();
                    entry.NormValue  = entry.Value.ToUpperInvariant();
                    entry.IsAccepted = i == 1;

                    // witnesses
                    foreach (string witness in SeedHelper.RandomPickOf(_witnesses, 2))
                    {
                        entry.Authors.Add(
                            new ApparatusAnnotatedValue {
                            Value = witness
                        });
                    }

                    // authors
                    foreach (string author in SeedHelper.RandomPickOf(_authors, 1))
                    {
                        entry.Authors.Add(
                            new ApparatusAnnotatedValue {
                            Value = author
                        });
                    }
                }

                fr.Entries.Add(entry);
            }

            return(fr);
        }