xref: /webtrees/app/Statistics.php (revision f70bcff589628705e50ed72a6fc6cbad68558677)
19219296aSGreg Roach<?php
23976b470SGreg Roach
39219296aSGreg Roach/**
49219296aSGreg Roach * webtrees: online genealogy
52da2e0a6SGreg Roach * Copyright (C) 2021 webtrees development team
69219296aSGreg Roach * This program is free software: you can redistribute it and/or modify
79219296aSGreg Roach * it under the terms of the GNU General Public License as published by
89219296aSGreg Roach * the Free Software Foundation, either version 3 of the License, or
99219296aSGreg Roach * (at your option) any later version.
109219296aSGreg Roach * This program is distributed in the hope that it will be useful,
119219296aSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
129219296aSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
139219296aSGreg Roach * GNU General Public License for more details.
149219296aSGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
169219296aSGreg Roach */
17fcfa147eSGreg Roach
189219296aSGreg Roachdeclare(strict_types=1);
199219296aSGreg Roach
209219296aSGreg Roachnamespace Fisharebest\Webtrees;
219219296aSGreg Roach
229219296aSGreg Roachuse Fisharebest\Webtrees\Module\ModuleBlockInterface;
239219296aSGreg Roachuse Fisharebest\Webtrees\Module\ModuleInterface;
249219296aSGreg Roachuse Fisharebest\Webtrees\Services\ModuleService;
25e5a6b4d4SGreg Roachuse Fisharebest\Webtrees\Services\UserService;
269219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\BrowserRepository;
279219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\ContactRepository;
289219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\EventRepository;
299219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\FamilyDatesRepository;
309219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\FamilyRepository;
319219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\FavoritesRepository;
329219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\GedcomRepository;
339219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\HitCountRepository;
349219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\IndividualRepository;
359219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\BrowserRepositoryInterface;
369219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\ContactRepositoryInterface;
379219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\EventRepositoryInterface;
389219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\FamilyDatesRepositoryInterface;
399219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\FavoritesRepositoryInterface;
409219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\GedcomRepositoryInterface;
419219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\HitCountRepositoryInterface;
429219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\IndividualRepositoryInterface;
439219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\LatestUserRepositoryInterface;
449219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\MediaRepositoryInterface;
459219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\MessageRepositoryInterface;
469219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\NewsRepositoryInterface;
479219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\PlaceRepositoryInterface;
489219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\ServerRepositoryInterface;
499219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\Interfaces\UserRepositoryInterface;
509219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\LatestUserRepository;
519219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\MediaRepository;
529219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\MessageRepository;
539219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\NewsRepository;
549219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\PlaceRepository;
559219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\ServerRepository;
569219296aSGreg Roachuse Fisharebest\Webtrees\Statistics\Repository\UserRepository;
574c78e066SGreg Roachuse Fisharebest\Webtrees\Statistics\Service\CountryService;
58e6f3d5e2SGreg Roachuse Illuminate\Database\Query\Builder;
59f021177cSGreg Roachuse Illuminate\Support\Collection;
60f021177cSGreg Roachuse ReflectionClass;
61f021177cSGreg Roachuse ReflectionException;
629219296aSGreg Roachuse ReflectionMethod;
636dd2d083SGreg Roachuse ReflectionNamedType;
649219296aSGreg Roach
65b19e047dSGreg Roachuse function call_user_func;
6671378461SGreg Roachuse function count;
6771378461SGreg Roachuse function in_array;
68dec352c1SGreg Roachuse function str_contains;
6971378461SGreg Roach
709219296aSGreg Roach/**
719219296aSGreg Roach * A selection of pre-formatted statistical queries.
729219296aSGreg Roach * These are primarily used for embedded keywords on HTML blocks, but
739219296aSGreg Roach * are also used elsewhere in the code.
749219296aSGreg Roach */
759219296aSGreg Roachclass Statistics implements
769219296aSGreg Roach    GedcomRepositoryInterface,
779219296aSGreg Roach    IndividualRepositoryInterface,
789219296aSGreg Roach    EventRepositoryInterface,
799219296aSGreg Roach    MediaRepositoryInterface,
809219296aSGreg Roach    UserRepositoryInterface,
819219296aSGreg Roach    ServerRepositoryInterface,
829219296aSGreg Roach    BrowserRepositoryInterface,
839219296aSGreg Roach    HitCountRepositoryInterface,
849219296aSGreg Roach    LatestUserRepositoryInterface,
859219296aSGreg Roach    FavoritesRepositoryInterface,
869219296aSGreg Roach    NewsRepositoryInterface,
879219296aSGreg Roach    MessageRepositoryInterface,
889219296aSGreg Roach    ContactRepositoryInterface,
899219296aSGreg Roach    FamilyDatesRepositoryInterface,
909219296aSGreg Roach    PlaceRepositoryInterface
919219296aSGreg Roach{
929219296aSGreg Roach    /**
9371378461SGreg Roach     * Generate statistics for a specified tree.
9471378461SGreg Roach     *
9571378461SGreg Roach     * @var Tree
9671378461SGreg Roach     */
9771378461SGreg Roach    private $tree;
989219296aSGreg Roach    /**
999219296aSGreg Roach     * @var GedcomRepository
1009219296aSGreg Roach     */
1019219296aSGreg Roach    private $gedcomRepository;
1029219296aSGreg Roach
1039219296aSGreg Roach    /**
1049219296aSGreg Roach     * @var IndividualRepository
1059219296aSGreg Roach     */
1069219296aSGreg Roach    private $individualRepository;
1079219296aSGreg Roach
1089219296aSGreg Roach    /**
1099219296aSGreg Roach     * @var FamilyRepository
1109219296aSGreg Roach     */
1119219296aSGreg Roach    private $familyRepository;
1129219296aSGreg Roach
1139219296aSGreg Roach    /**
1149219296aSGreg Roach     * @var MediaRepository
1159219296aSGreg Roach     */
1169219296aSGreg Roach    private $mediaRepository;
1179219296aSGreg Roach
1189219296aSGreg Roach    /**
1199219296aSGreg Roach     * @var EventRepository
1209219296aSGreg Roach     */
1219219296aSGreg Roach    private $eventRepository;
1229219296aSGreg Roach
1239219296aSGreg Roach    /**
1249219296aSGreg Roach     * @var UserRepository
1259219296aSGreg Roach     */
1269219296aSGreg Roach    private $userRepository;
1279219296aSGreg Roach
1289219296aSGreg Roach    /**
1299219296aSGreg Roach     * @var ServerRepository
1309219296aSGreg Roach     */
1319219296aSGreg Roach    private $serverRepository;
1329219296aSGreg Roach
1339219296aSGreg Roach    /**
1349219296aSGreg Roach     * @var BrowserRepository
1359219296aSGreg Roach     */
1369219296aSGreg Roach    private $browserRepository;
1379219296aSGreg Roach
1389219296aSGreg Roach    /**
1399219296aSGreg Roach     * @var HitCountRepository
1409219296aSGreg Roach     */
1419219296aSGreg Roach    private $hitCountRepository;
1429219296aSGreg Roach
1439219296aSGreg Roach    /**
1449219296aSGreg Roach     * @var LatestUserRepository
1459219296aSGreg Roach     */
1469219296aSGreg Roach    private $latestUserRepository;
1479219296aSGreg Roach
1489219296aSGreg Roach    /**
1499219296aSGreg Roach     * @var FavoritesRepository
1509219296aSGreg Roach     */
1519219296aSGreg Roach    private $favoritesRepository;
1529219296aSGreg Roach
1539219296aSGreg Roach    /**
1549219296aSGreg Roach     * @var NewsRepository
1559219296aSGreg Roach     */
1569219296aSGreg Roach    private $newsRepository;
1579219296aSGreg Roach
1589219296aSGreg Roach    /**
1599219296aSGreg Roach     * @var MessageRepository
1609219296aSGreg Roach     */
1619219296aSGreg Roach    private $messageRepository;
1629219296aSGreg Roach
1639219296aSGreg Roach    /**
1649219296aSGreg Roach     * @var ContactRepository
1659219296aSGreg Roach     */
1669219296aSGreg Roach    private $contactRepository;
1679219296aSGreg Roach
1689219296aSGreg Roach    /**
1699219296aSGreg Roach     * @var FamilyDatesRepository
1709219296aSGreg Roach     */
1719219296aSGreg Roach    private $familyDatesRepository;
1729219296aSGreg Roach
1739219296aSGreg Roach    /**
1749219296aSGreg Roach     * @var PlaceRepository
1759219296aSGreg Roach     */
1769219296aSGreg Roach    private $placeRepository;
1779219296aSGreg Roach
1789219296aSGreg Roach    /**
1799219296aSGreg Roach     * @var ModuleService
1809219296aSGreg Roach     */
1819219296aSGreg Roach    private $module_service;
1829219296aSGreg Roach
1839219296aSGreg Roach    /**
1849219296aSGreg Roach     * Create the statistics for a tree.
1859219296aSGreg Roach     *
1864c78e066SGreg Roach     * @param CountryService $country_service
1879219296aSGreg Roach     * @param ModuleService  $module_service
1889219296aSGreg Roach     * @param Tree           $tree Generate statistics for this tree
189e5a6b4d4SGreg Roach     * @param UserService    $user_service
1909219296aSGreg Roach     */
1919219296aSGreg Roach    public function __construct(
1924c78e066SGreg Roach        CountryService $country_service,
1939219296aSGreg Roach        ModuleService $module_service,
194e5a6b4d4SGreg Roach        Tree $tree,
195e5a6b4d4SGreg Roach        UserService $user_service
19698afcacfSGreg Roach    ) {
1979219296aSGreg Roach        $this->tree                  = $tree;
1989219296aSGreg Roach        $this->gedcomRepository      = new GedcomRepository($tree);
1999219296aSGreg Roach        $this->individualRepository  = new IndividualRepository($tree);
2009219296aSGreg Roach        $this->familyRepository      = new FamilyRepository($tree);
2019219296aSGreg Roach        $this->familyDatesRepository = new FamilyDatesRepository($tree);
2029219296aSGreg Roach        $this->mediaRepository       = new MediaRepository($tree);
2039219296aSGreg Roach        $this->eventRepository       = new EventRepository($tree);
204e5a6b4d4SGreg Roach        $this->userRepository        = new UserRepository($tree, $user_service);
2059219296aSGreg Roach        $this->serverRepository      = new ServerRepository();
2069219296aSGreg Roach        $this->browserRepository     = new BrowserRepository();
207e5a6b4d4SGreg Roach        $this->hitCountRepository    = new HitCountRepository($tree, $user_service);
208e5a6b4d4SGreg Roach        $this->latestUserRepository  = new LatestUserRepository($user_service);
209fd9aba47SGreg Roach        $this->favoritesRepository   = new FavoritesRepository($tree, $module_service);
2109219296aSGreg Roach        $this->newsRepository        = new NewsRepository($tree);
2119219296aSGreg Roach        $this->messageRepository     = new MessageRepository();
212e5a6b4d4SGreg Roach        $this->contactRepository     = new ContactRepository($tree, $user_service);
2134c78e066SGreg Roach        $this->placeRepository       = new PlaceRepository($tree, $country_service);
2149219296aSGreg Roach        $this->module_service        = $module_service;
2159219296aSGreg Roach    }
2169219296aSGreg Roach
2179219296aSGreg Roach    /**
2189219296aSGreg Roach     * Return a string of all supported tags and an example of its output in table row form.
2199219296aSGreg Roach     *
2209219296aSGreg Roach     * @return string
2219219296aSGreg Roach     */
2229219296aSGreg Roach    public function getAllTagsTable(): string
2239219296aSGreg Roach    {
224f021177cSGreg Roach        try {
225f021177cSGreg Roach            $class = new ReflectionClass($this);
2269219296aSGreg Roach
227f021177cSGreg Roach            $public_methods = $class->getMethods(ReflectionMethod::IS_PUBLIC);
228f021177cSGreg Roach
229f021177cSGreg Roach            $examples = Collection::make($public_methods)
230f021177cSGreg Roach                ->filter(static function (ReflectionMethod $method): bool {
231f021177cSGreg Roach                    return !in_array($method->getName(), ['embedTags', 'getAllTagsTable'], true);
232f021177cSGreg Roach                })
233f021177cSGreg Roach                ->filter(static function (ReflectionMethod $method): bool {
234f021177cSGreg Roach                    $type = $method->getReturnType();
235f021177cSGreg Roach
2366dd2d083SGreg Roach                    return $type instanceof ReflectionNamedType && $type->getName() === 'string';
237f021177cSGreg Roach                })
238f021177cSGreg Roach                ->sort(static function (ReflectionMethod $x, ReflectionMethod $y): int {
239f021177cSGreg Roach                    return $x->getName() <=> $y->getName();
240f021177cSGreg Roach                })
241f021177cSGreg Roach                ->map(function (ReflectionMethod $method): string {
242f021177cSGreg Roach                    $tag = $method->getName();
243f021177cSGreg Roach
244f021177cSGreg Roach                    return '<dt>#' . $tag . '#</dt><dd>' . call_user_func([$this, $tag]) . '</dd>';
245f021177cSGreg Roach                });
246f021177cSGreg Roach
247f021177cSGreg Roach            return '<dl>' . $examples->implode('') . '</dl>';
248f021177cSGreg Roach        } catch (ReflectionException $ex) {
249f021177cSGreg Roach            return $ex->getMessage();
2509219296aSGreg Roach        }
2519219296aSGreg Roach    }
2529219296aSGreg Roach
2539219296aSGreg Roach    /**
2549219296aSGreg Roach     * Embed tags in text
2559219296aSGreg Roach     *
2569219296aSGreg Roach     * @param string $text
2579219296aSGreg Roach     *
2589219296aSGreg Roach     * @return string
2599219296aSGreg Roach     */
2609219296aSGreg Roach    public function embedTags(string $text): string
2619219296aSGreg Roach    {
262dec352c1SGreg Roach        if (str_contains($text, '#')) {
2639219296aSGreg Roach            $text = strtr($text, $this->getTags($text));
2649219296aSGreg Roach        }
2659219296aSGreg Roach
2669219296aSGreg Roach        return $text;
2679219296aSGreg Roach    }
2689219296aSGreg Roach
2699219296aSGreg Roach    /**
2700dcd9387SGreg Roach     * @return string
2719219296aSGreg Roach     */
2729219296aSGreg Roach    public function gedcomFilename(): string
2739219296aSGreg Roach    {
2749219296aSGreg Roach        return $this->gedcomRepository->gedcomFilename();
2759219296aSGreg Roach    }
2769219296aSGreg Roach
2779219296aSGreg Roach    /**
2780dcd9387SGreg Roach     * @return int
2799219296aSGreg Roach     */
2809219296aSGreg Roach    public function gedcomId(): int
2819219296aSGreg Roach    {
2829219296aSGreg Roach        return $this->gedcomRepository->gedcomId();
2839219296aSGreg Roach    }
2849219296aSGreg Roach
2859219296aSGreg Roach    /**
2860dcd9387SGreg Roach     * @return string
2879219296aSGreg Roach     */
2889219296aSGreg Roach    public function gedcomTitle(): string
2899219296aSGreg Roach    {
2909219296aSGreg Roach        return $this->gedcomRepository->gedcomTitle();
2919219296aSGreg Roach    }
2929219296aSGreg Roach
2939219296aSGreg Roach    /**
2940dcd9387SGreg Roach     * @return string
2959219296aSGreg Roach     */
2969219296aSGreg Roach    public function gedcomCreatedSoftware(): string
2979219296aSGreg Roach    {
2989219296aSGreg Roach        return $this->gedcomRepository->gedcomCreatedSoftware();
2999219296aSGreg Roach    }
3009219296aSGreg Roach
3019219296aSGreg Roach    /**
3020dcd9387SGreg Roach     * @return string
3039219296aSGreg Roach     */
3049219296aSGreg Roach    public function gedcomCreatedVersion(): string
3059219296aSGreg Roach    {
3069219296aSGreg Roach        return $this->gedcomRepository->gedcomCreatedVersion();
3079219296aSGreg Roach    }
3089219296aSGreg Roach
3099219296aSGreg Roach    /**
3100dcd9387SGreg Roach     * @return string
3119219296aSGreg Roach     */
3129219296aSGreg Roach    public function gedcomDate(): string
3139219296aSGreg Roach    {
3149219296aSGreg Roach        return $this->gedcomRepository->gedcomDate();
3159219296aSGreg Roach    }
3169219296aSGreg Roach
3179219296aSGreg Roach    /**
3180dcd9387SGreg Roach     * @return string
3199219296aSGreg Roach     */
3209219296aSGreg Roach    public function gedcomUpdated(): string
3219219296aSGreg Roach    {
3229219296aSGreg Roach        return $this->gedcomRepository->gedcomUpdated();
3239219296aSGreg Roach    }
3249219296aSGreg Roach
3259219296aSGreg Roach    /**
3260dcd9387SGreg Roach     * @return string
3279219296aSGreg Roach     */
3289219296aSGreg Roach    public function gedcomRootId(): string
3299219296aSGreg Roach    {
3309219296aSGreg Roach        return $this->gedcomRepository->gedcomRootId();
3319219296aSGreg Roach    }
3329219296aSGreg Roach
3339219296aSGreg Roach    /**
3340dcd9387SGreg Roach     * @return string
3359219296aSGreg Roach     */
3369219296aSGreg Roach    public function totalRecords(): string
3379219296aSGreg Roach    {
3389219296aSGreg Roach        return $this->individualRepository->totalRecords();
3399219296aSGreg Roach    }
3409219296aSGreg Roach
3419219296aSGreg Roach    /**
3420dcd9387SGreg Roach     * @return string
3439219296aSGreg Roach     */
3449219296aSGreg Roach    public function totalIndividuals(): string
3459219296aSGreg Roach    {
3469219296aSGreg Roach        return $this->individualRepository->totalIndividuals();
3479219296aSGreg Roach    }
3489219296aSGreg Roach
3499219296aSGreg Roach    /**
3500dcd9387SGreg Roach     * @return string
3519219296aSGreg Roach     */
3529219296aSGreg Roach    public function totalIndisWithSources(): string
3539219296aSGreg Roach    {
3549219296aSGreg Roach        return $this->individualRepository->totalIndisWithSources();
3559219296aSGreg Roach    }
3569219296aSGreg Roach
3579219296aSGreg Roach    /**
3580dcd9387SGreg Roach     * @param string|null $color_from
3590dcd9387SGreg Roach     * @param string|null $color_to
3600dcd9387SGreg Roach     *
3610dcd9387SGreg Roach     * @return string
3629219296aSGreg Roach     */
3639219296aSGreg Roach    public function chartIndisWithSources(
3649219296aSGreg Roach        string $color_from = null,
3659219296aSGreg Roach        string $color_to = null
36698afcacfSGreg Roach    ): string {
36788de55fdSRico Sonntag        return $this->individualRepository->chartIndisWithSources($color_from, $color_to);
3689219296aSGreg Roach    }
3699219296aSGreg Roach
3709219296aSGreg Roach    /**
3710dcd9387SGreg Roach     * @return string
3729219296aSGreg Roach     */
3739219296aSGreg Roach    public function totalIndividualsPercentage(): string
3749219296aSGreg Roach    {
3759219296aSGreg Roach        return $this->individualRepository->totalIndividualsPercentage();
3769219296aSGreg Roach    }
3779219296aSGreg Roach
3789219296aSGreg Roach    /**
3790dcd9387SGreg Roach     * @return string
3809219296aSGreg Roach     */
3819219296aSGreg Roach    public function totalFamilies(): string
3829219296aSGreg Roach    {
3839219296aSGreg Roach        return $this->individualRepository->totalFamilies();
3849219296aSGreg Roach    }
3859219296aSGreg Roach
3869219296aSGreg Roach    /**
3870dcd9387SGreg Roach     * @return string
3889219296aSGreg Roach     */
3899219296aSGreg Roach    public function totalFamiliesPercentage(): string
3909219296aSGreg Roach    {
3919219296aSGreg Roach        return $this->individualRepository->totalFamiliesPercentage();
3929219296aSGreg Roach    }
3939219296aSGreg Roach
3949219296aSGreg Roach    /**
3950dcd9387SGreg Roach     * @return string
3969219296aSGreg Roach     */
3979219296aSGreg Roach    public function totalFamsWithSources(): string
3989219296aSGreg Roach    {
3999219296aSGreg Roach        return $this->individualRepository->totalFamsWithSources();
4009219296aSGreg Roach    }
4019219296aSGreg Roach
4029219296aSGreg Roach    /**
4030dcd9387SGreg Roach     * @param string|null $color_from
4040dcd9387SGreg Roach     * @param string|null $color_to
4050dcd9387SGreg Roach     *
4060dcd9387SGreg Roach     * @return string
4079219296aSGreg Roach     */
4089219296aSGreg Roach    public function chartFamsWithSources(
4099219296aSGreg Roach        string $color_from = null,
4109219296aSGreg Roach        string $color_to = null
41198afcacfSGreg Roach    ): string {
41288de55fdSRico Sonntag        return $this->individualRepository->chartFamsWithSources($color_from, $color_to);
4139219296aSGreg Roach    }
4149219296aSGreg Roach
4159219296aSGreg Roach    /**
4160dcd9387SGreg Roach     * @return string
4179219296aSGreg Roach     */
4189219296aSGreg Roach    public function totalSources(): string
4199219296aSGreg Roach    {
4209219296aSGreg Roach        return $this->individualRepository->totalSources();
4219219296aSGreg Roach    }
4229219296aSGreg Roach
4239219296aSGreg Roach    /**
4240dcd9387SGreg Roach     * @return string
4259219296aSGreg Roach     */
4269219296aSGreg Roach    public function totalSourcesPercentage(): string
4279219296aSGreg Roach    {
4289219296aSGreg Roach        return $this->individualRepository->totalSourcesPercentage();
4299219296aSGreg Roach    }
4309219296aSGreg Roach
4319219296aSGreg Roach    /**
4320dcd9387SGreg Roach     * @return string
4339219296aSGreg Roach     */
4349219296aSGreg Roach    public function totalNotes(): string
4359219296aSGreg Roach    {
4369219296aSGreg Roach        return $this->individualRepository->totalNotes();
4379219296aSGreg Roach    }
4389219296aSGreg Roach
4399219296aSGreg Roach    /**
4400dcd9387SGreg Roach     * @return string
4419219296aSGreg Roach     */
4429219296aSGreg Roach    public function totalNotesPercentage(): string
4439219296aSGreg Roach    {
4449219296aSGreg Roach        return $this->individualRepository->totalNotesPercentage();
4459219296aSGreg Roach    }
4469219296aSGreg Roach
4479219296aSGreg Roach    /**
4480dcd9387SGreg Roach     * @return string
4499219296aSGreg Roach     */
4509219296aSGreg Roach    public function totalRepositories(): string
4519219296aSGreg Roach    {
4529219296aSGreg Roach        return $this->individualRepository->totalRepositories();
4539219296aSGreg Roach    }
4549219296aSGreg Roach
4559219296aSGreg Roach    /**
4560dcd9387SGreg Roach     * @return string
4579219296aSGreg Roach     */
4589219296aSGreg Roach    public function totalRepositoriesPercentage(): string
4599219296aSGreg Roach    {
4609219296aSGreg Roach        return $this->individualRepository->totalRepositoriesPercentage();
4619219296aSGreg Roach    }
4629219296aSGreg Roach
4639219296aSGreg Roach    /**
46409482a55SGreg Roach     * @param array<string> ...$params
465320f6a24SGreg Roach     *
466320f6a24SGreg Roach     * @return string
4679219296aSGreg Roach     */
4689219296aSGreg Roach    public function totalSurnames(...$params): string
4699219296aSGreg Roach    {
4709219296aSGreg Roach        return $this->individualRepository->totalSurnames(...$params);
4719219296aSGreg Roach    }
4729219296aSGreg Roach
4739219296aSGreg Roach    /**
47409482a55SGreg Roach     * @param array<string> ...$params
475320f6a24SGreg Roach     *
476320f6a24SGreg Roach     * @return string
4779219296aSGreg Roach     */
4789219296aSGreg Roach    public function totalGivennames(...$params): string
4799219296aSGreg Roach    {
4809219296aSGreg Roach        return $this->individualRepository->totalGivennames(...$params);
4819219296aSGreg Roach    }
4829219296aSGreg Roach
4839219296aSGreg Roach    /**
48409482a55SGreg Roach     * @param array<string> $events
4850dcd9387SGreg Roach     *
4860dcd9387SGreg Roach     * @return string
4879219296aSGreg Roach     */
4889219296aSGreg Roach    public function totalEvents(array $events = []): string
4899219296aSGreg Roach    {
4909219296aSGreg Roach        return $this->eventRepository->totalEvents($events);
4919219296aSGreg Roach    }
4929219296aSGreg Roach
4939219296aSGreg Roach    /**
4940dcd9387SGreg Roach     * @return string
4959219296aSGreg Roach     */
4969219296aSGreg Roach    public function totalEventsBirth(): string
4979219296aSGreg Roach    {
4989219296aSGreg Roach        return $this->eventRepository->totalEventsBirth();
4999219296aSGreg Roach    }
5009219296aSGreg Roach
5019219296aSGreg Roach    /**
5020dcd9387SGreg Roach     * @return string
5039219296aSGreg Roach     */
5049219296aSGreg Roach    public function totalBirths(): string
5059219296aSGreg Roach    {
5069219296aSGreg Roach        return $this->eventRepository->totalBirths();
5079219296aSGreg Roach    }
5089219296aSGreg Roach
5099219296aSGreg Roach    /**
5100dcd9387SGreg Roach     * @return string
5119219296aSGreg Roach     */
5129219296aSGreg Roach    public function totalEventsDeath(): string
5139219296aSGreg Roach    {
5149219296aSGreg Roach        return $this->eventRepository->totalEventsDeath();
5159219296aSGreg Roach    }
5169219296aSGreg Roach
5179219296aSGreg Roach    /**
5180dcd9387SGreg Roach     * @return string
5199219296aSGreg Roach     */
5209219296aSGreg Roach    public function totalDeaths(): string
5219219296aSGreg Roach    {
5229219296aSGreg Roach        return $this->eventRepository->totalDeaths();
5239219296aSGreg Roach    }
5249219296aSGreg Roach
5259219296aSGreg Roach    /**
5260dcd9387SGreg Roach     * @return string
5279219296aSGreg Roach     */
5289219296aSGreg Roach    public function totalEventsMarriage(): string
5299219296aSGreg Roach    {
5309219296aSGreg Roach        return $this->eventRepository->totalEventsMarriage();
5319219296aSGreg Roach    }
5329219296aSGreg Roach
5339219296aSGreg Roach    /**
5340dcd9387SGreg Roach     * @return string
5359219296aSGreg Roach     */
5369219296aSGreg Roach    public function totalMarriages(): string
5379219296aSGreg Roach    {
5389219296aSGreg Roach        return $this->eventRepository->totalMarriages();
5399219296aSGreg Roach    }
5409219296aSGreg Roach
5419219296aSGreg Roach    /**
5420dcd9387SGreg Roach     * @return string
5439219296aSGreg Roach     */
5449219296aSGreg Roach    public function totalEventsDivorce(): string
5459219296aSGreg Roach    {
5469219296aSGreg Roach        return $this->eventRepository->totalEventsDivorce();
5479219296aSGreg Roach    }
5489219296aSGreg Roach
5499219296aSGreg Roach    /**
5500dcd9387SGreg Roach     * @return string
5519219296aSGreg Roach     */
5529219296aSGreg Roach    public function totalDivorces(): string
5539219296aSGreg Roach    {
5549219296aSGreg Roach        return $this->eventRepository->totalDivorces();
5559219296aSGreg Roach    }
5569219296aSGreg Roach
5579219296aSGreg Roach    /**
5580dcd9387SGreg Roach     * @return string
5599219296aSGreg Roach     */
5609219296aSGreg Roach    public function totalEventsOther(): string
5619219296aSGreg Roach    {
5629219296aSGreg Roach        return $this->eventRepository->totalEventsOther();
5639219296aSGreg Roach    }
5649219296aSGreg Roach
5659219296aSGreg Roach    /**
5660dcd9387SGreg Roach     * @return string
5679219296aSGreg Roach     */
5689219296aSGreg Roach    public function totalSexMales(): string
5699219296aSGreg Roach    {
5709219296aSGreg Roach        return $this->individualRepository->totalSexMales();
5719219296aSGreg Roach    }
5729219296aSGreg Roach
5739219296aSGreg Roach    /**
5740dcd9387SGreg Roach     * @return string
5759219296aSGreg Roach     */
5769219296aSGreg Roach    public function totalSexMalesPercentage(): string
5779219296aSGreg Roach    {
5789219296aSGreg Roach        return $this->individualRepository->totalSexMalesPercentage();
5799219296aSGreg Roach    }
5809219296aSGreg Roach
5819219296aSGreg Roach    /**
5820dcd9387SGreg Roach     * @return string
5839219296aSGreg Roach     */
5849219296aSGreg Roach    public function totalSexFemales(): string
5859219296aSGreg Roach    {
5869219296aSGreg Roach        return $this->individualRepository->totalSexFemales();
5879219296aSGreg Roach    }
5889219296aSGreg Roach
5899219296aSGreg Roach    /**
5900dcd9387SGreg Roach     * @return string
5919219296aSGreg Roach     */
5929219296aSGreg Roach    public function totalSexFemalesPercentage(): string
5939219296aSGreg Roach    {
5949219296aSGreg Roach        return $this->individualRepository->totalSexFemalesPercentage();
5959219296aSGreg Roach    }
5969219296aSGreg Roach
5979219296aSGreg Roach    /**
5980dcd9387SGreg Roach     * @return string
5999219296aSGreg Roach     */
6009219296aSGreg Roach    public function totalSexUnknown(): string
6019219296aSGreg Roach    {
6029219296aSGreg Roach        return $this->individualRepository->totalSexUnknown();
6039219296aSGreg Roach    }
6049219296aSGreg Roach
6059219296aSGreg Roach    /**
6060dcd9387SGreg Roach     * @return string
6079219296aSGreg Roach     */
6089219296aSGreg Roach    public function totalSexUnknownPercentage(): string
6099219296aSGreg Roach    {
6109219296aSGreg Roach        return $this->individualRepository->totalSexUnknownPercentage();
6119219296aSGreg Roach    }
6129219296aSGreg Roach
6139219296aSGreg Roach    /**
6140dcd9387SGreg Roach     * @param string|null $color_female
6150dcd9387SGreg Roach     * @param string|null $color_male
6160dcd9387SGreg Roach     * @param string|null $color_unknown
6170dcd9387SGreg Roach     *
6180dcd9387SGreg Roach     * @return string
6199219296aSGreg Roach     */
6209219296aSGreg Roach    public function chartSex(
6219219296aSGreg Roach        string $color_female = null,
6229219296aSGreg Roach        string $color_male = null,
6239219296aSGreg Roach        string $color_unknown = null
62498afcacfSGreg Roach    ): string {
62588de55fdSRico Sonntag        return $this->individualRepository->chartSex($color_female, $color_male, $color_unknown);
6269219296aSGreg Roach    }
6279219296aSGreg Roach
6289219296aSGreg Roach    /**
6290dcd9387SGreg Roach     * @return string
6309219296aSGreg Roach     */
6319219296aSGreg Roach    public function totalLiving(): string
6329219296aSGreg Roach    {
6339219296aSGreg Roach        return $this->individualRepository->totalLiving();
6349219296aSGreg Roach    }
6359219296aSGreg Roach
6369219296aSGreg Roach    /**
6370dcd9387SGreg Roach     * @return string
6389219296aSGreg Roach     */
6399219296aSGreg Roach    public function totalLivingPercentage(): string
6409219296aSGreg Roach    {
6419219296aSGreg Roach        return $this->individualRepository->totalLivingPercentage();
6429219296aSGreg Roach    }
6439219296aSGreg Roach
6449219296aSGreg Roach    /**
6450dcd9387SGreg Roach     * @return string
6469219296aSGreg Roach     */
6479219296aSGreg Roach    public function totalDeceased(): string
6489219296aSGreg Roach    {
6499219296aSGreg Roach        return $this->individualRepository->totalDeceased();
6509219296aSGreg Roach    }
6519219296aSGreg Roach
6529219296aSGreg Roach    /**
6530dcd9387SGreg Roach     * @return string
6549219296aSGreg Roach     */
6559219296aSGreg Roach    public function totalDeceasedPercentage(): string
6569219296aSGreg Roach    {
6579219296aSGreg Roach        return $this->individualRepository->totalDeceasedPercentage();
6589219296aSGreg Roach    }
6599219296aSGreg Roach
6609219296aSGreg Roach    /**
6610dcd9387SGreg Roach     * @param string|null $color_living
6620dcd9387SGreg Roach     * @param string|null $color_dead
6630dcd9387SGreg Roach     *
6640dcd9387SGreg Roach     * @return string
6659219296aSGreg Roach     */
66688de55fdSRico Sonntag    public function chartMortality(string $color_living = null, string $color_dead = null): string
6679219296aSGreg Roach    {
66888de55fdSRico Sonntag        return $this->individualRepository->chartMortality($color_living, $color_dead);
6699219296aSGreg Roach    }
6709219296aSGreg Roach
6719219296aSGreg Roach    /**
6720dcd9387SGreg Roach     * @return string
6739219296aSGreg Roach     */
6749219296aSGreg Roach    public function totalMedia(): string
6759219296aSGreg Roach    {
6769219296aSGreg Roach        return $this->mediaRepository->totalMedia();
6779219296aSGreg Roach    }
6789219296aSGreg Roach
6799219296aSGreg Roach    /**
6800dcd9387SGreg Roach     * @return string
6819219296aSGreg Roach     */
6829219296aSGreg Roach    public function totalMediaAudio(): string
6839219296aSGreg Roach    {
6849219296aSGreg Roach        return $this->mediaRepository->totalMediaAudio();
6859219296aSGreg Roach    }
6869219296aSGreg Roach
6879219296aSGreg Roach    /**
6880dcd9387SGreg Roach     * @return string
6899219296aSGreg Roach     */
6909219296aSGreg Roach    public function totalMediaBook(): string
6919219296aSGreg Roach    {
6929219296aSGreg Roach        return $this->mediaRepository->totalMediaBook();
6939219296aSGreg Roach    }
6949219296aSGreg Roach
6959219296aSGreg Roach    /**
6960dcd9387SGreg Roach     * @return string
6979219296aSGreg Roach     */
6989219296aSGreg Roach    public function totalMediaCard(): string
6999219296aSGreg Roach    {
7009219296aSGreg Roach        return $this->mediaRepository->totalMediaCard();
7019219296aSGreg Roach    }
7029219296aSGreg Roach
7039219296aSGreg Roach    /**
7040dcd9387SGreg Roach     * @return string
7059219296aSGreg Roach     */
7069219296aSGreg Roach    public function totalMediaCertificate(): string
7079219296aSGreg Roach    {
7089219296aSGreg Roach        return $this->mediaRepository->totalMediaCertificate();
7099219296aSGreg Roach    }
7109219296aSGreg Roach
7119219296aSGreg Roach    /**
7120dcd9387SGreg Roach     * @return string
7139219296aSGreg Roach     */
7149219296aSGreg Roach    public function totalMediaCoatOfArms(): string
7159219296aSGreg Roach    {
7169219296aSGreg Roach        return $this->mediaRepository->totalMediaCoatOfArms();
7179219296aSGreg Roach    }
7189219296aSGreg Roach
7199219296aSGreg Roach    /**
7200dcd9387SGreg Roach     * @return string
7219219296aSGreg Roach     */
7229219296aSGreg Roach    public function totalMediaDocument(): string
7239219296aSGreg Roach    {
7249219296aSGreg Roach        return $this->mediaRepository->totalMediaDocument();
7259219296aSGreg Roach    }
7269219296aSGreg Roach
7279219296aSGreg Roach    /**
7280dcd9387SGreg Roach     * @return string
7299219296aSGreg Roach     */
7309219296aSGreg Roach    public function totalMediaElectronic(): string
7319219296aSGreg Roach    {
7329219296aSGreg Roach        return $this->mediaRepository->totalMediaElectronic();
7339219296aSGreg Roach    }
7349219296aSGreg Roach
7359219296aSGreg Roach    /**
7360dcd9387SGreg Roach     * @return string
7379219296aSGreg Roach     */
7389219296aSGreg Roach    public function totalMediaMagazine(): string
7399219296aSGreg Roach    {
7409219296aSGreg Roach        return $this->mediaRepository->totalMediaMagazine();
7419219296aSGreg Roach    }
7429219296aSGreg Roach
7439219296aSGreg Roach    /**
7440dcd9387SGreg Roach     * @return string
7459219296aSGreg Roach     */
7469219296aSGreg Roach    public function totalMediaManuscript(): string
7479219296aSGreg Roach    {
7489219296aSGreg Roach        return $this->mediaRepository->totalMediaManuscript();
7499219296aSGreg Roach    }
7509219296aSGreg Roach
7519219296aSGreg Roach    /**
7520dcd9387SGreg Roach     * @return string
7539219296aSGreg Roach     */
7549219296aSGreg Roach    public function totalMediaMap(): string
7559219296aSGreg Roach    {
7569219296aSGreg Roach        return $this->mediaRepository->totalMediaMap();
7579219296aSGreg Roach    }
7589219296aSGreg Roach
7599219296aSGreg Roach    /**
7600dcd9387SGreg Roach     * @return string
7619219296aSGreg Roach     */
7629219296aSGreg Roach    public function totalMediaFiche(): string
7639219296aSGreg Roach    {
7649219296aSGreg Roach        return $this->mediaRepository->totalMediaFiche();
7659219296aSGreg Roach    }
7669219296aSGreg Roach
7679219296aSGreg Roach    /**
7680dcd9387SGreg Roach     * @return string
7699219296aSGreg Roach     */
7709219296aSGreg Roach    public function totalMediaFilm(): string
7719219296aSGreg Roach    {
7729219296aSGreg Roach        return $this->mediaRepository->totalMediaFilm();
7739219296aSGreg Roach    }
7749219296aSGreg Roach
7759219296aSGreg Roach    /**
7760dcd9387SGreg Roach     * @return string
7779219296aSGreg Roach     */
7789219296aSGreg Roach    public function totalMediaNewspaper(): string
7799219296aSGreg Roach    {
7809219296aSGreg Roach        return $this->mediaRepository->totalMediaNewspaper();
7819219296aSGreg Roach    }
7829219296aSGreg Roach
7839219296aSGreg Roach    /**
7840dcd9387SGreg Roach     * @return string
7859219296aSGreg Roach     */
7869219296aSGreg Roach    public function totalMediaPainting(): string
7879219296aSGreg Roach    {
7889219296aSGreg Roach        return $this->mediaRepository->totalMediaPainting();
7899219296aSGreg Roach    }
7909219296aSGreg Roach
7919219296aSGreg Roach    /**
7920dcd9387SGreg Roach     * @return string
7939219296aSGreg Roach     */
7949219296aSGreg Roach    public function totalMediaPhoto(): string
7959219296aSGreg Roach    {
7969219296aSGreg Roach        return $this->mediaRepository->totalMediaPhoto();
7979219296aSGreg Roach    }
7989219296aSGreg Roach
7999219296aSGreg Roach    /**
8000dcd9387SGreg Roach     * @return string
8019219296aSGreg Roach     */
8029219296aSGreg Roach    public function totalMediaTombstone(): string
8039219296aSGreg Roach    {
8049219296aSGreg Roach        return $this->mediaRepository->totalMediaTombstone();
8059219296aSGreg Roach    }
8069219296aSGreg Roach
8079219296aSGreg Roach    /**
8080dcd9387SGreg Roach     * @return string
8099219296aSGreg Roach     */
8109219296aSGreg Roach    public function totalMediaVideo(): string
8119219296aSGreg Roach    {
8129219296aSGreg Roach        return $this->mediaRepository->totalMediaVideo();
8139219296aSGreg Roach    }
8149219296aSGreg Roach
8159219296aSGreg Roach    /**
8160dcd9387SGreg Roach     * @return string
8179219296aSGreg Roach     */
8189219296aSGreg Roach    public function totalMediaOther(): string
8199219296aSGreg Roach    {
8209219296aSGreg Roach        return $this->mediaRepository->totalMediaOther();
8219219296aSGreg Roach    }
8229219296aSGreg Roach
8239219296aSGreg Roach    /**
8240dcd9387SGreg Roach     * @return string
8259219296aSGreg Roach     */
8269219296aSGreg Roach    public function totalMediaUnknown(): string
8279219296aSGreg Roach    {
8289219296aSGreg Roach        return $this->mediaRepository->totalMediaUnknown();
8299219296aSGreg Roach    }
8309219296aSGreg Roach
8319219296aSGreg Roach    /**
8320dcd9387SGreg Roach     * @param string|null $color_from
8330dcd9387SGreg Roach     * @param string|null $color_to
8340dcd9387SGreg Roach     *
8350dcd9387SGreg Roach     * @return string
8369219296aSGreg Roach     */
83788de55fdSRico Sonntag    public function chartMedia(string $color_from = null, string $color_to = null): string
8389219296aSGreg Roach    {
83988de55fdSRico Sonntag        return $this->mediaRepository->chartMedia($color_from, $color_to);
8409219296aSGreg Roach    }
8419219296aSGreg Roach
8429219296aSGreg Roach    /**
8430dcd9387SGreg Roach     * @param string $what
8440dcd9387SGreg Roach     * @param string $fact
8450dcd9387SGreg Roach     * @param int    $parent
8460dcd9387SGreg Roach     * @param bool   $country
8470dcd9387SGreg Roach     *
848*f70bcff5SGreg Roach     * @return array<object>
8499219296aSGreg Roach     */
8509219296aSGreg Roach    public function statsPlaces(string $what = 'ALL', string $fact = '', int $parent = 0, bool $country = false): array
8519219296aSGreg Roach    {
8529219296aSGreg Roach        return $this->placeRepository->statsPlaces($what, $fact, $parent, $country);
8539219296aSGreg Roach    }
8549219296aSGreg Roach
8559219296aSGreg Roach    /**
8560dcd9387SGreg Roach     * @return string
8579219296aSGreg Roach     */
8589219296aSGreg Roach    public function totalPlaces(): string
8599219296aSGreg Roach    {
8609219296aSGreg Roach        return $this->placeRepository->totalPlaces();
8619219296aSGreg Roach    }
8629219296aSGreg Roach
8639219296aSGreg Roach    /**
8640dcd9387SGreg Roach     * @param string $chart_shows
8650dcd9387SGreg Roach     * @param string $chart_type
8660dcd9387SGreg Roach     * @param string $surname
8670dcd9387SGreg Roach     *
8680dcd9387SGreg Roach     * @return string
8699219296aSGreg Roach     */
8709219296aSGreg Roach    public function chartDistribution(
8719219296aSGreg Roach        string $chart_shows = 'world',
8729219296aSGreg Roach        string $chart_type = '',
8739219296aSGreg Roach        string $surname = ''
87498afcacfSGreg Roach    ): string {
8759219296aSGreg Roach        return $this->placeRepository->chartDistribution($chart_shows, $chart_type, $surname);
8769219296aSGreg Roach    }
8779219296aSGreg Roach
8789219296aSGreg Roach    /**
8790dcd9387SGreg Roach     * @return string
8809219296aSGreg Roach     */
8819219296aSGreg Roach    public function commonCountriesList(): string
8829219296aSGreg Roach    {
8839219296aSGreg Roach        return $this->placeRepository->commonCountriesList();
8849219296aSGreg Roach    }
8859219296aSGreg Roach
8869219296aSGreg Roach    /**
8870dcd9387SGreg Roach     * @return string
8889219296aSGreg Roach     */
8899219296aSGreg Roach    public function commonBirthPlacesList(): string
8909219296aSGreg Roach    {
8919219296aSGreg Roach        return $this->placeRepository->commonBirthPlacesList();
8929219296aSGreg Roach    }
8939219296aSGreg Roach
8949219296aSGreg Roach    /**
8950dcd9387SGreg Roach     * @return string
8969219296aSGreg Roach     */
8979219296aSGreg Roach    public function commonDeathPlacesList(): string
8989219296aSGreg Roach    {
8999219296aSGreg Roach        return $this->placeRepository->commonDeathPlacesList();
9009219296aSGreg Roach    }
9019219296aSGreg Roach
9029219296aSGreg Roach    /**
9030dcd9387SGreg Roach     * @return string
9049219296aSGreg Roach     */
9059219296aSGreg Roach    public function commonMarriagePlacesList(): string
9069219296aSGreg Roach    {
9079219296aSGreg Roach        return $this->placeRepository->commonMarriagePlacesList();
9089219296aSGreg Roach    }
9099219296aSGreg Roach
9109219296aSGreg Roach    /**
9110dcd9387SGreg Roach     * @return string
9129219296aSGreg Roach     */
9139219296aSGreg Roach    public function firstBirth(): string
9149219296aSGreg Roach    {
9159219296aSGreg Roach        return $this->familyDatesRepository->firstBirth();
9169219296aSGreg Roach    }
9179219296aSGreg Roach
9189219296aSGreg Roach    /**
9190dcd9387SGreg Roach     * @return string
9209219296aSGreg Roach     */
9219219296aSGreg Roach    public function firstBirthYear(): string
9229219296aSGreg Roach    {
9239219296aSGreg Roach        return $this->familyDatesRepository->firstBirthYear();
9249219296aSGreg Roach    }
9259219296aSGreg Roach
9269219296aSGreg Roach    /**
9270dcd9387SGreg Roach     * @return string
9289219296aSGreg Roach     */
9299219296aSGreg Roach    public function firstBirthName(): string
9309219296aSGreg Roach    {
9319219296aSGreg Roach        return $this->familyDatesRepository->firstBirthName();
9329219296aSGreg Roach    }
9339219296aSGreg Roach
9349219296aSGreg Roach    /**
9350dcd9387SGreg Roach     * @return string
9369219296aSGreg Roach     */
9379219296aSGreg Roach    public function firstBirthPlace(): string
9389219296aSGreg Roach    {
9399219296aSGreg Roach        return $this->familyDatesRepository->firstBirthPlace();
9409219296aSGreg Roach    }
9419219296aSGreg Roach
9429219296aSGreg Roach    /**
9430dcd9387SGreg Roach     * @return string
9449219296aSGreg Roach     */
9459219296aSGreg Roach    public function lastBirth(): string
9469219296aSGreg Roach    {
9479219296aSGreg Roach        return $this->familyDatesRepository->lastBirth();
9489219296aSGreg Roach    }
9499219296aSGreg Roach
9509219296aSGreg Roach    /**
9510dcd9387SGreg Roach     * @return string
9529219296aSGreg Roach     */
9539219296aSGreg Roach    public function lastBirthYear(): string
9549219296aSGreg Roach    {
9559219296aSGreg Roach        return $this->familyDatesRepository->lastBirthYear();
9569219296aSGreg Roach    }
9579219296aSGreg Roach
9589219296aSGreg Roach    /**
9590dcd9387SGreg Roach     * @return string
9609219296aSGreg Roach     */
9619219296aSGreg Roach    public function lastBirthName(): string
9629219296aSGreg Roach    {
9639219296aSGreg Roach        return $this->familyDatesRepository->lastBirthName();
9649219296aSGreg Roach    }
9659219296aSGreg Roach
9669219296aSGreg Roach    /**
9670dcd9387SGreg Roach     * @return string
9689219296aSGreg Roach     */
9699219296aSGreg Roach    public function lastBirthPlace(): string
9709219296aSGreg Roach    {
9719219296aSGreg Roach        return $this->familyDatesRepository->lastBirthPlace();
9729219296aSGreg Roach    }
9739219296aSGreg Roach
9749219296aSGreg Roach    /**
9750dcd9387SGreg Roach     * @param int $year1
9760dcd9387SGreg Roach     * @param int $year2
9770dcd9387SGreg Roach     *
9780dcd9387SGreg Roach     * @return Builder
9799219296aSGreg Roach     */
980cde1d378SGreg Roach    public function statsBirthQuery(int $year1 = -1, int $year2 = -1): Builder
9819219296aSGreg Roach    {
982cde1d378SGreg Roach        return $this->individualRepository->statsBirthQuery($year1, $year2);
983cde1d378SGreg Roach    }
984cde1d378SGreg Roach
985cde1d378SGreg Roach    /**
9860dcd9387SGreg Roach     * @param int $year1
9870dcd9387SGreg Roach     * @param int $year2
9880dcd9387SGreg Roach     *
9890dcd9387SGreg Roach     * @return Builder
990cde1d378SGreg Roach     */
991cde1d378SGreg Roach    public function statsBirthBySexQuery(int $year1 = -1, int $year2 = -1): Builder
992cde1d378SGreg Roach    {
993cde1d378SGreg Roach        return $this->individualRepository->statsBirthBySexQuery($year1, $year2);
9949219296aSGreg Roach    }
9959219296aSGreg Roach
9969219296aSGreg Roach    /**
9970dcd9387SGreg Roach     * @param string|null $color_from
9980dcd9387SGreg Roach     * @param string|null $color_to
9990dcd9387SGreg Roach     *
10000dcd9387SGreg Roach     * @return string
10019219296aSGreg Roach     */
100288de55fdSRico Sonntag    public function statsBirth(string $color_from = null, string $color_to = null): string
10039219296aSGreg Roach    {
100488de55fdSRico Sonntag        return $this->individualRepository->statsBirth($color_from, $color_to);
10059219296aSGreg Roach    }
10069219296aSGreg Roach
10079219296aSGreg Roach    /**
10080dcd9387SGreg Roach     * @return string
10099219296aSGreg Roach     */
10109219296aSGreg Roach    public function firstDeath(): string
10119219296aSGreg Roach    {
10129219296aSGreg Roach        return $this->familyDatesRepository->firstDeath();
10139219296aSGreg Roach    }
10149219296aSGreg Roach
10159219296aSGreg Roach    /**
10160dcd9387SGreg Roach     * @return string
10179219296aSGreg Roach     */
10189219296aSGreg Roach    public function firstDeathYear(): string
10199219296aSGreg Roach    {
10209219296aSGreg Roach        return $this->familyDatesRepository->firstDeathYear();
10219219296aSGreg Roach    }
10229219296aSGreg Roach
10239219296aSGreg Roach    /**
10240dcd9387SGreg Roach     * @return string
10259219296aSGreg Roach     */
10269219296aSGreg Roach    public function firstDeathName(): string
10279219296aSGreg Roach    {
10289219296aSGreg Roach        return $this->familyDatesRepository->firstDeathName();
10299219296aSGreg Roach    }
10309219296aSGreg Roach
10319219296aSGreg Roach    /**
10320dcd9387SGreg Roach     * @return string
10339219296aSGreg Roach     */
10349219296aSGreg Roach    public function firstDeathPlace(): string
10359219296aSGreg Roach    {
10369219296aSGreg Roach        return $this->familyDatesRepository->firstDeathPlace();
10379219296aSGreg Roach    }
10389219296aSGreg Roach
10399219296aSGreg Roach    /**
10400dcd9387SGreg Roach     * @return string
10419219296aSGreg Roach     */
10429219296aSGreg Roach    public function lastDeath(): string
10439219296aSGreg Roach    {
10449219296aSGreg Roach        return $this->familyDatesRepository->lastDeath();
10459219296aSGreg Roach    }
10469219296aSGreg Roach
10479219296aSGreg Roach    /**
10480dcd9387SGreg Roach     * @return string
10499219296aSGreg Roach     */
10509219296aSGreg Roach    public function lastDeathYear(): string
10519219296aSGreg Roach    {
10529219296aSGreg Roach        return $this->familyDatesRepository->lastDeathYear();
10539219296aSGreg Roach    }
10549219296aSGreg Roach
10559219296aSGreg Roach    /**
10560dcd9387SGreg Roach     * @return string
10579219296aSGreg Roach     */
10589219296aSGreg Roach    public function lastDeathName(): string
10599219296aSGreg Roach    {
10609219296aSGreg Roach        return $this->familyDatesRepository->lastDeathName();
10619219296aSGreg Roach    }
10629219296aSGreg Roach
10639219296aSGreg Roach    /**
10640dcd9387SGreg Roach     * @return string
10659219296aSGreg Roach     */
10669219296aSGreg Roach    public function lastDeathPlace(): string
10679219296aSGreg Roach    {
10689219296aSGreg Roach        return $this->familyDatesRepository->lastDeathPlace();
10699219296aSGreg Roach    }
10709219296aSGreg Roach
10719219296aSGreg Roach    /**
10720dcd9387SGreg Roach     * @param int $year1
10730dcd9387SGreg Roach     * @param int $year2
10740dcd9387SGreg Roach     *
10750dcd9387SGreg Roach     * @return Builder
10769219296aSGreg Roach     */
1077cde1d378SGreg Roach    public function statsDeathQuery(int $year1 = -1, int $year2 = -1): Builder
10789219296aSGreg Roach    {
1079cde1d378SGreg Roach        return $this->individualRepository->statsDeathQuery($year1, $year2);
1080cde1d378SGreg Roach    }
1081cde1d378SGreg Roach
1082cde1d378SGreg Roach    /**
10830dcd9387SGreg Roach     * @param int $year1
10840dcd9387SGreg Roach     * @param int $year2
10850dcd9387SGreg Roach     *
10860dcd9387SGreg Roach     * @return Builder
1087cde1d378SGreg Roach     */
1088cde1d378SGreg Roach    public function statsDeathBySexQuery(int $year1 = -1, int $year2 = -1): Builder
1089cde1d378SGreg Roach    {
1090cde1d378SGreg Roach        return $this->individualRepository->statsDeathBySexQuery($year1, $year2);
10919219296aSGreg Roach    }
10929219296aSGreg Roach
10939219296aSGreg Roach    /**
10940dcd9387SGreg Roach     * @param string|null $color_from
10950dcd9387SGreg Roach     * @param string|null $color_to
10960dcd9387SGreg Roach     *
10970dcd9387SGreg Roach     * @return string
10989219296aSGreg Roach     */
109988de55fdSRico Sonntag    public function statsDeath(string $color_from = null, string $color_to = null): string
11009219296aSGreg Roach    {
110188de55fdSRico Sonntag        return $this->individualRepository->statsDeath($color_from, $color_to);
11029219296aSGreg Roach    }
11039219296aSGreg Roach
11049219296aSGreg Roach    /**
1105320f6a24SGreg Roach     * General query on ages.
1106320f6a24SGreg Roach     *
1107320f6a24SGreg Roach     * @param string $related
1108320f6a24SGreg Roach     * @param string $sex
1109320f6a24SGreg Roach     * @param int    $year1
1110320f6a24SGreg Roach     * @param int    $year2
1111320f6a24SGreg Roach     *
1112320f6a24SGreg Roach     * @return array|string
11139219296aSGreg Roach     */
11149219296aSGreg Roach    public function statsAgeQuery(string $related = 'BIRT', string $sex = 'BOTH', int $year1 = -1, int $year2 = -1)
11159219296aSGreg Roach    {
11169219296aSGreg Roach        return $this->individualRepository->statsAgeQuery($related, $sex, $year1, $year2);
11179219296aSGreg Roach    }
11189219296aSGreg Roach
11199219296aSGreg Roach    /**
11200dcd9387SGreg Roach     * @return string
11219219296aSGreg Roach     */
112288de55fdSRico Sonntag    public function statsAge(): string
11239219296aSGreg Roach    {
112488de55fdSRico Sonntag        return $this->individualRepository->statsAge();
11259219296aSGreg Roach    }
11269219296aSGreg Roach
11279219296aSGreg Roach    /**
11280dcd9387SGreg Roach     * @return string
11299219296aSGreg Roach     */
11309219296aSGreg Roach    public function longestLife(): string
11319219296aSGreg Roach    {
11329219296aSGreg Roach        return $this->individualRepository->longestLife();
11339219296aSGreg Roach    }
11349219296aSGreg Roach
11359219296aSGreg Roach    /**
11360dcd9387SGreg Roach     * @return string
11379219296aSGreg Roach     */
11389219296aSGreg Roach    public function longestLifeAge(): string
11399219296aSGreg Roach    {
11409219296aSGreg Roach        return $this->individualRepository->longestLifeAge();
11419219296aSGreg Roach    }
11429219296aSGreg Roach
11439219296aSGreg Roach    /**
11440dcd9387SGreg Roach     * @return string
11459219296aSGreg Roach     */
11469219296aSGreg Roach    public function longestLifeName(): string
11479219296aSGreg Roach    {
11489219296aSGreg Roach        return $this->individualRepository->longestLifeName();
11499219296aSGreg Roach    }
11509219296aSGreg Roach
11519219296aSGreg Roach    /**
11520dcd9387SGreg Roach     * @return string
11539219296aSGreg Roach     */
11549219296aSGreg Roach    public function longestLifeFemale(): string
11559219296aSGreg Roach    {
11569219296aSGreg Roach        return $this->individualRepository->longestLifeFemale();
11579219296aSGreg Roach    }
11589219296aSGreg Roach
11599219296aSGreg Roach    /**
11600dcd9387SGreg Roach     * @return string
11619219296aSGreg Roach     */
11629219296aSGreg Roach    public function longestLifeFemaleAge(): string
11639219296aSGreg Roach    {
11649219296aSGreg Roach        return $this->individualRepository->longestLifeFemaleAge();
11659219296aSGreg Roach    }
11669219296aSGreg Roach
11679219296aSGreg Roach    /**
11680dcd9387SGreg Roach     * @return string
11699219296aSGreg Roach     */
11709219296aSGreg Roach    public function longestLifeFemaleName(): string
11719219296aSGreg Roach    {
11729219296aSGreg Roach        return $this->individualRepository->longestLifeFemaleName();
11739219296aSGreg Roach    }
11749219296aSGreg Roach
11759219296aSGreg Roach    /**
11760dcd9387SGreg Roach     * @return string
11779219296aSGreg Roach     */
11789219296aSGreg Roach    public function longestLifeMale(): string
11799219296aSGreg Roach    {
11809219296aSGreg Roach        return $this->individualRepository->longestLifeMale();
11819219296aSGreg Roach    }
11829219296aSGreg Roach
11839219296aSGreg Roach    /**
11840dcd9387SGreg Roach     * @return string
11859219296aSGreg Roach     */
11869219296aSGreg Roach    public function longestLifeMaleAge(): string
11879219296aSGreg Roach    {
11889219296aSGreg Roach        return $this->individualRepository->longestLifeMaleAge();
11899219296aSGreg Roach    }
11909219296aSGreg Roach
11919219296aSGreg Roach    /**
11920dcd9387SGreg Roach     * @return string
11939219296aSGreg Roach     */
11949219296aSGreg Roach    public function longestLifeMaleName(): string
11959219296aSGreg Roach    {
11969219296aSGreg Roach        return $this->individualRepository->longestLifeMaleName();
11979219296aSGreg Roach    }
11989219296aSGreg Roach
11999219296aSGreg Roach    /**
12000dcd9387SGreg Roach     * @param string $total
12010dcd9387SGreg Roach     *
12020dcd9387SGreg Roach     * @return string
12039219296aSGreg Roach     */
12049219296aSGreg Roach    public function topTenOldest(string $total = '10'): string
12059219296aSGreg Roach    {
12069219296aSGreg Roach        return $this->individualRepository->topTenOldest((int) $total);
12079219296aSGreg Roach    }
12089219296aSGreg Roach
12099219296aSGreg Roach    /**
12100dcd9387SGreg Roach     * @param string $total
12110dcd9387SGreg Roach     *
12120dcd9387SGreg Roach     * @return string
12139219296aSGreg Roach     */
12149219296aSGreg Roach    public function topTenOldestList(string $total = '10'): string
12159219296aSGreg Roach    {
12169219296aSGreg Roach        return $this->individualRepository->topTenOldestList((int) $total);
12179219296aSGreg Roach    }
12189219296aSGreg Roach
12199219296aSGreg Roach    /**
12200dcd9387SGreg Roach     * @param string $total
12210dcd9387SGreg Roach     *
12220dcd9387SGreg Roach     * @return string
12239219296aSGreg Roach     */
12249219296aSGreg Roach    public function topTenOldestFemale(string $total = '10'): string
12259219296aSGreg Roach    {
12269219296aSGreg Roach        return $this->individualRepository->topTenOldestFemale((int) $total);
12279219296aSGreg Roach    }
12289219296aSGreg Roach
12299219296aSGreg Roach    /**
12300dcd9387SGreg Roach     * @param string $total
12310dcd9387SGreg Roach     *
12320dcd9387SGreg Roach     * @return string
12339219296aSGreg Roach     */
12349219296aSGreg Roach    public function topTenOldestFemaleList(string $total = '10'): string
12359219296aSGreg Roach    {
12369219296aSGreg Roach        return $this->individualRepository->topTenOldestFemaleList((int) $total);
12379219296aSGreg Roach    }
12389219296aSGreg Roach
12399219296aSGreg Roach    /**
12400dcd9387SGreg Roach     * @param string $total
12410dcd9387SGreg Roach     *
12420dcd9387SGreg Roach     * @return string
12439219296aSGreg Roach     */
12449219296aSGreg Roach    public function topTenOldestMale(string $total = '10'): string
12459219296aSGreg Roach    {
12469219296aSGreg Roach        return $this->individualRepository->topTenOldestMale((int) $total);
12479219296aSGreg Roach    }
12489219296aSGreg Roach
12499219296aSGreg Roach    /**
12500dcd9387SGreg Roach     * @param string $total
12510dcd9387SGreg Roach     *
12520dcd9387SGreg Roach     * @return string
12539219296aSGreg Roach     */
12549219296aSGreg Roach    public function topTenOldestMaleList(string $total = '10'): string
12559219296aSGreg Roach    {
12569219296aSGreg Roach        return $this->individualRepository->topTenOldestMaleList((int) $total);
12579219296aSGreg Roach    }
12589219296aSGreg Roach
12599219296aSGreg Roach    /**
12600dcd9387SGreg Roach     * @param string $total
12610dcd9387SGreg Roach     *
12620dcd9387SGreg Roach     * @return string
12639219296aSGreg Roach     */
12649219296aSGreg Roach    public function topTenOldestAlive(string $total = '10'): string
12659219296aSGreg Roach    {
12669219296aSGreg Roach        return $this->individualRepository->topTenOldestAlive((int) $total);
12679219296aSGreg Roach    }
12689219296aSGreg Roach
12699219296aSGreg Roach    /**
12700dcd9387SGreg Roach     * @param string $total
12710dcd9387SGreg Roach     *
12720dcd9387SGreg Roach     * @return string
12739219296aSGreg Roach     */
12749219296aSGreg Roach    public function topTenOldestListAlive(string $total = '10'): string
12759219296aSGreg Roach    {
12769219296aSGreg Roach        return $this->individualRepository->topTenOldestListAlive((int) $total);
12779219296aSGreg Roach    }
12789219296aSGreg Roach
12799219296aSGreg Roach    /**
12800dcd9387SGreg Roach     * @param string $total
12810dcd9387SGreg Roach     *
12820dcd9387SGreg Roach     * @return string
12839219296aSGreg Roach     */
12849219296aSGreg Roach    public function topTenOldestFemaleAlive(string $total = '10'): string
12859219296aSGreg Roach    {
12869219296aSGreg Roach        return $this->individualRepository->topTenOldestFemaleAlive((int) $total);
12879219296aSGreg Roach    }
12889219296aSGreg Roach
12899219296aSGreg Roach    /**
12900dcd9387SGreg Roach     * @param string $total
12910dcd9387SGreg Roach     *
12920dcd9387SGreg Roach     * @return string
12939219296aSGreg Roach     */
12949219296aSGreg Roach    public function topTenOldestFemaleListAlive(string $total = '10'): string
12959219296aSGreg Roach    {
12969219296aSGreg Roach        return $this->individualRepository->topTenOldestFemaleListAlive((int) $total);
12979219296aSGreg Roach    }
12989219296aSGreg Roach
12999219296aSGreg Roach    /**
13000dcd9387SGreg Roach     * @param string $total
13010dcd9387SGreg Roach     *
13020dcd9387SGreg Roach     * @return string
13039219296aSGreg Roach     */
13049219296aSGreg Roach    public function topTenOldestMaleAlive(string $total = '10'): string
13059219296aSGreg Roach    {
13069219296aSGreg Roach        return $this->individualRepository->topTenOldestMaleAlive((int) $total);
13079219296aSGreg Roach    }
13089219296aSGreg Roach
13099219296aSGreg Roach    /**
13100dcd9387SGreg Roach     * @param string $total
13110dcd9387SGreg Roach     *
13120dcd9387SGreg Roach     * @return string
13139219296aSGreg Roach     */
13149219296aSGreg Roach    public function topTenOldestMaleListAlive(string $total = '10'): string
13159219296aSGreg Roach    {
13169219296aSGreg Roach        return $this->individualRepository->topTenOldestMaleListAlive((int) $total);
13179219296aSGreg Roach    }
13189219296aSGreg Roach
13199219296aSGreg Roach    /**
13200dcd9387SGreg Roach     * @param bool $show_years
13210dcd9387SGreg Roach     *
13220dcd9387SGreg Roach     * @return string
13239219296aSGreg Roach     */
13249219296aSGreg Roach    public function averageLifespan(bool $show_years = false): string
13259219296aSGreg Roach    {
13269219296aSGreg Roach        return $this->individualRepository->averageLifespan($show_years);
13279219296aSGreg Roach    }
13289219296aSGreg Roach
13299219296aSGreg Roach    /**
13300dcd9387SGreg Roach     * @param bool $show_years
13310dcd9387SGreg Roach     *
13320dcd9387SGreg Roach     * @return string
13339219296aSGreg Roach     */
13349219296aSGreg Roach    public function averageLifespanFemale(bool $show_years = false): string
13359219296aSGreg Roach    {
13369219296aSGreg Roach        return $this->individualRepository->averageLifespanFemale($show_years);
13379219296aSGreg Roach    }
13389219296aSGreg Roach
13399219296aSGreg Roach    /**
13400dcd9387SGreg Roach     * @param bool $show_years
13410dcd9387SGreg Roach     *
13420dcd9387SGreg Roach     * @return string
13439219296aSGreg Roach     */
13449219296aSGreg Roach    public function averageLifespanMale(bool $show_years = false): string
13459219296aSGreg Roach    {
13469219296aSGreg Roach        return $this->individualRepository->averageLifespanMale($show_years);
13479219296aSGreg Roach    }
13489219296aSGreg Roach
13499219296aSGreg Roach    /**
13500dcd9387SGreg Roach     * @return string
13519219296aSGreg Roach     */
13529219296aSGreg Roach    public function firstEvent(): string
13539219296aSGreg Roach    {
13549219296aSGreg Roach        return $this->eventRepository->firstEvent();
13559219296aSGreg Roach    }
13569219296aSGreg Roach
13579219296aSGreg Roach    /**
13580dcd9387SGreg Roach     * @return string
13599219296aSGreg Roach     */
13609219296aSGreg Roach    public function firstEventYear(): string
13619219296aSGreg Roach    {
13629219296aSGreg Roach        return $this->eventRepository->firstEventYear();
13639219296aSGreg Roach    }
13649219296aSGreg Roach
13659219296aSGreg Roach    /**
13660dcd9387SGreg Roach     * @return string
13679219296aSGreg Roach     */
13689219296aSGreg Roach    public function firstEventType(): string
13699219296aSGreg Roach    {
13709219296aSGreg Roach        return $this->eventRepository->firstEventType();
13719219296aSGreg Roach    }
13729219296aSGreg Roach
13739219296aSGreg Roach    /**
13740dcd9387SGreg Roach     * @return string
13759219296aSGreg Roach     */
13769219296aSGreg Roach    public function firstEventName(): string
13779219296aSGreg Roach    {
13789219296aSGreg Roach        return $this->eventRepository->firstEventName();
13799219296aSGreg Roach    }
13809219296aSGreg Roach
13819219296aSGreg Roach    /**
13820dcd9387SGreg Roach     * @return string
13839219296aSGreg Roach     */
13849219296aSGreg Roach    public function firstEventPlace(): string
13859219296aSGreg Roach    {
13869219296aSGreg Roach        return $this->eventRepository->firstEventPlace();
13879219296aSGreg Roach    }
13889219296aSGreg Roach
13899219296aSGreg Roach    /**
13900dcd9387SGreg Roach     * @return string
13919219296aSGreg Roach     */
13929219296aSGreg Roach    public function lastEvent(): string
13939219296aSGreg Roach    {
13949219296aSGreg Roach        return $this->eventRepository->lastEvent();
13959219296aSGreg Roach    }
13969219296aSGreg Roach
13979219296aSGreg Roach    /**
13980dcd9387SGreg Roach     * @return string
13999219296aSGreg Roach     */
14009219296aSGreg Roach    public function lastEventYear(): string
14019219296aSGreg Roach    {
14029219296aSGreg Roach        return $this->eventRepository->lastEventYear();
14039219296aSGreg Roach    }
14049219296aSGreg Roach
14059219296aSGreg Roach    /**
14060dcd9387SGreg Roach     * @return string
14079219296aSGreg Roach     */
14089219296aSGreg Roach    public function lastEventType(): string
14099219296aSGreg Roach    {
14109219296aSGreg Roach        return $this->eventRepository->lastEventType();
14119219296aSGreg Roach    }
14129219296aSGreg Roach
14139219296aSGreg Roach    /**
14140dcd9387SGreg Roach     * @return string
14159219296aSGreg Roach     */
14169219296aSGreg Roach    public function lastEventName(): string
14179219296aSGreg Roach    {
14189219296aSGreg Roach        return $this->eventRepository->lastEventName();
14199219296aSGreg Roach    }
14209219296aSGreg Roach
14219219296aSGreg Roach    /**
14220dcd9387SGreg Roach     * @return string
14239219296aSGreg Roach     */
14249219296aSGreg Roach    public function lastEventPlace(): string
14259219296aSGreg Roach    {
14269219296aSGreg Roach        return $this->eventRepository->lastEventType();
14279219296aSGreg Roach    }
14289219296aSGreg Roach
14299219296aSGreg Roach    /**
14300dcd9387SGreg Roach     * @return string
14319219296aSGreg Roach     */
14329219296aSGreg Roach    public function firstMarriage(): string
14339219296aSGreg Roach    {
14349219296aSGreg Roach        return $this->familyDatesRepository->firstMarriage();
14359219296aSGreg Roach    }
14369219296aSGreg Roach
14379219296aSGreg Roach    /**
14380dcd9387SGreg Roach     * @return string
14399219296aSGreg Roach     */
14409219296aSGreg Roach    public function firstMarriageYear(): string
14419219296aSGreg Roach    {
14429219296aSGreg Roach        return $this->familyDatesRepository->firstMarriageYear();
14439219296aSGreg Roach    }
14449219296aSGreg Roach
14459219296aSGreg Roach    /**
14460dcd9387SGreg Roach     * @return string
14479219296aSGreg Roach     */
14489219296aSGreg Roach    public function firstMarriageName(): string
14499219296aSGreg Roach    {
14509219296aSGreg Roach        return $this->familyDatesRepository->firstMarriageName();
14519219296aSGreg Roach    }
14529219296aSGreg Roach
14539219296aSGreg Roach    /**
14540dcd9387SGreg Roach     * @return string
14559219296aSGreg Roach     */
14569219296aSGreg Roach    public function firstMarriagePlace(): string
14579219296aSGreg Roach    {
14589219296aSGreg Roach        return $this->familyDatesRepository->firstMarriagePlace();
14599219296aSGreg Roach    }
14609219296aSGreg Roach
14619219296aSGreg Roach    /**
14620dcd9387SGreg Roach     * @return string
14639219296aSGreg Roach     */
14649219296aSGreg Roach    public function lastMarriage(): string
14659219296aSGreg Roach    {
14669219296aSGreg Roach        return $this->familyDatesRepository->lastMarriage();
14679219296aSGreg Roach    }
14689219296aSGreg Roach
14699219296aSGreg Roach    /**
14700dcd9387SGreg Roach     * @return string
14719219296aSGreg Roach     */
14729219296aSGreg Roach    public function lastMarriageYear(): string
14739219296aSGreg Roach    {
14749219296aSGreg Roach        return $this->familyDatesRepository->lastMarriageYear();
14759219296aSGreg Roach    }
14769219296aSGreg Roach
14779219296aSGreg Roach    /**
14780dcd9387SGreg Roach     * @return string
14799219296aSGreg Roach     */
14809219296aSGreg Roach    public function lastMarriageName(): string
14819219296aSGreg Roach    {
14829219296aSGreg Roach        return $this->familyDatesRepository->lastMarriageName();
14839219296aSGreg Roach    }
14849219296aSGreg Roach
14859219296aSGreg Roach    /**
14860dcd9387SGreg Roach     * @return string
14879219296aSGreg Roach     */
14889219296aSGreg Roach    public function lastMarriagePlace(): string
14899219296aSGreg Roach    {
14909219296aSGreg Roach        return $this->familyDatesRepository->lastMarriagePlace();
14919219296aSGreg Roach    }
14929219296aSGreg Roach
14939219296aSGreg Roach    /**
14940dcd9387SGreg Roach     * @param int $year1
14950dcd9387SGreg Roach     * @param int $year2
14960dcd9387SGreg Roach     *
14970dcd9387SGreg Roach     * @return Builder
14989219296aSGreg Roach     */
1499e6f3d5e2SGreg Roach    public function statsMarriageQuery(int $year1 = -1, int $year2 = -1): Builder
15009219296aSGreg Roach    {
1501e6f3d5e2SGreg Roach        return $this->familyRepository->statsMarriageQuery($year1, $year2);
1502e6f3d5e2SGreg Roach    }
1503e6f3d5e2SGreg Roach
1504e6f3d5e2SGreg Roach    /**
15050dcd9387SGreg Roach     * @param int $year1
15060dcd9387SGreg Roach     * @param int $year2
15070dcd9387SGreg Roach     *
15080dcd9387SGreg Roach     * @return Builder
1509e6f3d5e2SGreg Roach     */
1510e6f3d5e2SGreg Roach    public function statsFirstMarriageQuery(int $year1 = -1, int $year2 = -1): Builder
1511e6f3d5e2SGreg Roach    {
1512e6f3d5e2SGreg Roach        return $this->familyRepository->statsFirstMarriageQuery($year1, $year2);
15139219296aSGreg Roach    }
15149219296aSGreg Roach
15159219296aSGreg Roach    /**
15160dcd9387SGreg Roach     * @param string|null $color_from
15170dcd9387SGreg Roach     * @param string|null $color_to
15180dcd9387SGreg Roach     *
15190dcd9387SGreg Roach     * @return string
15209219296aSGreg Roach     */
152188de55fdSRico Sonntag    public function statsMarr(string $color_from = null, string $color_to = null): string
15229219296aSGreg Roach    {
152388de55fdSRico Sonntag        return $this->familyRepository->statsMarr($color_from, $color_to);
15249219296aSGreg Roach    }
15259219296aSGreg Roach
15269219296aSGreg Roach    /**
15270dcd9387SGreg Roach     * @return string
15289219296aSGreg Roach     */
15299219296aSGreg Roach    public function firstDivorce(): string
15309219296aSGreg Roach    {
15319219296aSGreg Roach        return $this->familyDatesRepository->firstDivorce();
15329219296aSGreg Roach    }
15339219296aSGreg Roach
15349219296aSGreg Roach    /**
15350dcd9387SGreg Roach     * @return string
15369219296aSGreg Roach     */
15379219296aSGreg Roach    public function firstDivorceYear(): string
15389219296aSGreg Roach    {
15399219296aSGreg Roach        return $this->familyDatesRepository->firstDivorceYear();
15409219296aSGreg Roach    }
15419219296aSGreg Roach
15429219296aSGreg Roach    /**
15430dcd9387SGreg Roach     * @return string
15449219296aSGreg Roach     */
15459219296aSGreg Roach    public function firstDivorceName(): string
15469219296aSGreg Roach    {
15479219296aSGreg Roach        return $this->familyDatesRepository->firstDivorceName();
15489219296aSGreg Roach    }
15499219296aSGreg Roach
15509219296aSGreg Roach    /**
15510dcd9387SGreg Roach     * @return string
15529219296aSGreg Roach     */
15539219296aSGreg Roach    public function firstDivorcePlace(): string
15549219296aSGreg Roach    {
15559219296aSGreg Roach        return $this->familyDatesRepository->firstDivorcePlace();
15569219296aSGreg Roach    }
15579219296aSGreg Roach
15589219296aSGreg Roach    /**
15590dcd9387SGreg Roach     * @return string
15609219296aSGreg Roach     */
15619219296aSGreg Roach    public function lastDivorce(): string
15629219296aSGreg Roach    {
15639219296aSGreg Roach        return $this->familyDatesRepository->lastDivorce();
15649219296aSGreg Roach    }
15659219296aSGreg Roach
15669219296aSGreg Roach    /**
15670dcd9387SGreg Roach     * @return string
15689219296aSGreg Roach     */
15699219296aSGreg Roach    public function lastDivorceYear(): string
15709219296aSGreg Roach    {
15719219296aSGreg Roach        return $this->familyDatesRepository->lastDivorceYear();
15729219296aSGreg Roach    }
15739219296aSGreg Roach
15749219296aSGreg Roach    /**
15750dcd9387SGreg Roach     * @return string
15769219296aSGreg Roach     */
15779219296aSGreg Roach    public function lastDivorceName(): string
15789219296aSGreg Roach    {
15799219296aSGreg Roach        return $this->familyDatesRepository->lastDivorceName();
15809219296aSGreg Roach    }
15819219296aSGreg Roach
15829219296aSGreg Roach    /**
15830dcd9387SGreg Roach     * @return string
15849219296aSGreg Roach     */
15859219296aSGreg Roach    public function lastDivorcePlace(): string
15869219296aSGreg Roach    {
15879219296aSGreg Roach        return $this->familyDatesRepository->lastDivorcePlace();
15889219296aSGreg Roach    }
15899219296aSGreg Roach
15909219296aSGreg Roach    /**
15910dcd9387SGreg Roach     * @param string|null $color_from
15920dcd9387SGreg Roach     * @param string|null $color_to
15930dcd9387SGreg Roach     *
15940dcd9387SGreg Roach     * @return string
15959219296aSGreg Roach     */
159688de55fdSRico Sonntag    public function statsDiv(string $color_from = null, string $color_to = null): string
15979219296aSGreg Roach    {
159888de55fdSRico Sonntag        return $this->familyRepository->statsDiv($color_from, $color_to);
15999219296aSGreg Roach    }
16009219296aSGreg Roach
16019219296aSGreg Roach    /**
16020dcd9387SGreg Roach     * @return string
16039219296aSGreg Roach     */
16049219296aSGreg Roach    public function youngestMarriageFemale(): string
16059219296aSGreg Roach    {
16069219296aSGreg Roach        return $this->familyRepository->youngestMarriageFemale();
16079219296aSGreg Roach    }
16089219296aSGreg Roach
16099219296aSGreg Roach    /**
16100dcd9387SGreg Roach     * @return string
16119219296aSGreg Roach     */
16129219296aSGreg Roach    public function youngestMarriageFemaleName(): string
16139219296aSGreg Roach    {
16149219296aSGreg Roach        return $this->familyRepository->youngestMarriageFemaleName();
16159219296aSGreg Roach    }
16169219296aSGreg Roach
16179219296aSGreg Roach    /**
16180dcd9387SGreg Roach     * @param string $show_years
16190dcd9387SGreg Roach     *
16200dcd9387SGreg Roach     * @return string
16219219296aSGreg Roach     */
16229219296aSGreg Roach    public function youngestMarriageFemaleAge(string $show_years = ''): string
16239219296aSGreg Roach    {
16249219296aSGreg Roach        return $this->familyRepository->youngestMarriageFemaleAge($show_years);
16259219296aSGreg Roach    }
16269219296aSGreg Roach
16279219296aSGreg Roach    /**
16280dcd9387SGreg Roach     * @return string
16299219296aSGreg Roach     */
16309219296aSGreg Roach    public function oldestMarriageFemale(): string
16319219296aSGreg Roach    {
16329219296aSGreg Roach        return $this->familyRepository->oldestMarriageFemale();
16339219296aSGreg Roach    }
16349219296aSGreg Roach
16359219296aSGreg Roach    /**
16360dcd9387SGreg Roach     * @return string
16379219296aSGreg Roach     */
16389219296aSGreg Roach    public function oldestMarriageFemaleName(): string
16399219296aSGreg Roach    {
16409219296aSGreg Roach        return $this->familyRepository->oldestMarriageFemaleName();
16419219296aSGreg Roach    }
16429219296aSGreg Roach
16439219296aSGreg Roach    /**
16440dcd9387SGreg Roach     * @param string $show_years
16450dcd9387SGreg Roach     *
16460dcd9387SGreg Roach     * @return string
16479219296aSGreg Roach     */
16489219296aSGreg Roach    public function oldestMarriageFemaleAge(string $show_years = ''): string
16499219296aSGreg Roach    {
16509219296aSGreg Roach        return $this->familyRepository->oldestMarriageFemaleAge($show_years);
16519219296aSGreg Roach    }
16529219296aSGreg Roach
16539219296aSGreg Roach    /**
16540dcd9387SGreg Roach     * @return string
16559219296aSGreg Roach     */
16569219296aSGreg Roach    public function youngestMarriageMale(): string
16579219296aSGreg Roach    {
16589219296aSGreg Roach        return $this->familyRepository->youngestMarriageMale();
16599219296aSGreg Roach    }
16609219296aSGreg Roach
16619219296aSGreg Roach    /**
16620dcd9387SGreg Roach     * @return string
16639219296aSGreg Roach     */
16649219296aSGreg Roach    public function youngestMarriageMaleName(): string
16659219296aSGreg Roach    {
16669219296aSGreg Roach        return $this->familyRepository->youngestMarriageMaleName();
16679219296aSGreg Roach    }
16689219296aSGreg Roach
16699219296aSGreg Roach    /**
16700dcd9387SGreg Roach     * @param string $show_years
16710dcd9387SGreg Roach     *
16720dcd9387SGreg Roach     * @return string
16739219296aSGreg Roach     */
16749219296aSGreg Roach    public function youngestMarriageMaleAge(string $show_years = ''): string
16759219296aSGreg Roach    {
16769219296aSGreg Roach        return $this->familyRepository->youngestMarriageMaleAge($show_years);
16779219296aSGreg Roach    }
16789219296aSGreg Roach
16799219296aSGreg Roach    /**
16800dcd9387SGreg Roach     * @return string
16819219296aSGreg Roach     */
16829219296aSGreg Roach    public function oldestMarriageMale(): string
16839219296aSGreg Roach    {
16849219296aSGreg Roach        return $this->familyRepository->oldestMarriageMale();
16859219296aSGreg Roach    }
16869219296aSGreg Roach
16879219296aSGreg Roach    /**
16880dcd9387SGreg Roach     * @return string
16899219296aSGreg Roach     */
16909219296aSGreg Roach    public function oldestMarriageMaleName(): string
16919219296aSGreg Roach    {
16929219296aSGreg Roach        return $this->familyRepository->oldestMarriageMaleName();
16939219296aSGreg Roach    }
16949219296aSGreg Roach
16959219296aSGreg Roach    /**
16960dcd9387SGreg Roach     * @param string $show_years
16970dcd9387SGreg Roach     *
16980dcd9387SGreg Roach     * @return string
16999219296aSGreg Roach     */
17009219296aSGreg Roach    public function oldestMarriageMaleAge(string $show_years = ''): string
17019219296aSGreg Roach    {
17029219296aSGreg Roach        return $this->familyRepository->oldestMarriageMaleAge($show_years);
17039219296aSGreg Roach    }
17049219296aSGreg Roach
17059219296aSGreg Roach    /**
17060dcd9387SGreg Roach     * @param string $sex
17070dcd9387SGreg Roach     * @param int    $year1
17080dcd9387SGreg Roach     * @param int    $year2
17090dcd9387SGreg Roach     *
17100dcd9387SGreg Roach     * @return array
17119219296aSGreg Roach     */
1712afa8d404SGreg Roach    public function statsMarrAgeQuery(string $sex, int $year1 = -1, int $year2 = -1): array
17139219296aSGreg Roach    {
17149219296aSGreg Roach        return $this->familyRepository->statsMarrAgeQuery($sex, $year1, $year2);
17159219296aSGreg Roach    }
17169219296aSGreg Roach
17179219296aSGreg Roach    /**
17180dcd9387SGreg Roach     * @return string
17199219296aSGreg Roach     */
172088de55fdSRico Sonntag    public function statsMarrAge(): string
17219219296aSGreg Roach    {
172288de55fdSRico Sonntag        return $this->familyRepository->statsMarrAge();
17239219296aSGreg Roach    }
17249219296aSGreg Roach
17259219296aSGreg Roach    /**
17260dcd9387SGreg Roach     * @param string $total
17270dcd9387SGreg Roach     *
17280dcd9387SGreg Roach     * @return string
17299219296aSGreg Roach     */
17309219296aSGreg Roach    public function ageBetweenSpousesMF(string $total = '10'): string
17319219296aSGreg Roach    {
17329219296aSGreg Roach        return $this->familyRepository->ageBetweenSpousesMF((int) $total);
17339219296aSGreg Roach    }
17349219296aSGreg Roach
17359219296aSGreg Roach    /**
17360dcd9387SGreg Roach     * @param string $total
17370dcd9387SGreg Roach     *
17380dcd9387SGreg Roach     * @return string
17399219296aSGreg Roach     */
17409219296aSGreg Roach    public function ageBetweenSpousesMFList(string $total = '10'): string
17419219296aSGreg Roach    {
17429219296aSGreg Roach        return $this->familyRepository->ageBetweenSpousesMFList((int) $total);
17439219296aSGreg Roach    }
17449219296aSGreg Roach
17459219296aSGreg Roach    /**
17460dcd9387SGreg Roach     * @param string $total
17470dcd9387SGreg Roach     *
17480dcd9387SGreg Roach     * @return string
17499219296aSGreg Roach     */
17509219296aSGreg Roach    public function ageBetweenSpousesFM(string $total = '10'): string
17519219296aSGreg Roach    {
17529219296aSGreg Roach        return $this->familyRepository->ageBetweenSpousesFM((int) $total);
17539219296aSGreg Roach    }
17549219296aSGreg Roach
17559219296aSGreg Roach    /**
17560dcd9387SGreg Roach     * @param string $total
17570dcd9387SGreg Roach     *
17580dcd9387SGreg Roach     * @return string
17599219296aSGreg Roach     */
17609219296aSGreg Roach    public function ageBetweenSpousesFMList(string $total = '10'): string
17619219296aSGreg Roach    {
17629219296aSGreg Roach        return $this->familyRepository->ageBetweenSpousesFMList((int) $total);
17639219296aSGreg Roach    }
17649219296aSGreg Roach
17659219296aSGreg Roach    /**
17660dcd9387SGreg Roach     * @return string
17679219296aSGreg Roach     */
17689219296aSGreg Roach    public function topAgeOfMarriageFamily(): string
17699219296aSGreg Roach    {
17709219296aSGreg Roach        return $this->familyRepository->topAgeOfMarriageFamily();
17719219296aSGreg Roach    }
17729219296aSGreg Roach
17739219296aSGreg Roach    /**
17740dcd9387SGreg Roach     * @return string
17759219296aSGreg Roach     */
17769219296aSGreg Roach    public function topAgeOfMarriage(): string
17779219296aSGreg Roach    {
17789219296aSGreg Roach        return $this->familyRepository->topAgeOfMarriage();
17799219296aSGreg Roach    }
17809219296aSGreg Roach
17819219296aSGreg Roach    /**
17820dcd9387SGreg Roach     * @param string $total
17830dcd9387SGreg Roach     *
17840dcd9387SGreg Roach     * @return string
17859219296aSGreg Roach     */
17869219296aSGreg Roach    public function topAgeOfMarriageFamilies(string $total = '10'): string
17879219296aSGreg Roach    {
17889219296aSGreg Roach        return $this->familyRepository->topAgeOfMarriageFamilies((int) $total);
17899219296aSGreg Roach    }
17909219296aSGreg Roach
17919219296aSGreg Roach    /**
17920dcd9387SGreg Roach     * @param string $total
17930dcd9387SGreg Roach     *
17940dcd9387SGreg Roach     * @return string
17959219296aSGreg Roach     */
17969219296aSGreg Roach    public function topAgeOfMarriageFamiliesList(string $total = '10'): string
17979219296aSGreg Roach    {
17989219296aSGreg Roach        return $this->familyRepository->topAgeOfMarriageFamiliesList((int) $total);
17999219296aSGreg Roach    }
18009219296aSGreg Roach
18019219296aSGreg Roach    /**
18020dcd9387SGreg Roach     * @return string
18039219296aSGreg Roach     */
18049219296aSGreg Roach    public function minAgeOfMarriageFamily(): string
18059219296aSGreg Roach    {
18069219296aSGreg Roach        return $this->familyRepository->minAgeOfMarriageFamily();
18079219296aSGreg Roach    }
18089219296aSGreg Roach
18099219296aSGreg Roach    /**
18100dcd9387SGreg Roach     * @return string
18119219296aSGreg Roach     */
18129219296aSGreg Roach    public function minAgeOfMarriage(): string
18139219296aSGreg Roach    {
18149219296aSGreg Roach        return $this->familyRepository->minAgeOfMarriage();
18159219296aSGreg Roach    }
18169219296aSGreg Roach
18179219296aSGreg Roach    /**
18180dcd9387SGreg Roach     * @param string $total
18190dcd9387SGreg Roach     *
18200dcd9387SGreg Roach     * @return string
18219219296aSGreg Roach     */
18229219296aSGreg Roach    public function minAgeOfMarriageFamilies(string $total = '10'): string
18239219296aSGreg Roach    {
18249219296aSGreg Roach        return $this->familyRepository->minAgeOfMarriageFamilies((int) $total);
18259219296aSGreg Roach    }
18269219296aSGreg Roach
18279219296aSGreg Roach    /**
18280dcd9387SGreg Roach     * @param string $total
18290dcd9387SGreg Roach     *
18300dcd9387SGreg Roach     * @return string
18319219296aSGreg Roach     */
18329219296aSGreg Roach    public function minAgeOfMarriageFamiliesList(string $total = '10'): string
18339219296aSGreg Roach    {
18349219296aSGreg Roach        return $this->familyRepository->minAgeOfMarriageFamiliesList((int) $total);
18359219296aSGreg Roach    }
18369219296aSGreg Roach
18379219296aSGreg Roach    /**
18380dcd9387SGreg Roach     * @return string
18399219296aSGreg Roach     */
18409219296aSGreg Roach    public function youngestMother(): string
18419219296aSGreg Roach    {
18429219296aSGreg Roach        return $this->familyRepository->youngestMother();
18439219296aSGreg Roach    }
18449219296aSGreg Roach
18459219296aSGreg Roach    /**
18460dcd9387SGreg Roach     * @return string
18479219296aSGreg Roach     */
18489219296aSGreg Roach    public function youngestMotherName(): string
18499219296aSGreg Roach    {
18509219296aSGreg Roach        return $this->familyRepository->youngestMotherName();
18519219296aSGreg Roach    }
18529219296aSGreg Roach
18539219296aSGreg Roach    /**
18540dcd9387SGreg Roach     * @param string $show_years
18550dcd9387SGreg Roach     *
18560dcd9387SGreg Roach     * @return string
18579219296aSGreg Roach     */
18589219296aSGreg Roach    public function youngestMotherAge(string $show_years = ''): string
18599219296aSGreg Roach    {
18609219296aSGreg Roach        return $this->familyRepository->youngestMotherAge($show_years);
18619219296aSGreg Roach    }
18629219296aSGreg Roach
18639219296aSGreg Roach    /**
18640dcd9387SGreg Roach     * @return string
18659219296aSGreg Roach     */
18669219296aSGreg Roach    public function oldestMother(): string
18679219296aSGreg Roach    {
18689219296aSGreg Roach        return $this->familyRepository->oldestMother();
18699219296aSGreg Roach    }
18709219296aSGreg Roach
18719219296aSGreg Roach    /**
18720dcd9387SGreg Roach     * @return string
18739219296aSGreg Roach     */
18749219296aSGreg Roach    public function oldestMotherName(): string
18759219296aSGreg Roach    {
18769219296aSGreg Roach        return $this->familyRepository->oldestMotherName();
18779219296aSGreg Roach    }
18789219296aSGreg Roach
18799219296aSGreg Roach    /**
18800dcd9387SGreg Roach     * @param string $show_years
18810dcd9387SGreg Roach     *
18820dcd9387SGreg Roach     * @return string
18839219296aSGreg Roach     */
18849219296aSGreg Roach    public function oldestMotherAge(string $show_years = ''): string
18859219296aSGreg Roach    {
18869219296aSGreg Roach        return $this->familyRepository->oldestMotherAge($show_years);
18879219296aSGreg Roach    }
18889219296aSGreg Roach
18899219296aSGreg Roach    /**
18900dcd9387SGreg Roach     * @return string
18919219296aSGreg Roach     */
18929219296aSGreg Roach    public function youngestFather(): string
18939219296aSGreg Roach    {
18949219296aSGreg Roach        return $this->familyRepository->youngestFather();
18959219296aSGreg Roach    }
18969219296aSGreg Roach
18979219296aSGreg Roach    /**
18980dcd9387SGreg Roach     * @return string
18999219296aSGreg Roach     */
19009219296aSGreg Roach    public function youngestFatherName(): string
19019219296aSGreg Roach    {
19029219296aSGreg Roach        return $this->familyRepository->youngestFatherName();
19039219296aSGreg Roach    }
19049219296aSGreg Roach
19059219296aSGreg Roach    /**
19060dcd9387SGreg Roach     * @param string $show_years
19070dcd9387SGreg Roach     *
19080dcd9387SGreg Roach     * @return string
19099219296aSGreg Roach     */
19109219296aSGreg Roach    public function youngestFatherAge(string $show_years = ''): string
19119219296aSGreg Roach    {
19129219296aSGreg Roach        return $this->familyRepository->youngestFatherAge($show_years);
19139219296aSGreg Roach    }
19149219296aSGreg Roach
19159219296aSGreg Roach    /**
19160dcd9387SGreg Roach     * @return string
19179219296aSGreg Roach     */
19189219296aSGreg Roach    public function oldestFather(): string
19199219296aSGreg Roach    {
19209219296aSGreg Roach        return $this->familyRepository->oldestFather();
19219219296aSGreg Roach    }
19229219296aSGreg Roach
19239219296aSGreg Roach    /**
19240dcd9387SGreg Roach     * @return string
19259219296aSGreg Roach     */
19269219296aSGreg Roach    public function oldestFatherName(): string
19279219296aSGreg Roach    {
19289219296aSGreg Roach        return $this->familyRepository->oldestFatherName();
19299219296aSGreg Roach    }
19309219296aSGreg Roach
19319219296aSGreg Roach    /**
19320dcd9387SGreg Roach     * @param string $show_years
19330dcd9387SGreg Roach     *
19340dcd9387SGreg Roach     * @return string
19359219296aSGreg Roach     */
19369219296aSGreg Roach    public function oldestFatherAge(string $show_years = ''): string
19379219296aSGreg Roach    {
19389219296aSGreg Roach        return $this->familyRepository->oldestFatherAge($show_years);
19399219296aSGreg Roach    }
19409219296aSGreg Roach
19419219296aSGreg Roach    /**
19420dcd9387SGreg Roach     * @return string
19439219296aSGreg Roach     */
19449219296aSGreg Roach    public function totalMarriedMales(): string
19459219296aSGreg Roach    {
19469219296aSGreg Roach        return $this->familyRepository->totalMarriedMales();
19479219296aSGreg Roach    }
19489219296aSGreg Roach
19499219296aSGreg Roach    /**
19500dcd9387SGreg Roach     * @return string
19519219296aSGreg Roach     */
19529219296aSGreg Roach    public function totalMarriedFemales(): string
19539219296aSGreg Roach    {
19549219296aSGreg Roach        return $this->familyRepository->totalMarriedFemales();
19559219296aSGreg Roach    }
19569219296aSGreg Roach
19579219296aSGreg Roach    /**
19580dcd9387SGreg Roach     * @param int $year1
19590dcd9387SGreg Roach     * @param int $year2
19600dcd9387SGreg Roach     *
19610dcd9387SGreg Roach     * @return Builder
19629219296aSGreg Roach     */
1963999da590SGreg Roach    public function monthFirstChildQuery(int $year1 = -1, int $year2 = -1): Builder
19649219296aSGreg Roach    {
1965999da590SGreg Roach        return $this->familyRepository->monthFirstChildQuery($year1, $year2);
1966999da590SGreg Roach    }
1967999da590SGreg Roach
1968999da590SGreg Roach    /**
19690dcd9387SGreg Roach     * @param int $year1
19700dcd9387SGreg Roach     * @param int $year2
19710dcd9387SGreg Roach     *
19720dcd9387SGreg Roach     * @return Builder
1973999da590SGreg Roach     */
1974999da590SGreg Roach    public function monthFirstChildBySexQuery(int $year1 = -1, int $year2 = -1): Builder
1975999da590SGreg Roach    {
1976999da590SGreg Roach        return $this->familyRepository->monthFirstChildBySexQuery($year1, $year2);
19779219296aSGreg Roach    }
19789219296aSGreg Roach
19799219296aSGreg Roach    /**
19800dcd9387SGreg Roach     * @return string
19819219296aSGreg Roach     */
19829219296aSGreg Roach    public function largestFamily(): string
19839219296aSGreg Roach    {
19849219296aSGreg Roach        return $this->familyRepository->largestFamily();
19859219296aSGreg Roach    }
19869219296aSGreg Roach
19879219296aSGreg Roach    /**
19880dcd9387SGreg Roach     * @return string
19899219296aSGreg Roach     */
19909219296aSGreg Roach    public function largestFamilySize(): string
19919219296aSGreg Roach    {
19929219296aSGreg Roach        return $this->familyRepository->largestFamilySize();
19939219296aSGreg Roach    }
19949219296aSGreg Roach
19959219296aSGreg Roach    /**
19960dcd9387SGreg Roach     * @return string
19979219296aSGreg Roach     */
19989219296aSGreg Roach    public function largestFamilyName(): string
19999219296aSGreg Roach    {
20009219296aSGreg Roach        return $this->familyRepository->largestFamilyName();
20019219296aSGreg Roach    }
20029219296aSGreg Roach
20039219296aSGreg Roach    /**
20040dcd9387SGreg Roach     * @param string $total
20050dcd9387SGreg Roach     *
20060dcd9387SGreg Roach     * @return string
20079219296aSGreg Roach     */
20089219296aSGreg Roach    public function topTenLargestFamily(string $total = '10'): string
20099219296aSGreg Roach    {
20109219296aSGreg Roach        return $this->familyRepository->topTenLargestFamily((int) $total);
20119219296aSGreg Roach    }
20129219296aSGreg Roach
20139219296aSGreg Roach    /**
20140dcd9387SGreg Roach     * @param string $total
20150dcd9387SGreg Roach     *
20160dcd9387SGreg Roach     * @return string
20179219296aSGreg Roach     */
20189219296aSGreg Roach    public function topTenLargestFamilyList(string $total = '10'): string
20199219296aSGreg Roach    {
20209219296aSGreg Roach        return $this->familyRepository->topTenLargestFamilyList((int) $total);
20219219296aSGreg Roach    }
20229219296aSGreg Roach
20239219296aSGreg Roach    /**
20240dcd9387SGreg Roach     * @param string|null $color_from
20250dcd9387SGreg Roach     * @param string|null $color_to
20260dcd9387SGreg Roach     * @param string      $total
20270dcd9387SGreg Roach     *
20280dcd9387SGreg Roach     * @return string
20299219296aSGreg Roach     */
20309219296aSGreg Roach    public function chartLargestFamilies(
20319219296aSGreg Roach        string $color_from = null,
20329219296aSGreg Roach        string $color_to = null,
20339219296aSGreg Roach        string $total = '10'
2034c81b7bf1SGreg Roach    ): string {
203588de55fdSRico Sonntag        return $this->familyRepository->chartLargestFamilies($color_from, $color_to, (int) $total);
20369219296aSGreg Roach    }
20379219296aSGreg Roach
20389219296aSGreg Roach    /**
20390dcd9387SGreg Roach     * @return string
20409219296aSGreg Roach     */
20419219296aSGreg Roach    public function totalChildren(): string
20429219296aSGreg Roach    {
20439219296aSGreg Roach        return $this->familyRepository->totalChildren();
20449219296aSGreg Roach    }
20459219296aSGreg Roach
20469219296aSGreg Roach    /**
20470dcd9387SGreg Roach     * @return string
20489219296aSGreg Roach     */
20499219296aSGreg Roach    public function averageChildren(): string
20509219296aSGreg Roach    {
20519219296aSGreg Roach        return $this->familyRepository->averageChildren();
20529219296aSGreg Roach    }
20539219296aSGreg Roach
20549219296aSGreg Roach    /**
20550dcd9387SGreg Roach     * @param int $year1
20560dcd9387SGreg Roach     * @param int $year2
20570dcd9387SGreg Roach     *
20580dcd9387SGreg Roach     * @return array
20599219296aSGreg Roach     */
2060b1126ab4SGreg Roach    public function statsChildrenQuery(int $year1 = -1, int $year2 = -1): array
20619219296aSGreg Roach    {
2062b1126ab4SGreg Roach        return $this->familyRepository->statsChildrenQuery($year1, $year2);
20639219296aSGreg Roach    }
20649219296aSGreg Roach
20659219296aSGreg Roach    /**
20660dcd9387SGreg Roach     * @return string
20679219296aSGreg Roach     */
2068cde1d378SGreg Roach    public function statsChildren(): string
20699219296aSGreg Roach    {
2070cde1d378SGreg Roach        return $this->familyRepository->statsChildren();
20719219296aSGreg Roach    }
20729219296aSGreg Roach
20739219296aSGreg Roach    /**
20740dcd9387SGreg Roach     * @param string $total
20750dcd9387SGreg Roach     *
20760dcd9387SGreg Roach     * @return string
20779219296aSGreg Roach     */
20789219296aSGreg Roach    public function topAgeBetweenSiblingsName(string $total = '10'): string
20799219296aSGreg Roach    {
20809219296aSGreg Roach        return $this->familyRepository->topAgeBetweenSiblingsName((int) $total);
20819219296aSGreg Roach    }
20829219296aSGreg Roach
20839219296aSGreg Roach    /**
20840dcd9387SGreg Roach     * @param string $total
20850dcd9387SGreg Roach     *
20860dcd9387SGreg Roach     * @return string
20879219296aSGreg Roach     */
20889219296aSGreg Roach    public function topAgeBetweenSiblings(string $total = '10'): string
20899219296aSGreg Roach    {
20909219296aSGreg Roach        return $this->familyRepository->topAgeBetweenSiblings((int) $total);
20919219296aSGreg Roach    }
20929219296aSGreg Roach
20939219296aSGreg Roach    /**
20940dcd9387SGreg Roach     * @param string $total
20950dcd9387SGreg Roach     *
20960dcd9387SGreg Roach     * @return string
20979219296aSGreg Roach     */
20989219296aSGreg Roach    public function topAgeBetweenSiblingsFullName(string $total = '10'): string
20999219296aSGreg Roach    {
21009219296aSGreg Roach        return $this->familyRepository->topAgeBetweenSiblingsFullName((int) $total);
21019219296aSGreg Roach    }
21029219296aSGreg Roach
21039219296aSGreg Roach    /**
21040dcd9387SGreg Roach     * @param string $total
21050dcd9387SGreg Roach     * @param string $one
21060dcd9387SGreg Roach     *
21070dcd9387SGreg Roach     * @return string
21089219296aSGreg Roach     */
21099219296aSGreg Roach    public function topAgeBetweenSiblingsList(string $total = '10', string $one = ''): string
21109219296aSGreg Roach    {
21119219296aSGreg Roach        return $this->familyRepository->topAgeBetweenSiblingsList((int) $total, $one);
21129219296aSGreg Roach    }
21139219296aSGreg Roach
21149219296aSGreg Roach    /**
21150dcd9387SGreg Roach     * @return string
21169219296aSGreg Roach     */
21179219296aSGreg Roach    public function noChildrenFamilies(): string
21189219296aSGreg Roach    {
21199219296aSGreg Roach        return $this->familyRepository->noChildrenFamilies();
21209219296aSGreg Roach    }
21219219296aSGreg Roach
21229219296aSGreg Roach    /**
21230dcd9387SGreg Roach     * @param string $type
21240dcd9387SGreg Roach     *
21250dcd9387SGreg Roach     * @return string
21269219296aSGreg Roach     */
21279219296aSGreg Roach    public function noChildrenFamiliesList(string $type = 'list'): string
21289219296aSGreg Roach    {
21299219296aSGreg Roach        return $this->familyRepository->noChildrenFamiliesList($type);
21309219296aSGreg Roach    }
21319219296aSGreg Roach
21329219296aSGreg Roach    /**
21330dcd9387SGreg Roach     * @param string $year1
21340dcd9387SGreg Roach     * @param string $year2
21350dcd9387SGreg Roach     *
21360dcd9387SGreg Roach     * @return string
21379219296aSGreg Roach     */
21389219296aSGreg Roach    public function chartNoChildrenFamilies(
21399219296aSGreg Roach        string $year1 = '-1',
21409219296aSGreg Roach        string $year2 = '-1'
2141c81b7bf1SGreg Roach    ): string {
214288de55fdSRico Sonntag        return $this->familyRepository->chartNoChildrenFamilies((int) $year1, (int) $year2);
21439219296aSGreg Roach    }
21449219296aSGreg Roach
21459219296aSGreg Roach    /**
21460dcd9387SGreg Roach     * @param string $total
21470dcd9387SGreg Roach     *
21480dcd9387SGreg Roach     * @return string
21499219296aSGreg Roach     */
21509219296aSGreg Roach    public function topTenLargestGrandFamily(string $total = '10'): string
21519219296aSGreg Roach    {
21529219296aSGreg Roach        return $this->familyRepository->topTenLargestGrandFamily((int) $total);
21539219296aSGreg Roach    }
21549219296aSGreg Roach
21559219296aSGreg Roach    /**
21560dcd9387SGreg Roach     * @param string $total
21570dcd9387SGreg Roach     *
21580dcd9387SGreg Roach     * @return string
21599219296aSGreg Roach     */
21609219296aSGreg Roach    public function topTenLargestGrandFamilyList(string $total = '10'): string
21619219296aSGreg Roach    {
21629219296aSGreg Roach        return $this->familyRepository->topTenLargestGrandFamilyList((int) $total);
21639219296aSGreg Roach    }
21649219296aSGreg Roach
21659219296aSGreg Roach    /**
21660dcd9387SGreg Roach     * @return string
21679219296aSGreg Roach     */
21689219296aSGreg Roach    public function getCommonSurname(): string
21699219296aSGreg Roach    {
21709219296aSGreg Roach        return $this->individualRepository->getCommonSurname();
21719219296aSGreg Roach    }
21729219296aSGreg Roach
21739219296aSGreg Roach    /**
21740dcd9387SGreg Roach     * @param string $threshold
21750dcd9387SGreg Roach     * @param string $number_of_surnames
21760dcd9387SGreg Roach     * @param string $sorting
21770dcd9387SGreg Roach     *
21780dcd9387SGreg Roach     * @return string
21799219296aSGreg Roach     */
21809219296aSGreg Roach    public function commonSurnames(
21819219296aSGreg Roach        string $threshold = '1',
21829219296aSGreg Roach        string $number_of_surnames = '10',
21839219296aSGreg Roach        string $sorting = 'alpha'
2184c81b7bf1SGreg Roach    ): string {
21859219296aSGreg Roach        return $this->individualRepository->commonSurnames((int) $threshold, (int) $number_of_surnames, $sorting);
21869219296aSGreg Roach    }
21879219296aSGreg Roach
21889219296aSGreg Roach    /**
21890dcd9387SGreg Roach     * @param string $threshold
21900dcd9387SGreg Roach     * @param string $number_of_surnames
21910dcd9387SGreg Roach     * @param string $sorting
21920dcd9387SGreg Roach     *
21930dcd9387SGreg Roach     * @return string
21949219296aSGreg Roach     */
21959219296aSGreg Roach    public function commonSurnamesTotals(
21969219296aSGreg Roach        string $threshold = '1',
21979219296aSGreg Roach        string $number_of_surnames = '10',
21982da2e0a6SGreg Roach        string $sorting = 'count'
2199c81b7bf1SGreg Roach    ): string {
22009219296aSGreg Roach        return $this->individualRepository->commonSurnamesTotals((int) $threshold, (int) $number_of_surnames, $sorting);
22019219296aSGreg Roach    }
22029219296aSGreg Roach
22039219296aSGreg Roach    /**
22040dcd9387SGreg Roach     * @param string $threshold
22050dcd9387SGreg Roach     * @param string $number_of_surnames
22060dcd9387SGreg Roach     * @param string $sorting
22070dcd9387SGreg Roach     *
22080dcd9387SGreg Roach     * @return string
22099219296aSGreg Roach     */
22109219296aSGreg Roach    public function commonSurnamesList(
22119219296aSGreg Roach        string $threshold = '1',
22129219296aSGreg Roach        string $number_of_surnames = '10',
22139219296aSGreg Roach        string $sorting = 'alpha'
2214c81b7bf1SGreg Roach    ): string {
22159219296aSGreg Roach        return $this->individualRepository->commonSurnamesList((int) $threshold, (int) $number_of_surnames, $sorting);
22169219296aSGreg Roach    }
22179219296aSGreg Roach
22189219296aSGreg Roach    /**
22190dcd9387SGreg Roach     * @param string $threshold
22200dcd9387SGreg Roach     * @param string $number_of_surnames
22210dcd9387SGreg Roach     * @param string $sorting
22220dcd9387SGreg Roach     *
22230dcd9387SGreg Roach     * @return string
22249219296aSGreg Roach     */
22259219296aSGreg Roach    public function commonSurnamesListTotals(
22269219296aSGreg Roach        string $threshold = '1',
22279219296aSGreg Roach        string $number_of_surnames = '10',
22282da2e0a6SGreg Roach        string $sorting = 'count'
2229c81b7bf1SGreg Roach    ): string {
22309219296aSGreg Roach        return $this->individualRepository
22319219296aSGreg Roach            ->commonSurnamesListTotals((int) $threshold, (int) $number_of_surnames, $sorting);
22329219296aSGreg Roach    }
22339219296aSGreg Roach
22349219296aSGreg Roach    /**
22350dcd9387SGreg Roach     * @param string|null $color_from
22360dcd9387SGreg Roach     * @param string|null $color_to
22370dcd9387SGreg Roach     * @param string      $number_of_surnames
22380dcd9387SGreg Roach     *
22390dcd9387SGreg Roach     * @return string
22409219296aSGreg Roach     */
22419219296aSGreg Roach    public function chartCommonSurnames(
22429219296aSGreg Roach        string $color_from = null,
22439219296aSGreg Roach        string $color_to = null,
22449219296aSGreg Roach        string $number_of_surnames = '10'
2245c81b7bf1SGreg Roach    ): string {
22469219296aSGreg Roach        return $this->individualRepository
224788de55fdSRico Sonntag            ->chartCommonSurnames($color_from, $color_to, (int) $number_of_surnames);
22489219296aSGreg Roach    }
22499219296aSGreg Roach
22509219296aSGreg Roach    /**
22510dcd9387SGreg Roach     * @param string $threshold
22520dcd9387SGreg Roach     * @param string $maxtoshow
22530dcd9387SGreg Roach     *
22540dcd9387SGreg Roach     * @return string
22559219296aSGreg Roach     */
22569219296aSGreg Roach    public function commonGiven(string $threshold = '1', string $maxtoshow = '10'): string
22579219296aSGreg Roach    {
22589219296aSGreg Roach        return $this->individualRepository->commonGiven((int) $threshold, (int) $maxtoshow);
22599219296aSGreg Roach    }
22609219296aSGreg Roach
22619219296aSGreg Roach    /**
22620dcd9387SGreg Roach     * @param string $threshold
22630dcd9387SGreg Roach     * @param string $maxtoshow
22640dcd9387SGreg Roach     *
22650dcd9387SGreg Roach     * @return string
22669219296aSGreg Roach     */
22679219296aSGreg Roach    public function commonGivenTotals(string $threshold = '1', string $maxtoshow = '10'): string
22689219296aSGreg Roach    {
22699219296aSGreg Roach        return $this->individualRepository->commonGivenTotals((int) $threshold, (int) $maxtoshow);
22709219296aSGreg Roach    }
22719219296aSGreg Roach
22729219296aSGreg Roach    /**
22730dcd9387SGreg Roach     * @param string $threshold
22740dcd9387SGreg Roach     * @param string $maxtoshow
22750dcd9387SGreg Roach     *
22760dcd9387SGreg Roach     * @return string
22779219296aSGreg Roach     */
22789219296aSGreg Roach    public function commonGivenList(string $threshold = '1', string $maxtoshow = '10'): string
22799219296aSGreg Roach    {
22809219296aSGreg Roach        return $this->individualRepository->commonGivenList((int) $threshold, (int) $maxtoshow);
22819219296aSGreg Roach    }
22829219296aSGreg Roach
22839219296aSGreg Roach    /**
22840dcd9387SGreg Roach     * @param string $threshold
22850dcd9387SGreg Roach     * @param string $maxtoshow
22860dcd9387SGreg Roach     *
22870dcd9387SGreg Roach     * @return string
22889219296aSGreg Roach     */
22899219296aSGreg Roach    public function commonGivenListTotals(string $threshold = '1', string $maxtoshow = '10'): string
22909219296aSGreg Roach    {
22919219296aSGreg Roach        return $this->individualRepository->commonGivenListTotals((int) $threshold, (int) $maxtoshow);
22929219296aSGreg Roach    }
22939219296aSGreg Roach
22949219296aSGreg Roach    /**
22950dcd9387SGreg Roach     * @param string $threshold
22960dcd9387SGreg Roach     * @param string $maxtoshow
22970dcd9387SGreg Roach     *
22980dcd9387SGreg Roach     * @return string
22999219296aSGreg Roach     */
23009219296aSGreg Roach    public function commonGivenTable(string $threshold = '1', string $maxtoshow = '10'): string
23019219296aSGreg Roach    {
23029219296aSGreg Roach        return $this->individualRepository->commonGivenTable((int) $threshold, (int) $maxtoshow);
23039219296aSGreg Roach    }
23049219296aSGreg Roach
23059219296aSGreg Roach    /**
23060dcd9387SGreg Roach     * @param string $threshold
23070dcd9387SGreg Roach     * @param string $maxtoshow
23080dcd9387SGreg Roach     *
23090dcd9387SGreg Roach     * @return string
23109219296aSGreg Roach     */
23119219296aSGreg Roach    public function commonGivenFemale(string $threshold = '1', string $maxtoshow = '10'): string
23129219296aSGreg Roach    {
23139219296aSGreg Roach        return $this->individualRepository->commonGivenFemale((int) $threshold, (int) $maxtoshow);
23149219296aSGreg Roach    }
23159219296aSGreg Roach
23169219296aSGreg Roach    /**
23170dcd9387SGreg Roach     * @param string $threshold
23180dcd9387SGreg Roach     * @param string $maxtoshow
23190dcd9387SGreg Roach     *
23200dcd9387SGreg Roach     * @return string
23219219296aSGreg Roach     */
23229219296aSGreg Roach    public function commonGivenFemaleTotals(string $threshold = '1', string $maxtoshow = '10'): string
23239219296aSGreg Roach    {
23249219296aSGreg Roach        return $this->individualRepository->commonGivenFemaleTotals((int) $threshold, (int) $maxtoshow);
23259219296aSGreg Roach    }
23269219296aSGreg Roach
23279219296aSGreg Roach    /**
23280dcd9387SGreg Roach     * @param string $threshold
23290dcd9387SGreg Roach     * @param string $maxtoshow
23300dcd9387SGreg Roach     *
23310dcd9387SGreg Roach     * @return string
23329219296aSGreg Roach     */
23339219296aSGreg Roach    public function commonGivenFemaleList(string $threshold = '1', string $maxtoshow = '10'): string
23349219296aSGreg Roach    {
23359219296aSGreg Roach        return $this->individualRepository->commonGivenFemaleList((int) $threshold, (int) $maxtoshow);
23369219296aSGreg Roach    }
23379219296aSGreg Roach
23389219296aSGreg Roach    /**
23390dcd9387SGreg Roach     * @param string $threshold
23400dcd9387SGreg Roach     * @param string $maxtoshow
23410dcd9387SGreg Roach     *
23420dcd9387SGreg Roach     * @return string
23439219296aSGreg Roach     */
23449219296aSGreg Roach    public function commonGivenFemaleListTotals(string $threshold = '1', string $maxtoshow = '10'): string
23459219296aSGreg Roach    {
23469219296aSGreg Roach        return $this->individualRepository->commonGivenFemaleListTotals((int) $threshold, (int) $maxtoshow);
23479219296aSGreg Roach    }
23489219296aSGreg Roach
23499219296aSGreg Roach    /**
23500dcd9387SGreg Roach     * @param string $threshold
23510dcd9387SGreg Roach     * @param string $maxtoshow
23520dcd9387SGreg Roach     *
23530dcd9387SGreg Roach     * @return string
23549219296aSGreg Roach     */
23559219296aSGreg Roach    public function commonGivenFemaleTable(string $threshold = '1', string $maxtoshow = '10'): string
23569219296aSGreg Roach    {
23579219296aSGreg Roach        return $this->individualRepository->commonGivenFemaleTable((int) $threshold, (int) $maxtoshow);
23589219296aSGreg Roach    }
23599219296aSGreg Roach
23609219296aSGreg Roach    /**
23610dcd9387SGreg Roach     * @param string $threshold
23620dcd9387SGreg Roach     * @param string $maxtoshow
23630dcd9387SGreg Roach     *
23640dcd9387SGreg Roach     * @return string
23659219296aSGreg Roach     */
23669219296aSGreg Roach    public function commonGivenMale(string $threshold = '1', string $maxtoshow = '10'): string
23679219296aSGreg Roach    {
23689219296aSGreg Roach        return $this->individualRepository->commonGivenMale((int) $threshold, (int) $maxtoshow);
23699219296aSGreg Roach    }
23709219296aSGreg Roach
23719219296aSGreg Roach    /**
23720dcd9387SGreg Roach     * @param string $threshold
23730dcd9387SGreg Roach     * @param string $maxtoshow
23740dcd9387SGreg Roach     *
23750dcd9387SGreg Roach     * @return string
23769219296aSGreg Roach     */
23779219296aSGreg Roach    public function commonGivenMaleTotals(string $threshold = '1', string $maxtoshow = '10'): string
23789219296aSGreg Roach    {
23799219296aSGreg Roach        return $this->individualRepository->commonGivenMaleTotals((int) $threshold, (int) $maxtoshow);
23809219296aSGreg Roach    }
23819219296aSGreg Roach
23829219296aSGreg Roach    /**
23830dcd9387SGreg Roach     * @param string $threshold
23840dcd9387SGreg Roach     * @param string $maxtoshow
23850dcd9387SGreg Roach     *
23860dcd9387SGreg Roach     * @return string
23879219296aSGreg Roach     */
23889219296aSGreg Roach    public function commonGivenMaleList(string $threshold = '1', string $maxtoshow = '10'): string
23899219296aSGreg Roach    {
23909219296aSGreg Roach        return $this->individualRepository->commonGivenMaleList((int) $threshold, (int) $maxtoshow);
23919219296aSGreg Roach    }
23929219296aSGreg Roach
23939219296aSGreg Roach    /**
23940dcd9387SGreg Roach     * @param string $threshold
23950dcd9387SGreg Roach     * @param string $maxtoshow
23960dcd9387SGreg Roach     *
23970dcd9387SGreg Roach     * @return string
23989219296aSGreg Roach     */
23999219296aSGreg Roach    public function commonGivenMaleListTotals(string $threshold = '1', string $maxtoshow = '10'): string
24009219296aSGreg Roach    {
24019219296aSGreg Roach        return $this->individualRepository->commonGivenMaleListTotals((int) $threshold, (int) $maxtoshow);
24029219296aSGreg Roach    }
24039219296aSGreg Roach
24049219296aSGreg Roach    /**
24050dcd9387SGreg Roach     * @param string $threshold
24060dcd9387SGreg Roach     * @param string $maxtoshow
24070dcd9387SGreg Roach     *
24080dcd9387SGreg Roach     * @return string
24099219296aSGreg Roach     */
24109219296aSGreg Roach    public function commonGivenMaleTable(string $threshold = '1', string $maxtoshow = '10'): string
24119219296aSGreg Roach    {
24129219296aSGreg Roach        return $this->individualRepository->commonGivenMaleTable((int) $threshold, (int) $maxtoshow);
24139219296aSGreg Roach    }
24149219296aSGreg Roach
24159219296aSGreg Roach    /**
24160dcd9387SGreg Roach     * @param string $threshold
24170dcd9387SGreg Roach     * @param string $maxtoshow
24180dcd9387SGreg Roach     *
24190dcd9387SGreg Roach     * @return string
24209219296aSGreg Roach     */
24219219296aSGreg Roach    public function commonGivenUnknown(string $threshold = '1', string $maxtoshow = '10'): string
24229219296aSGreg Roach    {
24239219296aSGreg Roach        return $this->individualRepository->commonGivenUnknown((int) $threshold, (int) $maxtoshow);
24249219296aSGreg Roach    }
24259219296aSGreg Roach
24269219296aSGreg Roach    /**
24270dcd9387SGreg Roach     * @param string $threshold
24280dcd9387SGreg Roach     * @param string $maxtoshow
24290dcd9387SGreg Roach     *
24300dcd9387SGreg Roach     * @return string
24319219296aSGreg Roach     */
24329219296aSGreg Roach    public function commonGivenUnknownTotals(string $threshold = '1', string $maxtoshow = '10'): string
24339219296aSGreg Roach    {
24349219296aSGreg Roach        return $this->individualRepository->commonGivenUnknownTotals((int) $threshold, (int) $maxtoshow);
24359219296aSGreg Roach    }
24369219296aSGreg Roach
24379219296aSGreg Roach    /**
24380dcd9387SGreg Roach     * @param string $threshold
24390dcd9387SGreg Roach     * @param string $maxtoshow
24400dcd9387SGreg Roach     *
24410dcd9387SGreg Roach     * @return string
24429219296aSGreg Roach     */
24439219296aSGreg Roach    public function commonGivenUnknownList(string $threshold = '1', string $maxtoshow = '10'): string
24449219296aSGreg Roach    {
24459219296aSGreg Roach        return $this->individualRepository->commonGivenUnknownList((int) $threshold, (int) $maxtoshow);
24469219296aSGreg Roach    }
24479219296aSGreg Roach
24489219296aSGreg Roach    /**
24490dcd9387SGreg Roach     * @param string $threshold
24500dcd9387SGreg Roach     * @param string $maxtoshow
24510dcd9387SGreg Roach     *
24520dcd9387SGreg Roach     * @return string
24539219296aSGreg Roach     */
24549219296aSGreg Roach    public function commonGivenUnknownListTotals(string $threshold = '1', string $maxtoshow = '10'): string
24559219296aSGreg Roach    {
24569219296aSGreg Roach        return $this->individualRepository->commonGivenUnknownListTotals((int) $threshold, (int) $maxtoshow);
24579219296aSGreg Roach    }
24589219296aSGreg Roach
24599219296aSGreg Roach    /**
24600dcd9387SGreg Roach     * @param string $threshold
24610dcd9387SGreg Roach     * @param string $maxtoshow
24620dcd9387SGreg Roach     *
24630dcd9387SGreg Roach     * @return string
24649219296aSGreg Roach     */
24659219296aSGreg Roach    public function commonGivenUnknownTable(string $threshold = '1', string $maxtoshow = '10'): string
24669219296aSGreg Roach    {
24679219296aSGreg Roach        return $this->individualRepository->commonGivenUnknownTable((int) $threshold, (int) $maxtoshow);
24689219296aSGreg Roach    }
24699219296aSGreg Roach
24709219296aSGreg Roach    /**
24710dcd9387SGreg Roach     * @param string|null $color_from
24720dcd9387SGreg Roach     * @param string|null $color_to
24730dcd9387SGreg Roach     * @param string      $maxtoshow
24740dcd9387SGreg Roach     *
24750dcd9387SGreg Roach     * @return string
24769219296aSGreg Roach     */
24779219296aSGreg Roach    public function chartCommonGiven(
24789219296aSGreg Roach        string $color_from = null,
24799219296aSGreg Roach        string $color_to = null,
24809219296aSGreg Roach        string $maxtoshow = '7'
2481c81b7bf1SGreg Roach    ): string {
248288de55fdSRico Sonntag        return $this->individualRepository->chartCommonGiven($color_from, $color_to, (int) $maxtoshow);
24839219296aSGreg Roach    }
24849219296aSGreg Roach
24859219296aSGreg Roach    /**
24860dcd9387SGreg Roach     * @return string
24879219296aSGreg Roach     */
24889219296aSGreg Roach    public function usersLoggedIn(): string
24899219296aSGreg Roach    {
24909219296aSGreg Roach        return $this->userRepository->usersLoggedIn();
24919219296aSGreg Roach    }
24929219296aSGreg Roach
24939219296aSGreg Roach    /**
24940dcd9387SGreg Roach     * @return string
24959219296aSGreg Roach     */
24969219296aSGreg Roach    public function usersLoggedInList(): string
24979219296aSGreg Roach    {
24989219296aSGreg Roach        return $this->userRepository->usersLoggedInList();
24999219296aSGreg Roach    }
25009219296aSGreg Roach
25019219296aSGreg Roach    /**
25020dcd9387SGreg Roach     * @return int
25039219296aSGreg Roach     */
25049219296aSGreg Roach    public function usersLoggedInTotal(): int
25059219296aSGreg Roach    {
25069219296aSGreg Roach        return $this->userRepository->usersLoggedInTotal();
25079219296aSGreg Roach    }
25089219296aSGreg Roach
25099219296aSGreg Roach    /**
25100dcd9387SGreg Roach     * @return int
25119219296aSGreg Roach     */
25129219296aSGreg Roach    public function usersLoggedInTotalAnon(): int
25139219296aSGreg Roach    {
25149219296aSGreg Roach        return $this->userRepository->usersLoggedInTotalAnon();
25159219296aSGreg Roach    }
25169219296aSGreg Roach
25179219296aSGreg Roach    /**
25180dcd9387SGreg Roach     * @return int
25199219296aSGreg Roach     */
25209219296aSGreg Roach    public function usersLoggedInTotalVisible(): int
25219219296aSGreg Roach    {
25229219296aSGreg Roach        return $this->userRepository->usersLoggedInTotalVisible();
25239219296aSGreg Roach    }
25249219296aSGreg Roach
25259219296aSGreg Roach    /**
25260dcd9387SGreg Roach     * @return string
25279219296aSGreg Roach     */
25289219296aSGreg Roach    public function userId(): string
25299219296aSGreg Roach    {
25309219296aSGreg Roach        return $this->userRepository->userId();
25319219296aSGreg Roach    }
25329219296aSGreg Roach
25339219296aSGreg Roach    /**
25340dcd9387SGreg Roach     * @param string $visitor_text
25350dcd9387SGreg Roach     *
25360dcd9387SGreg Roach     * @return string
25379219296aSGreg Roach     */
25389219296aSGreg Roach    public function userName(string $visitor_text = ''): string
25399219296aSGreg Roach    {
254018483248SGreg Roach        return $this->userRepository->userName($visitor_text);
25419219296aSGreg Roach    }
25429219296aSGreg Roach
25439219296aSGreg Roach    /**
25440dcd9387SGreg Roach     * @return string
25459219296aSGreg Roach     */
25469219296aSGreg Roach    public function userFullName(): string
25479219296aSGreg Roach    {
25489219296aSGreg Roach        return $this->userRepository->userFullName();
25499219296aSGreg Roach    }
25509219296aSGreg Roach
25519219296aSGreg Roach    /**
25520dcd9387SGreg Roach     * @return string
25539219296aSGreg Roach     */
25549219296aSGreg Roach    public function totalUsers(): string
25559219296aSGreg Roach    {
25569219296aSGreg Roach        return $this->userRepository->totalUsers();
25579219296aSGreg Roach    }
25589219296aSGreg Roach
25599219296aSGreg Roach    /**
25600dcd9387SGreg Roach     * @return string
25619219296aSGreg Roach     */
25629219296aSGreg Roach    public function totalAdmins(): string
25639219296aSGreg Roach    {
25649219296aSGreg Roach        return $this->userRepository->totalAdmins();
25659219296aSGreg Roach    }
25669219296aSGreg Roach
25679219296aSGreg Roach    /**
25680dcd9387SGreg Roach     * @return string
25699219296aSGreg Roach     */
25709219296aSGreg Roach    public function totalNonAdmins(): string
25719219296aSGreg Roach    {
25729219296aSGreg Roach        return $this->userRepository->totalNonAdmins();
25739219296aSGreg Roach    }
25749219296aSGreg Roach
25759219296aSGreg Roach    /**
25760dcd9387SGreg Roach     * @return string
25779219296aSGreg Roach     */
25789219296aSGreg Roach    public function latestUserId(): string
25799219296aSGreg Roach    {
25809219296aSGreg Roach        return $this->latestUserRepository->latestUserId();
25819219296aSGreg Roach    }
25829219296aSGreg Roach
25839219296aSGreg Roach    /**
25840dcd9387SGreg Roach     * @return string
25859219296aSGreg Roach     */
25869219296aSGreg Roach    public function latestUserName(): string
25879219296aSGreg Roach    {
25889219296aSGreg Roach        return $this->latestUserRepository->latestUserName();
25899219296aSGreg Roach    }
25909219296aSGreg Roach
25919219296aSGreg Roach    /**
25920dcd9387SGreg Roach     * @return string
25939219296aSGreg Roach     */
25949219296aSGreg Roach    public function latestUserFullName(): string
25959219296aSGreg Roach    {
25969219296aSGreg Roach        return $this->latestUserRepository->latestUserFullName();
25979219296aSGreg Roach    }
25989219296aSGreg Roach
25999219296aSGreg Roach    /**
26000dcd9387SGreg Roach     * @param string|null $format
26010dcd9387SGreg Roach     *
26020dcd9387SGreg Roach     * @return string
26039219296aSGreg Roach     */
26049219296aSGreg Roach    public function latestUserRegDate(string $format = null): string
26059219296aSGreg Roach    {
260618483248SGreg Roach        return $this->latestUserRepository->latestUserRegDate($format);
26079219296aSGreg Roach    }
26089219296aSGreg Roach
26099219296aSGreg Roach    /**
26100dcd9387SGreg Roach     * @param string|null $format
26110dcd9387SGreg Roach     *
26120dcd9387SGreg Roach     * @return string
26139219296aSGreg Roach     */
26149219296aSGreg Roach    public function latestUserRegTime(string $format = null): string
26159219296aSGreg Roach    {
261618483248SGreg Roach        return $this->latestUserRepository->latestUserRegTime($format);
26179219296aSGreg Roach    }
26189219296aSGreg Roach
26199219296aSGreg Roach    /**
26200dcd9387SGreg Roach     * @param string|null $yes
26210dcd9387SGreg Roach     * @param string|null $no
26220dcd9387SGreg Roach     *
26230dcd9387SGreg Roach     * @return string
26249219296aSGreg Roach     */
26259219296aSGreg Roach    public function latestUserLoggedin(string $yes = null, string $no = null): string
26269219296aSGreg Roach    {
262718483248SGreg Roach        return $this->latestUserRepository->latestUserLoggedin($yes, $no);
26289219296aSGreg Roach    }
26299219296aSGreg Roach
26309219296aSGreg Roach    /**
26310dcd9387SGreg Roach     * @return string
26329219296aSGreg Roach     */
26339219296aSGreg Roach    public function contactWebmaster(): string
26349219296aSGreg Roach    {
263571378461SGreg Roach        return $this->contactRepository->contactWebmaster();
26369219296aSGreg Roach    }
26379219296aSGreg Roach
26389219296aSGreg Roach    /**
26390dcd9387SGreg Roach     * @return string
26409219296aSGreg Roach     */
26419219296aSGreg Roach    public function contactGedcom(): string
26429219296aSGreg Roach    {
264371378461SGreg Roach        return $this->contactRepository->contactGedcom();
26449219296aSGreg Roach    }
26459219296aSGreg Roach
26469219296aSGreg Roach    /**
26470dcd9387SGreg Roach     * @return string
26489219296aSGreg Roach     */
26499219296aSGreg Roach    public function serverDate(): string
26509219296aSGreg Roach    {
26519219296aSGreg Roach        return $this->serverRepository->serverDate();
26529219296aSGreg Roach    }
26539219296aSGreg Roach
26549219296aSGreg Roach    /**
26550dcd9387SGreg Roach     * @return string
26569219296aSGreg Roach     */
26579219296aSGreg Roach    public function serverTime(): string
26589219296aSGreg Roach    {
26599219296aSGreg Roach        return $this->serverRepository->serverTime();
26609219296aSGreg Roach    }
26619219296aSGreg Roach
26629219296aSGreg Roach    /**
26630dcd9387SGreg Roach     * @return string
26649219296aSGreg Roach     */
26659219296aSGreg Roach    public function serverTime24(): string
26669219296aSGreg Roach    {
26679219296aSGreg Roach        return $this->serverRepository->serverTime24();
26689219296aSGreg Roach    }
26699219296aSGreg Roach
26709219296aSGreg Roach    /**
26719219296aSGreg Roach     * What is the timezone of the server.
26729219296aSGreg Roach     *
26739219296aSGreg Roach     * @return string
26749219296aSGreg Roach     */
26759219296aSGreg Roach    public function serverTimezone(): string
26769219296aSGreg Roach    {
26779219296aSGreg Roach        return $this->serverRepository->serverTimezone();
26789219296aSGreg Roach    }
26799219296aSGreg Roach
26809219296aSGreg Roach    /**
26810dcd9387SGreg Roach     * @return string
26829219296aSGreg Roach     */
26839219296aSGreg Roach    public function browserDate(): string
26849219296aSGreg Roach    {
26859219296aSGreg Roach        return $this->browserRepository->browserDate();
26869219296aSGreg Roach    }
26879219296aSGreg Roach
26889219296aSGreg Roach    /**
26890dcd9387SGreg Roach     * @return string
26909219296aSGreg Roach     */
26919219296aSGreg Roach    public function browserTime(): string
26929219296aSGreg Roach    {
26939219296aSGreg Roach        return $this->browserRepository->browserTime();
26949219296aSGreg Roach    }
26959219296aSGreg Roach
26969219296aSGreg Roach    /**
26970dcd9387SGreg Roach     * @return string
26989219296aSGreg Roach     */
26999219296aSGreg Roach    public function browserTimezone(): string
27009219296aSGreg Roach    {
27019219296aSGreg Roach        return $this->browserRepository->browserTimezone();
27029219296aSGreg Roach    }
27039219296aSGreg Roach
27049219296aSGreg Roach    /**
27050dcd9387SGreg Roach     * @param string $page_parameter
27060dcd9387SGreg Roach     *
27070dcd9387SGreg Roach     * @return string
27089219296aSGreg Roach     */
27099219296aSGreg Roach    public function hitCount(string $page_parameter = ''): string
27109219296aSGreg Roach    {
27119219296aSGreg Roach        return $this->hitCountRepository->hitCount($page_parameter);
27129219296aSGreg Roach    }
27139219296aSGreg Roach
27149219296aSGreg Roach    /**
27150dcd9387SGreg Roach     * @param string $page_parameter
27160dcd9387SGreg Roach     *
27170dcd9387SGreg Roach     * @return string
27189219296aSGreg Roach     */
27199219296aSGreg Roach    public function hitCountUser(string $page_parameter = ''): string
27209219296aSGreg Roach    {
27219219296aSGreg Roach        return $this->hitCountRepository->hitCountUser($page_parameter);
27229219296aSGreg Roach    }
27239219296aSGreg Roach
27249219296aSGreg Roach    /**
27250dcd9387SGreg Roach     * @param string $page_parameter
27260dcd9387SGreg Roach     *
27270dcd9387SGreg Roach     * @return string
27289219296aSGreg Roach     */
27299219296aSGreg Roach    public function hitCountIndi(string $page_parameter = ''): string
27309219296aSGreg Roach    {
27319219296aSGreg Roach        return $this->hitCountRepository->hitCountIndi($page_parameter);
27329219296aSGreg Roach    }
27339219296aSGreg Roach
27349219296aSGreg Roach    /**
27350dcd9387SGreg Roach     * @param string $page_parameter
27360dcd9387SGreg Roach     *
27370dcd9387SGreg Roach     * @return string
27389219296aSGreg Roach     */
27399219296aSGreg Roach    public function hitCountFam(string $page_parameter = ''): string
27409219296aSGreg Roach    {
27419219296aSGreg Roach        return $this->hitCountRepository->hitCountFam($page_parameter);
27429219296aSGreg Roach    }
27439219296aSGreg Roach
27449219296aSGreg Roach    /**
27450dcd9387SGreg Roach     * @param string $page_parameter
27460dcd9387SGreg Roach     *
27470dcd9387SGreg Roach     * @return string
27489219296aSGreg Roach     */
27499219296aSGreg Roach    public function hitCountSour(string $page_parameter = ''): string
27509219296aSGreg Roach    {
27519219296aSGreg Roach        return $this->hitCountRepository->hitCountSour($page_parameter);
27529219296aSGreg Roach    }
27539219296aSGreg Roach
27549219296aSGreg Roach    /**
27550dcd9387SGreg Roach     * @param string $page_parameter
27560dcd9387SGreg Roach     *
27570dcd9387SGreg Roach     * @return string
27589219296aSGreg Roach     */
27599219296aSGreg Roach    public function hitCountRepo(string $page_parameter = ''): string
27609219296aSGreg Roach    {
27619219296aSGreg Roach        return $this->hitCountRepository->hitCountRepo($page_parameter);
27629219296aSGreg Roach    }
27639219296aSGreg Roach
27649219296aSGreg Roach    /**
27650dcd9387SGreg Roach     * @param string $page_parameter
27660dcd9387SGreg Roach     *
27670dcd9387SGreg Roach     * @return string
27689219296aSGreg Roach     */
27699219296aSGreg Roach    public function hitCountNote(string $page_parameter = ''): string
27709219296aSGreg Roach    {
27719219296aSGreg Roach        return $this->hitCountRepository->hitCountNote($page_parameter);
27729219296aSGreg Roach    }
27739219296aSGreg Roach
27749219296aSGreg Roach    /**
27750dcd9387SGreg Roach     * @param string $page_parameter
27760dcd9387SGreg Roach     *
27770dcd9387SGreg Roach     * @return string
27789219296aSGreg Roach     */
27799219296aSGreg Roach    public function hitCountObje(string $page_parameter = ''): string
27809219296aSGreg Roach    {
27819219296aSGreg Roach        return $this->hitCountRepository->hitCountObje($page_parameter);
27829219296aSGreg Roach    }
27839219296aSGreg Roach
27849219296aSGreg Roach    /**
27850dcd9387SGreg Roach     * @return string
27869219296aSGreg Roach     */
27879219296aSGreg Roach    public function gedcomFavorites(): string
27889219296aSGreg Roach    {
27899219296aSGreg Roach        return $this->favoritesRepository->gedcomFavorites();
27909219296aSGreg Roach    }
27919219296aSGreg Roach
27929219296aSGreg Roach    /**
27930dcd9387SGreg Roach     * @return string
27949219296aSGreg Roach     */
27959219296aSGreg Roach    public function userFavorites(): string
27969219296aSGreg Roach    {
27979219296aSGreg Roach        return $this->favoritesRepository->userFavorites();
27989219296aSGreg Roach    }
27999219296aSGreg Roach
28009219296aSGreg Roach    /**
28010dcd9387SGreg Roach     * @return string
28029219296aSGreg Roach     */
28039219296aSGreg Roach    public function totalGedcomFavorites(): string
28049219296aSGreg Roach    {
28059219296aSGreg Roach        return $this->favoritesRepository->totalGedcomFavorites();
28069219296aSGreg Roach    }
28079219296aSGreg Roach
28089219296aSGreg Roach    /**
28090dcd9387SGreg Roach     * @return string
28109219296aSGreg Roach     */
28119219296aSGreg Roach    public function totalUserFavorites(): string
28129219296aSGreg Roach    {
28139219296aSGreg Roach        return $this->favoritesRepository->totalUserFavorites();
28149219296aSGreg Roach    }
28159219296aSGreg Roach
28169219296aSGreg Roach    /**
28170dcd9387SGreg Roach     * @return string
28189219296aSGreg Roach     */
28199219296aSGreg Roach    public function totalUserMessages(): string
28209219296aSGreg Roach    {
28219219296aSGreg Roach        return $this->messageRepository->totalUserMessages();
28229219296aSGreg Roach    }
28239219296aSGreg Roach
28249219296aSGreg Roach    /**
28250dcd9387SGreg Roach     * @return string
28269219296aSGreg Roach     */
28279219296aSGreg Roach    public function totalUserJournal(): string
28289219296aSGreg Roach    {
28299219296aSGreg Roach        return $this->newsRepository->totalUserJournal();
28309219296aSGreg Roach    }
28319219296aSGreg Roach
28329219296aSGreg Roach    /**
28330dcd9387SGreg Roach     * @return string
28349219296aSGreg Roach     */
28359219296aSGreg Roach    public function totalGedcomNews(): string
28369219296aSGreg Roach    {
28379219296aSGreg Roach        return $this->newsRepository->totalGedcomNews();
28389219296aSGreg Roach    }
28399219296aSGreg Roach
28409219296aSGreg Roach    /**
28419219296aSGreg Roach     * Create any of the other blocks.
28429219296aSGreg Roach     * Use as #callBlock:block_name#
28439219296aSGreg Roach     *
28449219296aSGreg Roach     * @param string $block
28459219296aSGreg Roach     * @param string ...$params
28469219296aSGreg Roach     *
2847e364afe4SGreg Roach     * @return string|null
28489219296aSGreg Roach     */
28499219296aSGreg Roach    public function callBlock(string $block = '', ...$params): ?string
28509219296aSGreg Roach    {
285187cca37cSGreg Roach        /** @var ModuleBlockInterface|null $module */
2852fd9aba47SGreg Roach        $module = $this->module_service
285387cca37cSGreg Roach            ->findByComponent(ModuleBlockInterface::class, $this->tree, Auth::user())
28546c2179e2SGreg Roach            ->first(static function (ModuleInterface $module) use ($block): bool {
28559219296aSGreg Roach                return $module->name() === $block && $module->name() !== 'html';
28560797053bSGreg Roach            });
28579219296aSGreg Roach
28589219296aSGreg Roach        if ($module === null) {
28599219296aSGreg Roach            return '';
28609219296aSGreg Roach        }
28619219296aSGreg Roach
28629219296aSGreg Roach        // Build the config array
28639219296aSGreg Roach        $cfg = [];
28649219296aSGreg Roach        foreach ($params as $config) {
28659219296aSGreg Roach            $bits = explode('=', $config);
28669219296aSGreg Roach
28676ccdf4f0SGreg Roach            if (count($bits) < 2) {
28689219296aSGreg Roach                continue;
28699219296aSGreg Roach            }
28709219296aSGreg Roach
28719219296aSGreg Roach            $v       = array_shift($bits);
28729219296aSGreg Roach            $cfg[$v] = implode('=', $bits);
28739219296aSGreg Roach        }
28749219296aSGreg Roach
28753caaa4d2SGreg Roach        return $module->getBlock($this->tree, 0, ModuleBlockInterface::CONTEXT_EMBED, $cfg);
28769219296aSGreg Roach    }
28779219296aSGreg Roach
28789219296aSGreg Roach    /**
28799219296aSGreg Roach     * What is the current version of webtrees.
28809219296aSGreg Roach     *
28819219296aSGreg Roach     * @return string
28829219296aSGreg Roach     */
28839219296aSGreg Roach    public function webtreesVersion(): string
28849219296aSGreg Roach    {
28859219296aSGreg Roach        return Webtrees::VERSION;
28869219296aSGreg Roach    }
288771378461SGreg Roach
288871378461SGreg Roach    /**
288971378461SGreg Roach     * Get tags and their parsed results.
289071378461SGreg Roach     *
289171378461SGreg Roach     * @param string $text
289271378461SGreg Roach     *
289324f2a3afSGreg Roach     * @return array<string>
289471378461SGreg Roach     */
289571378461SGreg Roach    private function getTags(string $text): array
289671378461SGreg Roach    {
289771378461SGreg Roach        $tags    = [];
289871378461SGreg Roach        $matches = [];
289971378461SGreg Roach
2900b25599e6SGreg Roach        preg_match_all('/#([^#\n]+)(?=#)/', $text, $matches, PREG_SET_ORDER);
290171378461SGreg Roach
290271378461SGreg Roach        foreach ($matches as $match) {
290371378461SGreg Roach            $params = explode(':', $match[1]);
290471378461SGreg Roach            $method = array_shift($params);
290571378461SGreg Roach
290671378461SGreg Roach            if (method_exists($this, $method)) {
2907e29653ffSGreg Roach                $tags[$match[0] . '#'] = call_user_func([$this, $method], ...$params);
290871378461SGreg Roach            }
290971378461SGreg Roach        }
291071378461SGreg Roach
291171378461SGreg Roach        return $tags;
291271378461SGreg Roach    }
29139219296aSGreg Roach}
2914