public PatentLinks(PatentNumber number)
        {
            if (number == null)
            {
                throw new ArgumentNullException(nameof(number));
            }

            Espacenet     = string.Concat("https://worldwide.espacenet.com/patent/search/publication/", number.Format());
            FullText      = string.Format(ToolsContext.Current.Settings.PatentPDFServer, number.Format());
            GooglePatents = string.Concat("https://patents.google.com/?q=", number.Format());
        }
        /// <summary>
        ///     Parses the input to a patent number.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <returns>The patent number.</returns>
        public static PatentNumber Parse(string input)
        {
            if (string.IsNullOrEmpty(input))
            {
                throw new ArgumentNullException(nameof(input));
            }

            // first clean
            input = input.ToUpper().Trim();

            // remove non alphanumeric characters
            var regex = new Regex("[^a-zA-Z0-9]");

            input = regex.Replace(input, string.Empty);

            // validation
            if (input.Length <= 3)
            {
                throw new ArgumentException("number is too short");
            }

            var result = new PatentNumber();
            var size   = input.Length;

            // country code
            result.C = input.Substring(0, 2);

            // kind code
            result.K = char.IsLetter(input[size - 2])
                ? string.Concat(input[size - 2], input[size - 1])
                : string.Concat(input[size - 1]);

            // document number
            result.N = input.Substring(result.C.Length, size - result.C.Length - result.K.Length);

            return(result);
        }