Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenquotes.git
M src/main/java/com/whitemagicsoftware/keenquotes/Contractions.java
178 178
    "boutchu",
179 179
    "cept",
180
    "dillo",
181
    "em",
182
    "fraid",
183
    "gainst",
184
    "im",
185
    "n",
186
    "neath",
187
    "nother",
188
    "nuff",
189
    "onna",
190
    "onna'",
191
    "pon",
192
    "s",
193
    "sblood",
194
    "scuse",
195
    "sfar",
196
    "sfoot",
197
    "t",
198
    "taint",
199
    "tain",
200
    "til",
201
    "tis",
202
    "tisn",
203
    "tshall",
204
    "twas",
205
    "twasn",
206
    "tween",
207
    "twere",
208
    "tweren",
209
    "twixt",
210
    "twon",
211
    "twou",
212
    "twould",
213
    "twouldn",
214
    "ve"
215
  );
216
217
  /**
218
   * Words having a straight apostrophe that may be either part of a
219
   * contraction or a word that stands alone beside an opening single quote.
220
   */
221
  private static final Set<String> BEGAN_AMBIGUOUS = Set.of(
222
    // about|boxing match
223
    "bout",
224
    // because|causal
225
    "cause",
226
    // what you|choo choo train
227
    "choo",
228
    // he|e pluribus unum
229
    "e",
230
    // here|earlier
231
    "ere",
232
    // afro|to and fro
233
    "fro",
234
    // whore|ho ho!
235
    "ho",
236
    // okay|letter K
237
    "kay",
238
    // lo|lo and behold
239
    "lo",
240
    // are|regarding
241
    "re",
242
    // what's up|to sup
243
    "sup",
244
    // it will|twill fabric
245
    "twill",
246
    // them|utterance
247
    "um",
248
    // is that|Iranian village
249
    "zat"
250
  );
251
252
  private static final Set<String> ENDED_AMBIGUOUS = Set.of(
253
    // give|martial arts garment
254
    "gi",
255
    // in|I
256
    "i",
257
    // of|letter o
258
    "o"
259
  );
260
261
  private static final Set<String> ENDED_UNAMBIGUOUS = Set.of(
262
    // and
263
    "an",
264
    // for/before
265
    "fo",
266
    // friend
267
    "frien",
268
    // just
269
    "jus",
270
    // lord
271
    "lor",
272
    // myself
273
    "masel",
274
    // old
275
    "ol",
276
    // San (Francisco)
277
    "Sa",
278
    // shift
279
    "shif",
280
    // the
281
    "th",
282
    // what
283
    "wha",
284
    // world
285
    "worl",
286
    // Top ~500 common -ing words as English contractions.
287
    "acceptin",
288
    "accompanyin",
289
    "accordin",
290
    "accountin",
291
    "achievin",
292
    "acquirin",
293
    "actin",
294
    "addin",
295
    "addressin",
296
    "adjoinin",
297
    "adoptin",
298
    "advancin",
299
    "advertisin",
300
    "affectin",
301
    "agin",
302
    "allowin",
303
    "amazin",
304
    "analyzin",
305
    "answerin",
306
    "anythin",
307
    "appearin",
308
    "applyin",
309
    "approachin",
310
    "arguin",
311
    "arisin",
312
    "arrivin",
313
    "askin",
314
    "assessin",
315
    "assumin",
316
    "attackin",
317
    "attemptin",
318
    "attendin",
319
    "avoidin",
320
    "bankin",
321
    "bargainin",
322
    "bearin",
323
    "beatin",
324
    "becomin",
325
    "beginnin",
326
    "bein",
327
    "believin",
328
    "belongin",
329
    "bendin",
330
    "bindin",
331
    "bleedin",
332
    "blessin",
333
    "blowin",
334
    "boilin",
335
    "borrowin",
336
    "breakin",
337
    "breathin",
338
    "breedin",
339
    "bringin",
340
    "broadcastin",
341
    "buildin",
342
    "burnin",
343
    "buyin",
344
    "calculatin",
345
    "callin",
346
    "carryin",
347
    "castin",
348
    "causin",
349
    "ceilin",
350
    "challengin",
351
    "changin",
352
    "checkin",
353
    "choosin",
354
    "claimin",
355
    "cleanin",
356
    "clearin",
357
    "climbin",
358
    "closin",
359
    "clothin",
360
    "collectin",
361
    "combinin",
362
    "comin",
363
    "commandin",
364
    "comparin",
365
    "compellin",
366
    "competin",
367
    "computin",
368
    "concernin",
369
    "concludin",
370
    "conditionin",
371
    "conductin",
372
    "conflictin",
373
    "connectin",
374
    "considerin",
375
    "consistin",
376
    "constructin",
377
    "consultin",
378
    "consumin",
379
    "containin",
380
    "continuin",
381
    "contractin",
382
    "contributin",
383
    "controllin",
384
    "convincin",
385
    "cookin",
386
    "coolin",
387
    "copin",
388
    "correspondin",
389
    "counselin",
390
    "countin",
391
    "couplin",
392
    "coverin",
393
    "creatin",
394
    "crossin",
395
    "cryin",
396
    "cuttin",
397
    "dancin",
398
    "darlin",
399
    "datin",
400
    "dealin",
401
    "decidin",
402
    "declarin",
403
    "declinin",
404
    "decreasin",
405
    "definin",
406
    "demandin",
407
    "denyin",
408
    "dependin",
409
    "descendin",
410
    "describin",
411
    "designin",
412
    "destroyin",
413
    "determinin",
414
    "developin",
415
    "differin",
416
    "dinin",
417
    "directin",
418
    "discussin",
419
    "distinguishin",
420
    "disturbin",
421
    "dividin",
422
    "doin",
423
    "drawin",
424
    "dressin",
425
    "drinkin",
426
    "drivin",
427
    "droppin",
428
    "dryin",
429
    "durin",
430
    "dwellin",
431
    "dyin",
432
    "eatin",
433
    "editin",
434
    "emergin",
435
    "employin",
436
    "enablin",
437
    "encouragin",
438
    "endin",
439
    "engagin",
440
    "engineerin",
441
    "enjoyin",
442
    "enterin",
443
    "establishin",
444
    "evaluatin",
445
    "evenin",
446
    "everythin",
447
    "examinin",
448
    "exceedin",
449
    "excitin",
450
    "excludin",
451
    "existin",
452
    "expandin",
453
    "expectin",
454
    "experiencin",
455
    "explainin",
456
    "explorin",
457
    "expressin",
458
    "extendin",
459
    "facin",
460
    "failin",
461
    "fallin",
462
    "farmin",
463
    "fascinatin",
464
    "feedin",
465
    "feelin",
466
    "fightin",
467
    "filin",
468
    "fillin",
469
    "financin",
470
    "findin",
471
    "firin",
472
    "fishin",
473
    "fittin",
474
    "fixin",
475
    "floatin",
476
    "flowin",
477
    "flyin",
478
    "focusin",
479
    "followin",
480
    "forcin",
481
    "foregoin",
482
    "formin",
483
    "forthcomin",
484
    "foundin",
485
    "freezin",
486
    "fuckin",
487
    "functionin",
488
    "fundin",
489
    "gainin",
490
    "gatherin",
491
    "generatin",
492
    "gettin",
493
    "givin",
494
    "goin",
495
    "governin",
496
    "grantin",
497
    "growin",
498
    "hackin",
499
    "handlin",
500
    "hangin",
501
    "happenin",
502
    "havin",
503
    "headin",
504
    "healin",
505
    "hearin",
506
    "heatin",
507
    "helpin",
508
    "hidin",
509
    "holdin",
510
    "hopin",
511
    "housin",
512
    "huntin",
513
    "identifyin",
514
    "imagin",
515
    "implementin",
516
    "imposin",
517
    "improvin",
518
    "includin",
519
    "increasin",
520
    "indicatin",
521
    "interestin",
522
    "interpretin",
523
    "introducin",
524
    "involvin",
525
    "joinin",
526
    "judgin",
527
    "keepin",
528
    "killin",
529
    "knowin",
530
    "lackin",
531
    "landin",
532
    "lastin",
533
    "laughin",
534
    "layin",
535
    "leadin",
536
    "leanin",
537
    "learnin",
538
    "leavin",
539
    "lettin",
540
    "liftin",
541
    "lightin",
542
    "lightnin",
543
    "limitin",
544
    "listenin",
545
    "listin",
546
    "livin",
547
    "loadin",
548
    "lookin",
549
    "losin",
550
    "lovin",
551
    "lowerin",
552
    "lyin",
553
    "maintainin",
554
    "makin",
555
    "managin",
556
    "manufacturin",
557
    "mappin",
558
    "marketin",
559
    "markin",
560
    "matchin",
561
    "meanin",
562
    "measurin",
563
    "meetin",
564
    "meltin",
565
    "minin",
566
    "misleadin",
567
    "missin",
568
    "mixin",
569
    "modelin",
570
    "monitorin",
571
    "mornin",
572
    "movin",
573
    "neighborin",
574
    "neighbourin",
575
    "nothin",
576
    "notin",
577
    "notwithstandin",
578
    "nursin",
579
    "observin",
580
    "obtainin",
581
    "occurrin",
582
    "offerin",
583
    "offsprin",
584
    "ongoin",
585
    "openin",
586
    "operatin",
587
    "opposin",
588
    "orderin",
589
    "organizin",
590
    "outstandin",
591
    "overwhelmin",
592
    "packin",
593
    "paintin",
594
    "parkin",
595
    "participatin",
596
    "passin",
597
    "payin",
598
    "pendin",
599
    "performin",
600
    "pickin",
601
    "pissin",
602
    "placin",
603
    "plannin",
604
    "plantin",
605
    "playin",
606
    "pleasin",
607
    "pointin",
608
    "poppin",
609
    "possessin",
610
    "preachin",
611
    "precedin",
612
    "preparin",
613
    "presentin",
614
    "preservin",
615
    "pressin",
616
    "prevailin",
617
    "preventin",
618
    "pricin",
619
    "printin",
620
    "proceedin",
621
    "processin",
622
    "producin",
623
    "programmin",
624
    "promisin",
625
    "promotin",
626
    "protectin",
627
    "providin",
628
    "provin",
629
    "publishin",
630
    "pullin",
631
    "purchasin",
632
    "pursuin",
633
    "pushin",
634
    "puttin",
635
    "questionin",
636
    "rangin",
637
    "ratin",
638
    "reachin",
639
    "readin",
640
    "reasonin",
641
    "receivin",
642
    "recognizin",
643
    "recordin",
644
    "reducin",
645
    "referrin",
646
    "reflectin",
647
    "refusin",
648
    "regardin",
649
    "regulatin",
650
    "relatin",
651
    "remainin",
652
    "rememberin",
653
    "removin",
654
    "renderin",
655
    "repeatin",
656
    "replacin",
657
    "reportin",
658
    "representin",
659
    "requirin",
660
    "respectin",
661
    "respondin",
662
    "restin",
663
    "resultin",
664
    "returnin",
665
    "revealin",
666
    "ridin",
667
    "risin",
668
    "rulin",
669
    "runnin",
670
    "rythin",
671
    "sailin",
672
    "samplin",
673
    "satisfyin",
674
    "savin",
675
    "sayin",
676
    "scatterin",
677
    "schoolin",
678
    "screenin",
679
    "searchin",
680
    "securin",
681
    "seein",
682
    "seekin",
683
    "selectin",
684
    "sellin",
685
    "sendin",
686
    "separatin",
687
    "servin",
688
    "settin",
689
    "settlin",
690
    "sewin",
691
    "shakin",
692
    "shapin",
693
    "sharin",
694
    "shiftin",
695
    "shinin",
696
    "shippin",
697
    "shittin",
698
    "shootin",
699
    "shoppin",
700
    "showin",
701
    "singin",
702
    "sinkin",
703
    "sittin",
704
    "sleepin",
705
    "smilin",
706
    "smokin",
707
    "spankin",
708
    "solvin",
709
    "somethin",
710
    "speakin",
711
    "spellin",
712
    "spendin",
713
    "spinnin",
714
    "spittin",
715
    "spreadin",
716
    "standin",
717
    "starin",
718
    "startin",
719
    "statin",
720
    "stayin",
721
    "stealin",
722
    "sterlin",
723
    "stimulatin",
724
    "stirrin",
725
    "stoppin",
726
    "strengthenin",
727
    "stretchin",
728
    "strikin",
729
    "strugglin",
730
    "studyin",
731
    "succeedin",
732
    "sufferin",
733
    "suggestin",
734
    "supplyin",
735
    "supportin",
736
    "surprisin",
737
    "surroundin",
738
    "survivin",
739
    "sweepin",
740
    "swellin",
741
    "swimmin",
742
    "switchin",
743
    "takin",
744
    "talkin",
745
    "teachin",
746
    "tellin",
747
    "testin",
748
    "thinkin",
749
    "threatenin",
750
    "throwin",
751
    "timin",
752
    "touchin",
753
    "tradin",
754
    "trainin",
755
    "travelin",
756
    "treatin",
757
    "tremblin",
758
    "tryin",
759
    "turnin",
760
    "underlyin",
761
    "understandin",
762
    "undertakin",
763
    "unwillin",
764
    "usin",
765
    "varyin",
766
    "viewin",
767
    "visitin",
768
    "votin",
769
    "waitin",
770
    "walkin",
771
    "wanderin",
772
    "wantin",
773
    "warnin",
774
    "washin",
775
    "watchin",
776
    "wearin",
777
    "weddin",
778
    "whackin",
779
    "wi",
780
    "willin",
781
    "windin",
782
    "winnin",
783
    "wishin",
784
    "wonderin",
785
    "workin",
786
    "writin",
787
    "yieldin"
180
    "cos",
181
    "dillo",
182
    "em",
183
    "fraid",
184
    "gainst",
185
    "im",
186
    "n",
187
    "neath",
188
    "nother",
189
    "nuff",
190
    "onna",
191
    "onna'",
192
    // horse
193
    "oss",
194
    // horses
195
    "osses",
196
    "pon",
197
    "s",
198
    "sblood",
199
    "scuse",
200
    "sfar",
201
    "sfoot",
202
    "t",
203
    "taint",
204
    "tain",
205
    "til",
206
    "tis",
207
    "tisn",
208
    "tshall",
209
    "twas",
210
    "twasn",
211
    "tween",
212
    "twere",
213
    "tweren",
214
    "twixt",
215
    "twon",
216
    "twou",
217
    "twould",
218
    "twouldn",
219
    "ve"
220
  );
221
222
  /**
223
   * Words having a straight apostrophe that may be either part of a
224
   * contraction or a word that stands alone beside an opening single quote.
225
   */
226
  private static final Set<String> BEGAN_AMBIGUOUS = Set.of(
227
    // have
228
    "a",
229
    // about|boxing match
230
    "bout",
231
    // because|causal
232
    "cause",
233
    // what you|choo choo train
234
    "choo",
235
    // he|e pluribus unum
236
    "e",
237
    // here|earlier
238
    "ere",
239
    // afro|to and fro
240
    "fro",
241
    // whore|ho ho!
242
    "ho",
243
    // okay|letter K
244
    "kay",
245
    // lo|lo and behold
246
    "lo",
247
    // ???
248
    "listed",
249
    // ???
250
    "nation",
251
    // are|regarding
252
    "re",
253
    // what's up|to sup
254
    "sup",
255
    // it will|twill fabric
256
    "twill",
257
    // them|utterance
258
    "um",
259
    // is that|Iranian village
260
    "zat"
261
  );
262
263
  private static final Set<String> ENDED_AMBIGUOUS = Set.of(
264
    // give|martial arts garment
265
    "gi",
266
    // in|I
267
    "i",
268
    // of|letter o
269
    "o"
270
  );
271
272
  private static final Set<String> ENDED_UNAMBIGUOUS = Set.of(
273
    // and
274
    "an",
275
    // for/before
276
    "fo",
277
    // friend
278
    "frien",
279
    // just
280
    "jus",
281
    // lord
282
    "lor",
283
    // myself
284
    "masel",
285
    // old
286
    "ol",
287
    // San (Francisco)
288
    "Sa",
289
    // shift
290
    "shif",
291
    // the
292
    "th",
293
    // what
294
    "wha",
295
    // with
296
    "wi",
297
    // world
298
    "worl",
299
    // Top ~3500 common -ing words as English contractions.
300
    "abandonin",
301
    "abettin",
302
    "abidin",
303
    "abolishin",
304
    "aboundin",
305
    "absorbin",
306
    "abstainin",
307
    "abstractin",
308
    "abusin",
309
    "abuttin",
310
    "acceleratin",
311
    "acceptin",
312
    "accessin",
313
    "accommodatin",
314
    "accompanyin",
315
    "accomplishin",
316
    "accordin",
317
    "accountin",
318
    "accruin",
319
    "accumulatin",
320
    "accusin",
321
    "achievin",
322
    "achin",
323
    "acknowledgin",
324
    "acquaintin",
325
    "acquirin",
326
    "actin",
327
    "activatin",
328
    "adaptin",
329
    "addin",
330
    "addressin",
331
    "adherin",
332
    "adjoinin",
333
    "adjustin",
334
    "administerin",
335
    "admirin",
336
    "admittin",
337
    "admonishin",
338
    "adoptin",
339
    "adorin",
340
    "adornin",
341
    "advancin",
342
    "advertisin",
343
    "advisin",
344
    "advocatin",
345
    "affectin",
346
    "affirmin",
347
    "afflictin",
348
    "affordin",
349
    "agein",
350
    "aggravatin",
351
    "aggregatin",
352
    "agin",
353
    "agitatin",
354
    "agonizin",
355
    "agreein",
356
    "ailin",
357
    "aimin",
358
    "airin",
359
    "alarmin",
360
    "alertin",
361
    "alienatin",
362
    "alightin",
363
    "alignin",
364
    "allegin",
365
    "alleviatin",
366
    "allocatin",
367
    "allowin",
368
    "alludin",
369
    "allurin",
370
    "alterin",
371
    "alternatin",
372
    "amassin",
373
    "amazin",
374
    "amendin",
375
    "amountin",
376
    "amplifyin",
377
    "amusin",
378
    "analysin",
379
    "analyzin",
380
    "anchorin",
381
    "anglin",
382
    "animatin",
383
    "annealin",
384
    "annihilatin",
385
    "announcin",
386
    "annoyin",
387
    "anointin",
388
    "answerin",
389
    "anticipatin",
390
    "anythin",
391
    "apologizin",
392
    "appallin",
393
    "appealin",
394
    "appearin",
395
    "appertainin",
396
    "appetizin",
397
    "applaudin",
398
    "applyin",
399
    "appointin",
400
    "appraisin",
401
    "appreciatin",
402
    "apprehendin",
403
    "approachin",
404
    "appropriatin",
405
    "approvin",
406
    "approximatin",
407
    "archin",
408
    "archivin",
409
    "arguin",
410
    "arisin",
411
    "arousin",
412
    "arrangin",
413
    "arrestin",
414
    "arrivin",
415
    "articulatin",
416
    "ascendin",
417
    "ascertainin",
418
    "ascribin",
419
    "askin",
420
    "assailin",
421
    "assaultin",
422
    "assemblin",
423
    "assertin",
424
    "assessin",
425
    "assignin",
426
    "assimilatin",
427
    "assistin",
428
    "associatin",
429
    "assumin",
430
    "assurin",
431
    "astonishin",
432
    "astoundin",
433
    "atonin",
434
    "attachin",
435
    "attackin",
436
    "attainin",
437
    "attemptin",
438
    "attendin",
439
    "attestin",
440
    "attractin",
441
    "attributin",
442
    "auditin",
443
    "augmentin",
444
    "authorin",
445
    "authorisin",
446
    "authorizin",
447
    "availin",
448
    "avengin",
449
    "averagin",
450
    "avertin",
451
    "avoidin",
452
    "awaitin",
453
    "awakenin",
454
    "awakin",
455
    "awardin",
456
    "awnin",
457
    "babblin",
458
    "babysittin",
459
    "backin",
460
    "backslidin",
461
    "backtrackin",
462
    "bafflin",
463
    "baggin",
464
    "bailin",
465
    "baitin",
466
    "bakin",
467
    "balancin",
468
    "baldin",
469
    "balloonin",
470
    "ballotin",
471
    "bandagin",
472
    "bandin",
473
    "bangin",
474
    "banishin",
475
    "bankin",
476
    "bannin",
477
    "banquetin",
478
    "banterin",
479
    "baptizin",
480
    "bargainin",
481
    "barin",
482
    "barkin",
483
    "barrin",
484
    "barterin",
485
    "bashin",
486
    "baskin",
487
    "bastin",
488
    "bathin",
489
    "batterin",
490
    "battin",
491
    "battlin",
492
    "bawlin",
493
    "bayin",
494
    "beadin",
495
    "beamin",
496
    "bearin",
497
    "beatin",
498
    "beautifyin",
499
    "beckonin",
500
    "becomin",
501
    "beddin",
502
    "beepin",
503
    "befittin",
504
    "befriendin",
505
    "begettin",
506
    "beggin",
507
    "beginnin",
508
    "beguilin",
509
    "behavin",
510
    "beheadin",
511
    "beholdin",
512
    "behrin",
513
    "beijin",
514
    "bein",
515
    "belchin",
516
    "believin",
517
    "belittlin",
518
    "bellowin",
519
    "belongin",
520
    "beltin",
521
    "bemoanin",
522
    "benchmarkin",
523
    "bendin",
524
    "benefitin",
525
    "bennin",
526
    "beratin",
527
    "berin",
528
    "beseechin",
529
    "besettin",
530
    "besiegin",
531
    "bestowin",
532
    "bestsellin",
533
    "betrayin",
534
    "betterin",
535
    "bettin",
536
    "bewailin",
537
    "bewilderin",
538
    "bewitchin",
539
    "biasin",
540
    "bickerin",
541
    "bicyclin",
542
    "biddin",
543
    "bidin",
544
    "bikin",
545
    "billin",
546
    "billowin",
547
    "bindin",
548
    "birthin",
549
    "bisectin",
550
    "bitin",
551
    "blackenin",
552
    "blackin",
553
    "blackmailin",
554
    "blamin",
555
    "blanchin",
556
    "blarin",
557
    "blasphemin",
558
    "blastin",
559
    "blazin",
560
    "bleachin",
561
    "bleatin",
562
    "bleedin",
563
    "blendin",
564
    "blessin",
565
    "blightin",
566
    "blindin",
567
    "blinkin",
568
    "blisterin",
569
    "bloatin",
570
    "blockadin",
571
    "blockin",
572
    "bloggin",
573
    "bloodlettin",
574
    "bloomin",
575
    "blossomin",
576
    "blottin",
577
    "blowin",
578
    "bluffin",
579
    "blunderin",
580
    "blurrin",
581
    "blushin",
582
    "blusterin",
583
    "boardin",
584
    "boastin",
585
    "boatin",
586
    "bodybuildin",
587
    "boein",
588
    "bogglin",
589
    "boilin",
590
    "bolsterin",
591
    "boltin",
592
    "bombardin",
593
    "bombin",
594
    "bondin",
595
    "bookin",
596
    "bookkeepin",
597
    "boomin",
598
    "boostin",
599
    "bootin",
600
    "bootstrappin",
601
    "borderin",
602
    "borin",
603
    "borrowin",
604
    "botherin",
605
    "bottlin",
606
    "bouncin",
607
    "boundin",
608
    "bowin",
609
    "bowlin",
610
    "bowrin",
611
    "bowstrin",
612
    "boxin",
613
    "boycottin",
614
    "bracin",
615
    "bracketin",
616
    "braggin",
617
    "braidin",
618
    "brainstormin",
619
    "brainwashin",
620
    "brakin",
621
    "branchin",
622
    "brandin",
623
    "brandishin",
624
    "bravin",
625
    "brawlin",
626
    "brayin",
627
    "breachin",
628
    "breakfastin",
629
    "breakin",
630
    "breastfeedin",
631
    "breathin",
632
    "breathtakin",
633
    "breedin",
634
    "brewin",
635
    "bribin",
636
    "bridgin",
637
    "briefin",
638
    "brightenin",
639
    "brimmin",
640
    "bringin",
641
    "bristlin",
642
    "britlin",
643
    "broadcastin",
644
    "broadenin",
645
    "broilin",
646
    "brokerin",
647
    "broodin",
648
    "brownin",
649
    "browsin",
650
    "bruisin",
651
    "brushin",
652
    "bubblin",
653
    "buckin",
654
    "bucklin",
655
    "buddin",
656
    "budgetin",
657
    "bufferin",
658
    "buffetin",
659
    "buggin",
660
    "buildin",
661
    "bulgin",
662
    "bullyin",
663
    "bumblin",
664
    "bumpin",
665
    "bundlin",
666
    "bunglin",
667
    "buntin",
668
    "burdenin",
669
    "burgeonin",
670
    "burnin",
671
    "burrowin",
672
    "burstin",
673
    "buryin",
674
    "busin",
675
    "bustin",
676
    "bustlin",
677
    "busyin",
678
    "butcherin",
679
    "buttin",
680
    "buttonin",
681
    "buyin",
682
    "buzzin",
683
    "bypassin",
684
    "cachin",
685
    "calculatin",
686
    "callin",
687
    "calmin",
688
    "campaignin",
689
    "campin",
690
    "cancelin",
691
    "cannin",
692
    "canvassin",
693
    "cappin",
694
    "captivatin",
695
    "capturin",
696
    "caregivin",
697
    "caressin",
698
    "carpetin",
699
    "carryin",
700
    "carvin",
701
    "cascadin",
702
    "casin",
703
    "castin",
704
    "catalogin",
705
    "cataloguin",
706
    "catchin",
707
    "categorizin",
708
    "caterin",
709
    "causin",
710
    "ceasin",
711
    "ceilin",
712
    "celebratin",
713
    "cementin",
714
    "centerin",
715
    "certifyin",
716
    "chafin",
717
    "challengin",
718
    "championin",
719
    "changin",
720
    "channelin",
721
    "channin",
722
    "chantin",
723
    "characterizin",
724
    "chargin",
725
    "chartin",
726
    "chasin",
727
    "chatterin",
728
    "chattin",
729
    "cheatin",
730
    "checkin",
731
    "cheerin",
732
    "cherishin",
733
    "chewin",
734
    "childbearin",
735
    "chillin",
736
    "chippin",
737
    "chirpin",
738
    "chokin",
739
    "choosin",
740
    "choppin",
741
    "christenin",
742
    "chucklin",
743
    "churnin",
744
    "circlin",
745
    "circulatin",
746
    "citin",
747
    "civilizin",
748
    "claddin",
749
    "claimin",
750
    "clamberin",
751
    "clamorin",
752
    "clampin",
753
    "clangin",
754
    "clankin",
755
    "clappin",
756
    "clarifyin",
757
    "clashin",
758
    "claspin",
759
    "classifyin",
760
    "clatterin",
761
    "claverin",
762
    "clawin",
763
    "cleanin",
764
    "cleansin",
765
    "clearin",
766
    "cleavin",
767
    "clenchin",
768
    "clickin",
769
    "climbin",
770
    "clin",
771
    "clingin",
772
    "clippin",
773
    "cloggin",
774
    "clonin",
775
    "closin",
776
    "clothin",
777
    "clottin",
778
    "clusterin",
779
    "clutchin",
780
    "coachin",
781
    "coastin",
782
    "coatin",
783
    "coaxin",
784
    "codin",
785
    "coexistin",
786
    "coilin",
787
    "coincidin",
788
    "coinin",
789
    "collaboratin",
790
    "collapsin",
791
    "collectin",
792
    "collidin",
793
    "colonisin",
794
    "colonizin",
795
    "colorin",
796
    "colourin",
797
    "combatin",
798
    "combin",
799
    "combinin",
800
    "comfortin",
801
    "comin",
802
    "commandin",
803
    "commemoratin",
804
    "commencin",
805
    "commendin",
806
    "commentin",
807
    "commissionin",
808
    "committin",
809
    "communicatin",
810
    "commutin",
811
    "comparin",
812
    "compellin",
813
    "compensatin",
814
    "competin",
815
    "compilin",
816
    "complainin",
817
    "completin",
818
    "complicatin",
819
    "complyin",
820
    "composin",
821
    "compostin",
822
    "compoundin",
823
    "comprehendin",
824
    "compressin",
825
    "comprisin",
826
    "compromisin",
827
    "computin",
828
    "concealin",
829
    "concedin",
830
    "conceivin",
831
    "concentratin",
832
    "conceptualizin",
833
    "concernin",
834
    "concludin",
835
    "concurrin",
836
    "condemnin",
837
    "condensin",
838
    "condescendin",
839
    "conditionin",
840
    "conductin",
841
    "conferencin",
842
    "conferrin",
843
    "confessin",
844
    "confidin",
845
    "configurin",
846
    "confinin",
847
    "confirmin",
848
    "conflictin",
849
    "conformin",
850
    "confoundin",
851
    "confrontin",
852
    "confusin",
853
    "congratulatin",
854
    "conjurin",
855
    "connectin",
856
    "connin",
857
    "conquerin",
858
    "consentin",
859
    "conservin",
860
    "considerin",
861
    "consistin",
862
    "consolidatin",
863
    "consolin",
864
    "conspirin",
865
    "constitutin",
866
    "constrainin",
867
    "constructin",
868
    "construin",
869
    "consultin",
870
    "consumin",
871
    "contactin",
872
    "containin",
873
    "contaminatin",
874
    "contemplatin",
875
    "contendin",
876
    "contestin",
877
    "continuin",
878
    "contractin",
879
    "contradictin",
880
    "contrastin",
881
    "contributin",
882
    "contrivin",
883
    "controllin",
884
    "convenin",
885
    "convergin",
886
    "conversin",
887
    "convertin",
888
    "conveyin",
889
    "convincin",
890
    "cooin",
891
    "cookin",
892
    "coolin",
893
    "cooperatin",
894
    "coordinatin",
895
    "copin",
896
    "copyin",
897
    "correctin",
898
    "correlatin",
899
    "correspondin",
900
    "corruptin",
901
    "costin",
902
    "coughin",
903
    "counselin",
904
    "counsellin",
905
    "counteractin",
906
    "counterfeitin",
907
    "counterin",
908
    "countervailin",
909
    "countin",
910
    "couplin",
911
    "coursin",
912
    "courtin",
913
    "coverin",
914
    "cowerin",
915
    "crackin",
916
    "cracklin",
917
    "cradlin",
918
    "craftin",
919
    "crampin",
920
    "crashin",
921
    "cravin",
922
    "crawlin",
923
    "creakin",
924
    "creatin",
925
    "creditin",
926
    "creepin",
927
    "cringin",
928
    "cripplin",
929
    "criticizin",
930
    "critiquin",
931
    "croakin",
932
    "croppin",
933
    "crossin",
934
    "crouchin",
935
    "crowdin",
936
    "crowin",
937
    "crownin",
938
    "cruisin",
939
    "crumblin",
940
    "crunchin",
941
    "crusadin",
942
    "crushin",
943
    "cryin",
944
    "culminatin",
945
    "cultivatin",
946
    "cummin",
947
    "cunnin",
948
    "cuppin",
949
    "curbin",
950
    "curin",
951
    "curlin",
952
    "cursin",
953
    "curtailin",
954
    "curvin",
955
    "cushin",
956
    "customizin",
957
    "cuttin",
958
    "cyclin",
959
    "dabbin",
960
    "dabblin",
961
    "damagin",
962
    "damnin",
963
    "dampenin",
964
    "dampin",
965
    "dancin",
966
    "danglin",
967
    "darjeelin",
968
    "darkenin",
969
    "darklin",
970
    "darlin",
971
    "darnin",
972
    "dartin",
973
    "dashin",
974
    "datin",
975
    "dauntin",
976
    "dawdlin",
977
    "dawnin",
978
    "daydreamin",
979
    "dazzlin",
980
    "deadenin",
981
    "deafenin",
982
    "dealin",
983
    "debasin",
984
    "debatin",
985
    "debilitatin",
986
    "debriefin",
987
    "debuggin",
988
    "decayin",
989
    "deceivin",
990
    "decidin",
991
    "decipherin",
992
    "decisionmakin",
993
    "deckin",
994
    "declaimin",
995
    "declarin",
996
    "declinin",
997
    "decodin",
998
    "decommissionin",
999
    "decomposin",
1000
    "deconstructin",
1001
    "decoratin",
1002
    "decouplin",
1003
    "decreasin",
1004
    "dedicatin",
1005
    "deducin",
1006
    "deductin",
1007
    "deemin",
1008
    "deepenin",
1009
    "deerin",
1010
    "defaultin",
1011
    "defeatin",
1012
    "defendin",
1013
    "deferrin",
1014
    "defilin",
1015
    "definin",
1016
    "deflectin",
1017
    "deformin",
1018
    "defraudin",
1019
    "defrayin",
1020
    "defyin",
1021
    "degeneratin",
1022
    "degradin",
1023
    "dehumanizin",
1024
    "delayin",
1025
    "delegatin",
1026
    "deletin",
1027
    "deliberatin",
1028
    "delightin",
1029
    "delineatin",
1030
    "deliverin",
1031
    "deludin",
1032
    "delvin",
1033
    "demandin",
1034
    "demeanin",
1035
    "demin",
1036
    "democratizin",
1037
    "demolishin",
1038
    "demonstratin",
1039
    "demoralizin",
1040
    "denigratin",
1041
    "dennin",
1042
    "denotin",
1043
    "denouncin",
1044
    "denyin",
1045
    "departin",
1046
    "dependin",
1047
    "depictin",
1048
    "depletin",
1049
    "deplorin",
1050
    "deployin",
1051
    "depositin",
1052
    "deprecatin",
1053
    "depreciatin",
1054
    "depressin",
1055
    "deprivin",
1056
    "derivin",
1057
    "descendin",
1058
    "describin",
1059
    "desertin",
1060
    "deservin",
1061
    "designatin",
1062
    "designin",
1063
    "desirin",
1064
    "desolatin",
1065
    "despairin",
1066
    "despatchin",
1067
    "despisin",
1068
    "despondin",
1069
    "destabilizin",
1070
    "destroyin",
1071
    "detachin",
1072
    "detailin",
1073
    "detainin",
1074
    "detectin",
1075
    "deterioratin",
1076
    "determinin",
1077
    "deterrin",
1078
    "devastatin",
1079
    "developin",
1080
    "deviatin",
1081
    "devisin",
1082
    "devolvin",
1083
    "devotin",
1084
    "devourin",
1085
    "diagnosin",
1086
    "dialin",
1087
    "dictatin",
1088
    "dietin",
1089
    "differentiatin",
1090
    "differin",
1091
    "diffusin",
1092
    "digestin",
1093
    "diggin",
1094
    "digitizin",
1095
    "dilatin",
1096
    "dilutin",
1097
    "diminishin",
1098
    "dimmin",
1099
    "dinin",
1100
    "dippin",
1101
    "directin",
1102
    "disablin",
1103
    "disagreein",
1104
    "disappearin",
1105
    "disappointin",
1106
    "disapprovin",
1107
    "disarmin",
1108
    "disbandin",
1109
    "disbelievin",
1110
    "discardin",
1111
    "discernin",
1112
    "dischargin",
1113
    "disciplinin",
1114
    "disclosin",
1115
    "disconcertin",
1116
    "disconnectin",
1117
    "discontinuin",
1118
    "discountin",
1119
    "discouragin",
1120
    "discoursin",
1121
    "discoverin",
1122
    "discreditin",
1123
    "discriminatin",
1124
    "discussin",
1125
    "disdainin",
1126
    "disembarkin",
1127
    "disengagin",
1128
    "disfigurin",
1129
    "disguisin",
1130
    "disgustin",
1131
    "disheartenin",
1132
    "disinfectin",
1133
    "disintegratin",
1134
    "dislikin",
1135
    "dislodgin",
1136
    "dismantlin",
1137
    "dismissin",
1138
    "dismountin",
1139
    "disobeyin",
1140
    "disorientin",
1141
    "disparagin",
1142
    "dispatchin",
1143
    "dispellin",
1144
    "dispensin",
1145
    "dispersin",
1146
    "displacin",
1147
    "displayin",
1148
    "displeasin",
1149
    "disposin",
1150
    "disputin",
1151
    "disqualifyin",
1152
    "disquietin",
1153
    "disregardin",
1154
    "disruptin",
1155
    "dissectin",
1156
    "dissemblin",
1157
    "disseminatin",
1158
    "dissentin",
1159
    "dissipatin",
1160
    "dissolvin",
1161
    "distancin",
1162
    "distillin",
1163
    "distinguishin",
1164
    "distortin",
1165
    "distractin",
1166
    "distressin",
1167
    "distributin",
1168
    "disturbin",
1169
    "divergin",
1170
    "diversifyin",
1171
    "divertin",
1172
    "divestin",
1173
    "dividin",
1174
    "divin",
1175
    "divinin",
1176
    "divorcin",
1177
    "dizzyin",
1178
    "dockin",
1179
    "doctorin",
1180
    "documentin",
1181
    "dodgin",
1182
    "doddlin",
1183
    "doin",
1184
    "dominatin",
1185
    "domineerin",
1186
    "donatin",
1187
    "donnin",
1188
    "doodlin",
1189
    "dopin",
1190
    "dorkin",
1191
    "dosin",
1192
    "dotin",
1193
    "dottin",
1194
    "doublin",
1195
    "doubtin",
1196
    "dowlin",
1197
    "downin",
1198
    "downloadin",
1199
    "downplayin",
1200
    "downsizin",
1201
    "dozin",
1202
    "draftin",
1203
    "draggin",
1204
    "drainin",
1205
    "dramatisin",
1206
    "dramatizin",
1207
    "drapin",
1208
    "drawin",
1209
    "drawlin",
1210
    "dreadin",
1211
    "dreamin",
1212
    "dredgin",
1213
    "drenchin",
1214
    "dressin",
1215
    "dressmakin",
1216
    "dribblin",
1217
    "driftin",
1218
    "drillin",
1219
    "drinkin",
1220
    "drippin",
1221
    "drivin",
1222
    "drizzlin",
1223
    "dronin",
1224
    "droolin",
1225
    "droopin",
1226
    "droppin",
1227
    "drownin",
1228
    "drummin",
1229
    "dryin",
1230
    "duckin",
1231
    "duelin",
1232
    "duellin",
1233
    "dumpin",
1234
    "dunnin",
1235
    "duplicatin",
1236
    "durin",
1237
    "dwellin",
1238
    "dwindlin",
1239
    "dyein",
1240
    "dyin",
1241
    "ealin",
1242
    "earnin",
1243
    "earrin",
1244
    "earthin",
1245
    "easin",
1246
    "easygoin",
1247
    "eatin",
1248
    "eavesdroppin",
1249
    "ebbin",
1250
    "echoin",
1251
    "eclipsin",
1252
    "economizin",
1253
    "eddyin",
1254
    "edgin",
1255
    "edifyin",
1256
    "editin",
1257
    "educatin",
1258
    "effacin",
1259
    "effectin",
1260
    "ejectin",
1261
    "elaboratin",
1262
    "elbowin",
1263
    "electin",
1264
    "electioneerin",
1265
    "electrifyin",
1266
    "elevatin",
1267
    "elicitin",
1268
    "eliminatin",
1269
    "elucidatin",
1270
    "eludin",
1271
    "elutin",
1272
    "emanatin",
1273
    "emancipatin",
1274
    "embalmin",
1275
    "embarkin",
1276
    "embarrassin",
1277
    "embeddin",
1278
    "embellishin",
1279
    "embodyin",
1280
    "embracin",
1281
    "embroiderin",
1282
    "emergin",
1283
    "emigratin",
1284
    "emittin",
1285
    "emphasisin",
1286
    "emphasizin",
1287
    "employin",
1288
    "empowerin",
1289
    "emptyin",
1290
    "emulatin",
1291
    "enablin",
1292
    "enactin",
1293
    "encapsulatin",
1294
    "enchantin",
1295
    "encirclin",
1296
    "enclosin",
1297
    "encodin",
1298
    "encompassin",
1299
    "encounterin",
1300
    "encouragin",
1301
    "encroachin",
1302
    "encryptin",
1303
    "endangerin",
1304
    "endearin",
1305
    "endeavorin",
1306
    "endeavourin",
1307
    "endin",
1308
    "endorsin",
1309
    "endowin",
1310
    "endurin",
1311
    "energizin",
1312
    "enervatin",
1313
    "enfoldin",
1314
    "enforcin",
1315
    "engagin",
1316
    "engenderin",
1317
    "engineerin",
1318
    "engravin",
1319
    "engrossin",
1320
    "engulfin",
1321
    "enhancin",
1322
    "enjoinin",
1323
    "enjoyin",
1324
    "enlargin",
1325
    "enlightenin",
1326
    "enlistin",
1327
    "enlivenin",
1328
    "ennoblin",
1329
    "enquirin",
1330
    "enrichin",
1331
    "enrollin",
1332
    "enslavin",
1333
    "ensuin",
1334
    "ensurin",
1335
    "entailin",
1336
    "entanglin",
1337
    "enterin",
1338
    "enterprisin",
1339
    "entertainin",
1340
    "enthrallin",
1341
    "enticin",
1342
    "entitlin",
1343
    "entrancin",
1344
    "entreatin",
1345
    "entrenchin",
1346
    "entrustin",
1347
    "enumeratin",
1348
    "enunciatin",
1349
    "envelopin",
1350
    "envisionin",
1351
    "envyin",
1352
    "eppin",
1353
    "equalin",
1354
    "equalizin",
1355
    "equallin",
1356
    "equatin",
1357
    "equippin",
1358
    "eradicatin",
1359
    "erasin",
1360
    "erectin",
1361
    "erlin",
1362
    "erodin",
1363
    "errin",
1364
    "eruptin",
1365
    "escalatin",
1366
    "escapin",
1367
    "eschewin",
1368
    "escortin",
1369
    "espin",
1370
    "espousin",
1371
    "establishin",
1372
    "estain",
1373
    "estimatin",
1374
    "etchin",
1375
    "evacuatin",
1376
    "evadin",
1377
    "evaluatin",
1378
    "evangelizin",
1379
    "evaporatin",
1380
    "evenin",
1381
    "everlastin",
1382
    "everythin",
1383
    "evidencin",
1384
    "evincin",
1385
    "evokin",
1386
    "evolvin",
1387
    "ewin",
1388
    "exacerbatin",
1389
    "exactin",
1390
    "exaggeratin",
1391
    "exaltin",
1392
    "examinin",
1393
    "exasperatin",
1394
    "excavatin",
1395
    "exceedin",
1396
    "excellin",
1397
    "exceptin",
1398
    "exchangin",
1399
    "excitin",
1400
    "exclaimin",
1401
    "excludin",
1402
    "excruciatin",
1403
    "excusin",
1404
    "executin",
1405
    "exemplifyin",
1406
    "exemptin",
1407
    "exercisin",
1408
    "exertin",
1409
    "exhalin",
1410
    "exhaustin",
1411
    "exhibitin",
1412
    "exhilaratin",
1413
    "exhortin",
1414
    "existin",
1415
    "exitin",
1416
    "expandin",
1417
    "expectin",
1418
    "expeditin",
1419
    "expellin",
1420
    "expendin",
1421
    "experiencin",
1422
    "experimentin",
1423
    "expirin",
1424
    "explainin",
1425
    "explicatin",
1426
    "explodin",
1427
    "exploitin",
1428
    "explorin",
1429
    "exportin",
1430
    "exposin",
1431
    "expoundin",
1432
    "expressin",
1433
    "extendin",
1434
    "extenuatin",
1435
    "exterminatin",
1436
    "externalizin",
1437
    "extinguishin",
1438
    "extollin",
1439
    "extortin",
1440
    "extractin",
1441
    "extrapolatin",
1442
    "extricatin",
1443
    "exudin",
1444
    "exultin",
1445
    "eyein",
1446
    "eyin",
1447
    "fabricatin",
1448
    "facilitatin",
1449
    "facin",
1450
    "factorin",
1451
    "fadin",
1452
    "failin",
1453
    "faintin",
1454
    "fakin",
1455
    "fallin",
1456
    "falterin",
1457
    "fancyin",
1458
    "fannin",
1459
    "farmin",
1460
    "farthin",
1461
    "fascinatin",
1462
    "fashionin",
1463
    "fastenin",
1464
    "fastin",
1465
    "fatiguin",
1466
    "fattenin",
1467
    "faultin",
1468
    "favorin",
1469
    "favourin",
1470
    "fawnin",
1471
    "fearin",
1472
    "feastin",
1473
    "featurin",
1474
    "feedin",
1475
    "feelin",
1476
    "feignin",
1477
    "fellin",
1478
    "fencin",
1479
    "fermentin",
1480
    "fertilizin",
1481
    "festerin",
1482
    "fetchin",
1483
    "fiddlin",
1484
    "fidgetin",
1485
    "fieldin",
1486
    "fightin",
1487
    "figurin",
1488
    "filin",
1489
    "fillin",
1490
    "filmin",
1491
    "filmmakin",
1492
    "filterin",
1493
    "financin",
1494
    "findin",
1495
    "fingerin",
1496
    "fingerprintin",
1497
    "finishin",
1498
    "firin",
1499
    "fishin",
1500
    "fittin",
1501
    "fixin",
1502
    "flaggin",
1503
    "flailin",
1504
    "flamin",
1505
    "flankin",
1506
    "flappin",
1507
    "flarin",
1508
    "flashin",
1509
    "flattenin",
1510
    "flatterin",
1511
    "flauntin",
1512
    "flavorin",
1513
    "fledglin",
1514
    "fleein",
1515
    "fleetin",
1516
    "flemin",
1517
    "flemmin",
1518
    "flexin",
1519
    "flickerin",
1520
    "flickin",
1521
    "flinchin",
1522
    "flingin",
1523
    "flippin",
1524
    "flirtin",
1525
    "flittin",
1526
    "floatin",
1527
    "flockin",
1528
    "floggin",
1529
    "floodin",
1530
    "floorin",
1531
    "floppin",
1532
    "flounderin",
1533
    "flourishin",
1534
    "flowerin",
1535
    "flowin",
1536
    "fluctuatin",
1537
    "flushin",
1538
    "flutterin",
1539
    "flyin",
1540
    "foamin",
1541
    "focusin",
1542
    "focussin",
1543
    "foldin",
1544
    "followin",
1545
    "fondlin",
1546
    "foolin",
1547
    "footin",
1548
    "foragin",
1549
    "forbearin",
1550
    "forbiddin",
1551
    "forcin",
1552
    "forebodin",
1553
    "forecastin",
1554
    "foregoin",
1555
    "foregroundin",
1556
    "foreseein",
1557
    "foreshadowin",
1558
    "forfeitin",
1559
    "forgettin",
1560
    "forgin",
1561
    "forgivin",
1562
    "formattin",
1563
    "formin",
1564
    "formulatin",
1565
    "forsakin",
1566
    "forthcomin",
1567
    "fortifyin",
1568
    "forwardin",
1569
    "fosterin",
1570
    "foulin",
1571
    "foundin",
1572
    "foundlin",
1573
    "fowlin",
1574
    "fracturin",
1575
    "framin",
1576
    "franchisin",
1577
    "freakin",
1578
    "freein",
1579
    "freestandin",
1580
    "freezin",
1581
    "frequentin",
1582
    "frettin",
1583
    "frightenin",
1584
    "frontin",
1585
    "frostin",
1586
    "frownin",
1587
    "fruitin",
1588
    "frustratin",
1589
    "fryin",
1590
    "fuckin",
1591
    "fuelin",
1592
    "fulfillin",
1593
    "fumblin",
1594
    "fumin",
1595
    "functionin",
1596
    "fundin",
1597
    "fundraisin",
1598
    "furnishin",
1599
    "furtherin",
1600
    "fusin",
1601
    "fussin",
1602
    "gaggin",
1603
    "gainin",
1604
    "gallin",
1605
    "gallopin",
1606
    "gamblin",
1607
    "gapin",
1608
    "gardenin",
1609
    "garnerin",
1610
    "gaspin",
1611
    "gatherin",
1612
    "gatin",
1613
    "gaugin",
1614
    "gazin",
1615
    "gearin",
1616
    "geldin",
1617
    "genderin",
1618
    "generalizin",
1619
    "generatin",
1620
    "genotypin",
1621
    "germinatin",
1622
    "gesticulatin",
1623
    "gesturin",
1624
    "gettin",
1625
    "gigglin",
1626
    "gildin",
1627
    "gissin",
1628
    "givin",
1629
    "glancin",
1630
    "glarin",
1631
    "glazin",
1632
    "gleamin",
1633
    "gleanin",
1634
    "glidin",
1635
    "glimmerin",
1636
    "glintin",
1637
    "glistenin",
1638
    "glitterin",
1639
    "gloamin",
1640
    "gloatin",
1641
    "globalizin",
1642
    "glorifyin",
1643
    "gloryin",
1644
    "glowerin",
1645
    "glowin",
1646
    "gluin",
1647
    "gnashin",
1648
    "gnawin",
1649
    "goerin",
1650
    "goin",
1651
    "goldin",
1652
    "golfin",
1653
    "goodlookin",
1654
    "gorin",
1655
    "goslin",
1656
    "gossipin",
1657
    "gougin",
1658
    "governin",
1659
    "grabbin",
1660
    "gradin",
1661
    "graduatin",
1662
    "graftin",
1663
    "grantin",
1664
    "graphin",
1665
    "grapplin",
1666
    "graspin",
1667
    "gratifyin",
1668
    "grayin",
1669
    "graylin",
1670
    "grazin",
1671
    "greenin",
1672
    "greetin",
1673
    "grievin",
1674
    "grillin",
1675
    "grimacin",
1676
    "grindin",
1677
    "grinnin",
1678
    "grippin",
1679
    "groanin",
1680
    "groomin",
1681
    "gropin",
1682
    "groundbreakin",
1683
    "groundin",
1684
    "groupin",
1685
    "grovellin",
1686
    "growin",
1687
    "growlin",
1688
    "grubbin",
1689
    "grudgin",
1690
    "gruelin",
1691
    "grumblin",
1692
    "gruntin",
1693
    "guaranteein",
1694
    "guardin",
1695
    "guessin",
1696
    "guidin",
1697
    "gulpin",
1698
    "gunnin",
1699
    "gurglin",
1700
    "gushin",
1701
    "hackin",
1702
    "hagglin",
1703
    "hailin",
1704
    "hallucinatin",
1705
    "haltin",
1706
    "halvin",
1707
    "hammerin",
1708
    "hammin",
1709
    "hamperin",
1710
    "hamstrin",
1711
    "handicappin",
1712
    "handin",
1713
    "handlin",
1714
    "handshakin",
1715
    "handwritin",
1716
    "hangin",
1717
    "hankerin",
1718
    "happenin",
1719
    "haranguin",
1720
    "harassin",
1721
    "harborin",
1722
    "harbourin",
1723
    "hardenin",
1724
    "hardin",
1725
    "hardworkin",
1726
    "harin",
1727
    "harkin",
1728
    "harmin",
1729
    "harmonisin",
1730
    "harmonizin",
1731
    "harnessin",
1732
    "harpin",
1733
    "harrowin",
1734
    "harryin",
1735
    "harvestin",
1736
    "hashin",
1737
    "hastenin",
1738
    "hatchin",
1739
    "hatin",
1740
    "hauin",
1741
    "haulin",
1742
    "hauntin",
1743
    "havin",
1744
    "hawkin",
1745
    "hayin",
1746
    "hazardin",
1747
    "hazin",
1748
    "headin",
1749
    "healin",
1750
    "heapin",
1751
    "hearin",
1752
    "hearkenin",
1753
    "heartbreakin",
1754
    "heartenin",
1755
    "heartrendin",
1756
    "heartwarmin",
1757
    "heatin",
1758
    "heavin",
1759
    "hedgin",
1760
    "heedin",
1761
    "heightenin",
1762
    "hein",
1763
    "helpin",
1764
    "helsin",
1765
    "hemmin",
1766
    "hemorrhagin",
1767
    "hennin",
1768
    "heraldin",
1769
    "herdin",
1770
    "herin",
1771
    "herrin",
1772
    "hesitatin",
1773
    "hewin",
1774
    "hibernatin",
1775
    "hidin",
1776
    "highlightin",
1777
    "hijackin",
1778
    "hikin",
1779
    "hinderin",
1780
    "hintin",
1781
    "hirelin",
1782
    "hirin",
1783
    "hissin",
1784
    "hitchhikin",
1785
    "hitchin",
1786
    "hittin",
1787
    "hoardin",
1788
    "hobblin",
1789
    "hockin",
1790
    "hoein",
1791
    "hogglin",
1792
    "hoistin",
1793
    "holdin",
1794
    "hollerin",
1795
    "hollin",
1796
    "hollowin",
1797
    "homecomin",
1798
    "homemakin",
1799
    "homeschoolin",
1800
    "homin",
1801
    "homogenizin",
1802
    "honin",
1803
    "honkin",
1804
    "honorin",
1805
    "honourin",
1806
    "hookin",
1807
    "hootin",
1808
    "hopin",
1809
    "hoppin",
1810
    "horrifyin",
1811
    "hostin",
1812
    "houndin",
1813
    "housecleanin",
1814
    "housekeepin",
1815
    "housin",
1816
    "hoverin",
1817
    "howlin",
1818
    "huddlin",
1819
    "huffin",
1820
    "huggin",
1821
    "hulkin",
1822
    "humanizin",
1823
    "humblin",
1824
    "humiliatin",
1825
    "hummin",
1826
    "hungerin",
1827
    "huntin",
1828
    "hurlin",
1829
    "hurryin",
1830
    "hurtin",
1831
    "hurtlin",
1832
    "hushin",
1833
    "hustlin",
1834
    "icin",
1835
    "identifyin",
1836
    "idlin",
1837
    "ignitin",
1838
    "ignorin",
1839
    "illuminatin",
1840
    "illustratin",
1841
    "imagin",
1842
    "imaginin",
1843
    "imitatin",
1844
    "immersin",
1845
    "impactin",
1846
    "impairin",
1847
    "impartin",
1848
    "impedin",
1849
    "impellin",
1850
    "impendin",
1851
    "impingin",
1852
    "implementin",
1853
    "implicatin",
1854
    "implorin",
1855
    "implyin",
1856
    "importin",
1857
    "imposin",
1858
    "impressin",
1859
    "imprintin",
1860
    "imprisonin",
1861
    "improvin",
1862
    "improvisin",
1863
    "imputin",
1864
    "inbreedin",
1865
    "incitin",
1866
    "inclinin",
1867
    "inclosin",
1868
    "includin",
1869
    "incomin",
1870
    "incorporatin",
1871
    "increasin",
1872
    "incriminatin",
1873
    "inculcatin",
1874
    "incurrin",
1875
    "indexin",
1876
    "indicatin",
1877
    "inducin",
1878
    "indulgin",
1879
    "indwellin",
1880
    "infectin",
1881
    "inferrin",
1882
    "infightin",
1883
    "infiltratin",
1884
    "inflatin",
1885
    "inflictin",
1886
    "influencin",
1887
    "informin",
1888
    "infringin",
1889
    "infuriatin",
1890
    "infusin",
1891
    "ingestin",
1892
    "ingratiatin",
1893
    "inhabitin",
1894
    "inhalin",
1895
    "inheritin",
1896
    "inhibitin",
1897
    "initiatin",
1898
    "injectin",
1899
    "injurin",
1900
    "inklin",
1901
    "innin",
1902
    "innovatin",
1903
    "inquirin",
1904
    "insertin",
1905
    "insinuatin",
1906
    "insistin",
1907
    "inspectin",
1908
    "inspirin",
1909
    "installin",
1910
    "instigatin",
1911
    "instillin",
1912
    "institutin",
1913
    "instructin",
1914
    "insulatin",
1915
    "insultin",
1916
    "insurin",
1917
    "integratin",
1918
    "intendin",
1919
    "intensifyin",
1920
    "interactin",
1921
    "interceptin",
1922
    "interestin",
1923
    "interfacin",
1924
    "interferin",
1925
    "interlacin",
1926
    "interlockin",
1927
    "interminglin",
1928
    "internalizin",
1929
    "interposin",
1930
    "interpretin",
1931
    "interrogatin",
1932
    "interruptin",
1933
    "intersectin",
1934
    "intertwinin",
1935
    "intervenin",
1936
    "interviewin",
1937
    "interweavin",
1938
    "intherestin",
1939
    "intimatin",
1940
    "intimidatin",
1941
    "intoxicatin",
1942
    "intriguin",
1943
    "introducin",
1944
    "intrudin",
1945
    "invadin",
1946
    "inventin",
1947
    "invertin",
1948
    "investigatin",
1949
    "investin",
1950
    "invigoratin",
1951
    "invitin",
1952
    "invokin",
1953
    "involvin",
1954
    "ionizin",
1955
    "ironin",
1956
    "irrigatin",
1957
    "irritatin",
1958
    "isolatin",
1959
    "issuin",
1960
    "itchin",
1961
    "jabberin",
1962
    "jabbin",
1963
    "jammin",
1964
    "janglin",
1965
    "jarrin",
1966
    "jeerin",
1967
    "jeopardizin",
1968
    "jestin",
1969
    "jinglin",
1970
    "jobbin",
1971
    "jockeyin",
1972
    "joggin",
1973
    "joinin",
1974
    "jokin",
1975
    "joltin",
1976
    "jostlin",
1977
    "jottin",
1978
    "journalin",
1979
    "journeyin",
1980
    "joultin",
1981
    "joustin",
1982
    "judgin",
1983
    "jugglin",
1984
    "jumpin",
1985
    "justifyin",
1986
    "juttin",
1987
    "juxtaposin",
1988
    "kayakin",
1989
    "keatin",
1990
    "keelin",
1991
    "keenin",
1992
    "keepin",
1993
    "keesin",
1994
    "kellin",
1995
    "kesselrin",
1996
    "ketterin",
1997
    "keyin",
1998
    "kickin",
1999
    "kiddin",
2000
    "kidnappin",
2001
    "killin",
2002
    "kilwinnin",
2003
    "kindlin",
2004
    "kinkin",
2005
    "kiplin",
2006
    "kissin",
2007
    "kneadin",
2008
    "kneelin",
2009
    "knittin",
2010
    "knockin",
2011
    "knottin",
2012
    "knowin",
2013
    "konin",
2014
    "krigin",
2015
    "kunmin",
2016
    "labelin",
2017
    "labellin",
2018
    "laborin",
2019
    "labourin",
2020
    "lacin",
2021
    "lackin",
2022
    "lactatin",
2023
    "ladin",
2024
    "laggin",
2025
    "lamentin",
2026
    "landholdin",
2027
    "landin",
2028
    "landscapin",
2029
    "languishin",
2030
    "lansin",
2031
    "lappin",
2032
    "lapsin",
2033
    "lashin",
2034
    "lastin",
2035
    "laughin",
2036
    "launchin",
2037
    "launderin",
2038
    "lawmakin",
2039
    "layerin",
2040
    "layin",
2041
    "leachin",
2042
    "leadin",
2043
    "leakin",
2044
    "leanin",
2045
    "leapin",
2046
    "learnin",
2047
    "leasin",
2048
    "leavin",
2049
    "lecturin",
2050
    "leerin",
2051
    "legislatin",
2052
    "legitimatin",
2053
    "legitimizin",
2054
    "lendin",
2055
    "lengthenin",
2056
    "lessenin",
2057
    "lessin",
2058
    "letterin",
2059
    "lettin",
2060
    "levelin",
2061
    "levellin",
2062
    "leveragin",
2063
    "levyin",
2064
    "liberalizin",
2065
    "liberatin",
2066
    "licensin",
2067
    "lickin",
2068
    "lifesavin",
2069
    "liftin",
2070
    "lightenin",
2071
    "lightin",
2072
    "lightnin",
2073
    "likin",
2074
    "liltin",
2075
    "limitin",
2076
    "limpin",
2077
    "lingerin",
2078
    "linin",
2079
    "linkin",
2080
    "liquidatin",
2081
    "listenin",
2082
    "listin",
2083
    "listnin",
2084
    "litterin",
2085
    "livin",
2086
    "loadin",
2087
    "loafin",
2088
    "loathin",
2089
    "lobbyin",
2090
    "localizin",
2091
    "locatin",
2092
    "lockin",
2093
    "lodgin",
2094
    "loggin",
2095
    "loiterin",
2096
    "lollin",
2097
    "longin",
2098
    "longstandin",
2099
    "lookin",
2100
    "loomin",
2101
    "loopin",
2102
    "loosenin",
2103
    "loosin",
2104
    "lootin",
2105
    "losin",
2106
    "loungin",
2107
    "lovemakin",
2108
    "lovin",
2109
    "lowerin",
2110
    "lowin",
2111
    "lubricatin",
2112
    "luggin",
2113
    "lullin",
2114
    "lumberin",
2115
    "lunchin",
2116
    "lurchin",
2117
    "lurin",
2118
    "lurkin",
2119
    "lyin",
2120
    "lynchin",
2121
    "machinin",
2122
    "maddenin",
2123
    "magnetizin",
2124
    "magnifyin",
2125
    "mailin",
2126
    "maimin",
2127
    "mainsprin",
2128
    "mainstreamin",
2129
    "maintainin",
2130
    "mainwarin",
2131
    "majorin",
2132
    "makin",
2133
    "malfunctionin",
2134
    "malingerin",
2135
    "managin",
2136
    "mandatin",
2137
    "maneuverin",
2138
    "manifestin",
2139
    "manipulatin",
2140
    "mannerin",
2141
    "mannin",
2142
    "manoeuvrin",
2143
    "manufacturin",
2144
    "manurin",
2145
    "mappin",
2146
    "maraudin",
2147
    "marchin",
2148
    "marketin",
2149
    "markin",
2150
    "marryin",
2151
    "marshallin",
2152
    "marvelin",
2153
    "marvellin",
2154
    "maskin",
2155
    "masqueradin",
2156
    "massagin",
2157
    "massin",
2158
    "masterin",
2159
    "masturbatin",
2160
    "matchin",
2161
    "matchmakin",
2162
    "matin",
2163
    "mattin",
2164
    "maturin",
2165
    "maximisin",
2166
    "maximizin",
2167
    "meanderin",
2168
    "meanin",
2169
    "measurin",
2170
    "meddlin",
2171
    "mediatin",
2172
    "meditatin",
2173
    "meetin",
2174
    "meldin",
2175
    "meltin",
2176
    "memorizin",
2177
    "menacin",
2178
    "mendin",
2179
    "mentionin",
2180
    "mentorin",
2181
    "merchandisin",
2182
    "mergin",
2183
    "meshin",
2184
    "mesmerizin",
2185
    "messagin",
2186
    "messin",
2187
    "meterin",
2188
    "middlin",
2189
    "midmornin",
2190
    "migratin",
2191
    "milkin",
2192
    "millin",
2193
    "mimickin",
2194
    "mincin",
2195
    "mindin",
2196
    "minglin",
2197
    "minimisin",
2198
    "minimizin",
2199
    "minin",
2200
    "ministerin",
2201
    "mirrorin",
2202
    "misbehavin",
2203
    "misgivin",
2204
    "misleadin",
2205
    "misreadin",
2206
    "misrepresentin",
2207
    "missin",
2208
    "mistakin",
2209
    "misunderstandin",
2210
    "mitigatin",
2211
    "mixin",
2212
    "moanin",
2213
    "mobilisin",
2214
    "mobilizin",
2215
    "mockin",
2216
    "modelin",
2217
    "modellin",
2218
    "moderatin",
2219
    "modernizin",
2220
    "modifyin",
2221
    "modulatin",
2222
    "moistenin",
2223
    "moldin",
2224
    "molestin",
2225
    "monitorin",
2226
    "monopolizin",
2227
    "moorin",
2228
    "mopin",
2229
    "moppin",
2230
    "moralizin",
2231
    "mornin",
2232
    "morphin",
2233
    "mortifyin",
2234
    "motherin",
2235
    "motionin",
2236
    "motivatin",
2237
    "motorin",
2238
    "moulderin",
2239
    "mouldin",
2240
    "mountaineerin",
2241
    "mountin",
2242
    "mournin",
2243
    "mouthin",
2244
    "movin",
2245
    "mowin",
2246
    "mullin",
2247
    "multiplexin",
2248
    "multiplyin",
2249
    "multitaskin",
2250
    "mumblin",
2251
    "munchin",
2252
    "murderin",
2253
    "murmurin",
2254
    "murtherin",
2255
    "musin",
2256
    "musterin",
2257
    "mutterin",
2258
    "mystifyin",
2259
    "naethin",
2260
    "naggin",
2261
    "nailin",
2262
    "namin",
2263
    "namsayin",
2264
    "nankin",
2265
    "nappin",
2266
    "narratin",
2267
    "narrowin",
2268
    "nauseatin",
2269
    "nuffin",
2270
    "navigatin",
2271
    "nearin",
2272
    "necessitatin",
2273
    "necrotizin",
2274
    "needin",
2275
    "needlin",
2276
    "negatin",
2277
    "neglectin",
2278
    "negotiatin",
2279
    "neighborin",
2280
    "neighbourin",
2281
    "neighin",
2282
    "nestin",
2283
    "nestlin",
2284
    "nettin",
2285
    "networkin",
2286
    "neuroimagin",
2287
    "neutralizin",
2288
    "nibblin",
2289
    "nippin",
2290
    "noddin",
2291
    "nominatin",
2292
    "nonconformin",
2293
    "nonlivin",
2294
    "nonthreatenin",
2295
    "normalizin",
2296
    "nosin",
2297
    "nothin",
2298
    "noticin",
2299
    "notifyin",
2300
    "notin",
2301
    "nottin",
2302
    "notwithstandin",
2303
    "nourishin",
2304
    "nudgin",
2305
    "numberin",
2306
    "numbin",
2307
    "nursin",
2308
    "nurturin",
2309
    "obeyin",
2310
    "objectifyin",
2311
    "objectin",
2312
    "obligin",
2313
    "obliteratin",
2314
    "obscurin",
2315
    "observin",
2316
    "obsessin",
2317
    "obstructin",
2318
    "obtainin",
2319
    "obviatin",
2320
    "occasionin",
2321
    "occludin",
2322
    "occupyin",
2323
    "occurin",
2324
    "occurrin",
2325
    "offendin",
2326
    "offerin",
2327
    "officiatin",
2328
    "offin",
2329
    "offsettin",
2330
    "offshorin",
2331
    "offsprin",
2332
    "oglin",
2333
    "oilin",
2334
    "omittin",
2335
    "oncomin",
2336
    "ongoin",
2337
    "oozin",
2338
    "openin",
2339
    "operatin",
2340
    "opposin",
2341
    "oppressin",
2342
    "optimisin",
2343
    "optimizin",
2344
    "optin",
2345
    "orbitin",
2346
    "orchestratin",
2347
    "ordainin",
2348
    "orderin",
2349
    "ordinatin",
2350
    "organisin",
2351
    "organizin",
2352
    "orientin",
2353
    "originatin",
2354
    "ornamentin",
2355
    "oscillatin",
2356
    "otherin",
2357
    "oustin",
2358
    "outcroppin",
2359
    "outfittin",
2360
    "outgoin",
2361
    "outin",
2362
    "outlawin",
2363
    "outlinin",
2364
    "outlyin",
2365
    "outnumberin",
2366
    "outpourin",
2367
    "outsourcin",
2368
    "outstandin",
2369
    "outstrippin",
2370
    "overarchin",
2371
    "overbearin",
2372
    "overcomin",
2373
    "overcrowdin",
2374
    "overdoin",
2375
    "overeatin",
2376
    "overestimatin",
2377
    "overexpressin",
2378
    "overfishin",
2379
    "overflowin",
2380
    "overgrazin",
2381
    "overhangin",
2382
    "overhaulin",
2383
    "overhearin",
2384
    "overheatin",
2385
    "overlappin",
2386
    "overlayin",
2387
    "overloadin",
2388
    "overlookin",
2389
    "overlyin",
2390
    "overmasterin",
2391
    "overpowerin",
2392
    "overreachin",
2393
    "overreactin",
2394
    "overridin",
2395
    "overrulin",
2396
    "overrunnin",
2397
    "overseein",
2398
    "overshadowin",
2399
    "overstatin",
2400
    "oversteppin",
2401
    "overtakin",
2402
    "overthrowin",
2403
    "overtrainin",
2404
    "overturnin",
2405
    "overweenin",
2406
    "overwhelmin",
2407
    "overwritin",
2408
    "owin",
2409
    "ownin",
2410
    "oxidisin",
2411
    "oxidizin",
2412
    "pacifyin",
2413
    "pacin",
2414
    "packagin",
2415
    "packin",
2416
    "paddin",
2417
    "paddlin",
2418
    "pagin",
2419
    "painstakin",
2420
    "paintin",
2421
    "pairin",
2422
    "palin",
2423
    "palpitatin",
2424
    "pamperin",
2425
    "panderin",
2426
    "panelin",
2427
    "panellin",
2428
    "panickin",
2429
    "pannin",
2430
    "pantin",
2431
    "paradin",
2432
    "parallelin",
2433
    "paralysin",
2434
    "paralyzin",
2435
    "paraphrasin",
2436
    "pardonin",
2437
    "parentin",
2438
    "parin",
2439
    "parkin",
2440
    "parsin",
2441
    "partakin",
2442
    "participatin",
2443
    "partin",
2444
    "partitionin",
2445
    "partnerin",
2446
    "partyin",
2447
    "passin",
2448
    "pastin",
2449
    "patchin",
2450
    "patentin",
2451
    "patrollin",
2452
    "patronisin",
2453
    "patronizin",
2454
    "patterin",
2455
    "patternin",
2456
    "pausin",
2457
    "pavin",
2458
    "pawin",
2459
    "payin",
2460
    "peacebuildin",
2461
    "peacekeepin",
2462
    "peacemakin",
2463
    "peakin",
2464
    "pealin",
2465
    "peckin",
2466
    "peddlin",
2467
    "peekin",
2468
    "peelin",
2469
    "peepin",
2470
    "peerin",
2471
    "pekin",
2472
    "peltin",
2473
    "pendin",
2474
    "penetratin",
2475
    "pennin",
2476
    "peoplin",
2477
    "perceivin",
2478
    "perchin",
2479
    "percolatin",
2480
    "perfectin",
2481
    "perforatin",
2482
    "performin",
2483
    "perishin",
2484
    "permeatin",
2485
    "permittin",
2486
    "perpetratin",
2487
    "perpetuatin",
2488
    "perplexin",
2489
    "persecutin",
2490
    "perseverin",
2491
    "pershin",
2492
    "persistin",
2493
    "perspirin",
2494
    "persuadin",
2495
    "pertainin",
2496
    "perusin",
2497
    "pervadin",
2498
    "pervertin",
2499
    "pesterin",
2500
    "petitionin",
2501
    "pettin",
2502
    "phasin",
2503
    "philosophizin",
2504
    "phishin",
2505
    "phonin",
2506
    "photocopyin",
2507
    "photographin",
2508
    "phrasin",
2509
    "pickerin",
2510
    "picketin",
2511
    "pickin",
2512
    "picklin",
2513
    "picturin",
2514
    "piecin",
2515
    "piercin",
2516
    "pilferin",
2517
    "pilin",
2518
    "pillagin",
2519
    "pilotin",
2520
    "pinchin",
2521
    "pinin",
2522
    "pinnin",
2523
    "pioneerin",
2524
    "pipin",
2525
    "pissin",
2526
    "pitchin",
2527
    "pittin",
2528
    "pityin",
2529
    "pivotin",
2530
    "placin",
2531
    "plaguin",
2532
    "planin",
2533
    "plankin",
2534
    "plannin",
2535
    "plantin",
2536
    "plasterin",
2537
    "platin",
2538
    "playin",
2539
    "playthin",
2540
    "pleadin",
2541
    "pleasin",
2542
    "pledgin",
2543
    "ploddin",
2544
    "plottin",
2545
    "ploughin",
2546
    "plowin",
2547
    "pluckin",
2548
    "pluggin",
2549
    "plumbin",
2550
    "plummetin",
2551
    "plunderin",
2552
    "plungin",
2553
    "plyin",
2554
    "poachin",
2555
    "pocketin",
2556
    "podcastin",
2557
    "pointin",
2558
    "poisonin",
2559
    "pokin",
2560
    "polarizin",
2561
    "poldin",
2562
    "policin",
2563
    "policymakin",
2564
    "polishin",
2565
    "pollin",
2566
    "pollutin",
2567
    "ponderin",
2568
    "poolin",
2569
    "poppin",
2570
    "populatin",
2571
    "porin",
2572
    "portrayin",
2573
    "posin",
2574
    "positin",
2575
    "positionin",
2576
    "possessin",
2577
    "postin",
2578
    "postponin",
2579
    "postulatin",
2580
    "posturin",
2581
    "pottin",
2582
    "poundin",
2583
    "pourin",
2584
    "poutin",
2585
    "powerin",
2586
    "practicin",
2587
    "practisin",
2588
    "praisin",
2589
    "prancin",
2590
    "prayin",
2591
    "preachin",
2592
    "precedin",
2593
    "precipitatin",
2594
    "precludin",
2595
    "predictin",
2596
    "predisposin",
2597
    "predominatin",
2598
    "preexistin",
2599
    "preferrin",
2600
    "preparin",
2601
    "preponderatin",
2602
    "prepossessin",
2603
    "preprocessin",
2604
    "prescribin",
2605
    "presentin",
2606
    "preservin",
2607
    "presidin",
2608
    "pressin",
2609
    "pressurin",
2610
    "presumin",
2611
    "presupposin",
2612
    "pretendin",
2613
    "prevailin",
2614
    "preventin",
2615
    "preyin",
2616
    "pricin",
2617
    "prickin",
2618
    "primin",
2619
    "printin",
2620
    "prioritizin",
2621
    "privateerin",
2622
    "privilegin",
2623
    "probin",
2624
    "problemsolvin",
2625
    "proceedin",
2626
    "processin",
2627
    "proclaimin",
2628
    "procurin",
2629
    "proddin",
2630
    "producin",
2631
    "professin",
2632
    "profilin",
2633
    "profiteerin",
2634
    "profitin",
2635
    "programmin",
2636
    "progressin",
2637
    "prohibitin",
2638
    "projectin",
2639
    "proliferatin",
2640
    "prolongin",
2641
    "promisin",
2642
    "promotin",
2643
    "promptin",
2644
    "promulgatin",
2645
    "pronouncin",
2646
    "proofin",
2647
    "proofreadin",
2648
    "propagatin",
2649
    "propellin",
2650
    "prophesyin",
2651
    "proposin",
2652
    "proppin",
2653
    "prosecutin",
2654
    "proselytizin",
2655
    "prospectin",
2656
    "prosperin",
2657
    "prostratin",
2658
    "protectin",
2659
    "protestin",
2660
    "prototypin",
2661
    "protrudin",
2662
    "providin",
2663
    "provin",
2664
    "provisionin",
2665
    "provokin",
2666
    "prowlin",
2667
    "prunin",
2668
    "pryin",
2669
    "publicizin",
2670
    "publishin",
2671
    "puddin",
2672
    "pullin",
2673
    "pulsatin",
2674
    "pulsin",
2675
    "pumpin",
2676
    "punchin",
2677
    "punishin",
2678
    "punnin",
2679
    "purchasin",
2680
    "purgin",
2681
    "purifyin",
2682
    "purportin",
2683
    "purrin",
2684
    "pursuin",
2685
    "pushin",
2686
    "puttin",
2687
    "puzzlin",
2688
    "quakin",
2689
    "qualifyin",
2690
    "quantifyin",
2691
    "quarrelin",
2692
    "quarrellin",
2693
    "quarryin",
2694
    "quarterin",
2695
    "quaverin",
2696
    "quellin",
2697
    "quenchin",
2698
    "queryin",
2699
    "questin",
2700
    "questionin",
2701
    "queuein",
2702
    "queuin",
2703
    "quickenin",
2704
    "quietin",
2705
    "quiltin",
2706
    "quittin",
2707
    "quiverin",
2708
    "quizzin",
2709
    "quotin",
2710
    "racin",
2711
    "rackin",
2712
    "radiatin",
2713
    "raftin",
2714
    "ragin",
2715
    "raidin",
2716
    "railin",
2717
    "rainin",
2718
    "rakin",
2719
    "rallyin",
2720
    "ramblin",
2721
    "rammin",
2722
    "ranchin",
2723
    "rangin",
2724
    "rantin",
2725
    "rapin",
2726
    "rappin",
2727
    "raspin",
2728
    "ratifyin",
2729
    "ratin",
2730
    "rationalizin",
2731
    "rationin",
2732
    "rattlin",
2733
    "ravagin",
2734
    "ravin",
2735
    "ravishin",
2736
    "reachin",
2737
    "reactin",
2738
    "readin",
2739
    "reaffirmin",
2740
    "realisin",
2741
    "realizin",
2742
    "reapin",
2743
    "reappearin",
2744
    "rearin",
2745
    "rearrangin",
2746
    "reasonin",
2747
    "reassurin",
2748
    "rebellin",
2749
    "rebuildin",
2750
    "rebukin",
2751
    "recallin",
2752
    "recastin",
2753
    "recedin",
2754
    "receivin",
2755
    "reciprocatin",
2756
    "recitin",
2757
    "reckonin",
2758
    "reclaimin",
2759
    "reclinin",
2760
    "recognisin",
2761
    "recognizin",
2762
    "recollectin",
2763
    "recommendin",
2764
    "reconcilin",
2765
    "reconstructin",
2766
    "recordin",
2767
    "recountin",
2768
    "recoverin",
2769
    "recreatin",
2770
    "recruitin",
2771
    "rectifyin",
2772
    "recurrin",
2773
    "recyclin",
2774
    "reddenin",
2775
    "reddin",
2776
    "redeemin",
2777
    "redefinin",
2778
    "redirectin",
2779
    "redistrictin",
2780
    "reducin",
2781
    "reekin",
2782
    "reelin",
2783
    "reengineerin",
2784
    "refactorin",
2785
    "referencin",
2786
    "referrin",
2787
    "refinancin",
2788
    "refinin",
2789
    "reflectin",
2790
    "reformin",
2791
    "refractin",
2792
    "refrainin",
2793
    "reframin",
2794
    "refreshin",
2795
    "refuelin",
2796
    "refusin",
2797
    "refutin",
2798
    "regainin",
2799
    "regardin",
2800
    "regeneratin",
2801
    "registerin",
2802
    "regrettin",
2803
    "regulatin",
2804
    "rehearin",
2805
    "rehearsin",
2806
    "reignin",
2807
    "reinforcin",
2808
    "reinventin",
2809
    "reiteratin",
2810
    "rejectin",
2811
    "rejoicin",
2812
    "rejoinin",
2813
    "relapsin",
2814
    "relatin",
2815
    "relaxin",
2816
    "relayin",
2817
    "releasin",
2818
    "relievin",
2819
    "relinquishin",
2820
    "relishin",
2821
    "relivin",
2822
    "reloadin",
2823
    "relocatin",
2824
    "relyin",
2825
    "remainin",
2826
    "remakin",
2827
    "remarkin",
2828
    "remedyin",
2829
    "rememberin",
2830
    "remindin",
2831
    "reminiscin",
2832
    "remittin",
2833
    "remodelin",
2834
    "remodellin",
2835
    "removin",
2836
    "renamin",
2837
    "renderin",
2838
    "rendin",
2839
    "renewin",
2840
    "renouncin",
2841
    "renovatin",
2842
    "rentin",
2843
    "reopenin",
2844
    "reorderin",
2845
    "reorganizin",
2846
    "repairin",
2847
    "repayin",
2848
    "repealin",
2849
    "repeatin",
2850
    "repellin",
2851
    "repentin",
2852
    "replacin",
2853
    "replenishin",
2854
    "replicatin",
2855
    "replyin",
2856
    "reportin",
2857
    "reposin",
2858
    "repositionin",
2859
    "representin",
2860
    "repressin",
2861
    "reprintin",
2862
    "reproachin",
2863
    "reprocessin",
2864
    "reproducin",
2865
    "reprovin",
2866
    "repudiatin",
2867
    "requestin",
2868
    "requirin",
2869
    "rereadin",
2870
    "rescuin",
2871
    "researchin",
2872
    "resemblin",
2873
    "resentin",
2874
    "reservin",
2875
    "resettin",
2876
    "reshapin",
2877
    "residin",
2878
    "resignin",
2879
    "resistin",
2880
    "resolvin",
2881
    "resonatin",
2882
    "resortin",
2883
    "resoundin",
2884
    "respectin",
2885
    "respondin",
2886
    "restin",
2887
    "restorin",
2888
    "restrainin",
2889
    "restrictin",
2890
    "restructurin",
2891
    "resultin",
2892
    "resumin",
2893
    "resurfacin",
2894
    "retailin",
2895
    "retainin",
2896
    "retardin",
2897
    "retellin",
2898
    "rethinkin",
2899
    "retirin",
2900
    "retracin",
2901
    "retrainin",
2902
    "retreatin",
2903
    "retrievin",
2904
    "returnin",
2905
    "reusin",
2906
    "revealin",
2907
    "revellin",
2908
    "reverberatin",
2909
    "reversin",
2910
    "revertin",
2911
    "reviewin",
2912
    "revisin",
2913
    "revisitin",
2914
    "revivin",
2915
    "revoltin",
2916
    "revolvin",
2917
    "rewardin",
2918
    "reworkin",
2919
    "rewritin",
2920
    "rhymin",
2921
    "riddin",
2922
    "ridiculin",
2923
    "ridin",
2924
    "riggin",
2925
    "rightin",
2926
    "ringin",
2927
    "rinsin",
2928
    "riotin",
2929
    "ripenin",
2930
    "rippin",
2931
    "ripplin",
2932
    "risin",
2933
    "riskin",
2934
    "rivetin",
2935
    "roamin",
2936
    "roarin",
2937
    "roastin",
2938
    "rockin",
2939
    "rollickin",
2940
    "rollin",
2941
    "rompin",
2942
    "roofin",
2943
    "roomin",
2944
    "roostin",
2945
    "rootin",
2946
    "rotatin",
2947
    "rottin",
2948
    "roughin",
2949
    "roundin",
2950
    "rousin",
2951
    "routin",
2952
    "rovin",
2953
    "rowin",
2954
    "rowlin",
2955
    "rubbin",
2956
    "rufflin",
2957
    "ruinin",
2958
    "rulemakin",
2959
    "rulin",
2960
    "rumblin",
2961
    "ruminatin",
2962
    "rummagin",
2963
    "runnin",
2964
    "rushin",
2965
    "rustin",
2966
    "rustlin",
2967
    "rythin",
2968
    "sackin",
2969
    "sacrificin",
2970
    "safeguardin",
2971
    "safekeepin",
2972
    "saggin",
2973
    "sailin",
2974
    "salutin",
2975
    "samplin",
2976
    "sanctifyin",
2977
    "sanctionin",
2978
    "saplin",
2979
    "satisfyin",
2980
    "saunterin",
2981
    "savin",
2982
    "savorin",
2983
    "sawin",
2984
    "sayin",
2985
    "scaffoldin",
2986
    "scaldin",
2987
    "scalin",
2988
    "scamperin",
2989
    "scannin",
2990
    "scarin",
2991
    "scarrin",
2992
    "scathin",
2993
    "scatterin",
2994
    "scavengin",
2995
    "schedulin",
2996
    "schellin",
2997
    "schemin",
2998
    "schillin",
2999
    "schoolin",
3000
    "scoldin",
3001
    "scoopin",
3002
    "scorchin",
3003
    "scorin",
3004
    "scourin",
3005
    "scoutin",
3006
    "scowlin",
3007
    "scramblin",
3008
    "scrapin",
3009
    "scratchin",
3010
    "screamin",
3011
    "screechin",
3012
    "screenin",
3013
    "screwin",
3014
    "scribblin",
3015
    "scriptin",
3016
    "scrollin",
3017
    "scrubbin",
3018
    "scrutinizin",
3019
    "scurryin",
3020
    "seafarin",
3021
    "sealin",
3022
    "searchin",
3023
    "searin",
3024
    "seasonin",
3025
    "seatin",
3026
    "secretin",
3027
    "securin",
3028
    "seducin",
3029
    "seedin",
3030
    "seedlin",
3031
    "seein",
3032
    "seekin",
3033
    "seemin",
3034
    "seepin",
3035
    "seethin",
3036
    "seizin",
3037
    "selectin",
3038
    "sellin",
3039
    "sendin",
3040
    "sensin",
3041
    "sentencin",
3042
    "separatin",
3043
    "sequencin",
3044
    "servicin",
3045
    "servin",
3046
    "settin",
3047
    "settlin",
3048
    "sewin",
3049
    "shadin",
3050
    "shadowin",
3051
    "shakin",
3052
    "shamin",
3053
    "shapin",
3054
    "sharin",
3055
    "sharpenin",
3056
    "shatterin",
3057
    "shavin",
3058
    "shearin",
3059
    "sheathin",
3060
    "sheddin",
3061
    "sheetin",
3062
    "shellin",
3063
    "shelterin",
3064
    "shelvin",
3065
    "shewin",
3066
    "shieldin",
3067
    "shiftin",
3068
    "shillin",
3069
    "shimmerin",
3070
    "shinin",
3071
    "shipbuildin",
3072
    "shippin",
3073
    "shirkin",
3074
    "shittin",
3075
    "shiverin",
3076
    "shockin",
3077
    "shootin",
3078
    "shoppin",
3079
    "shortcomin",
3080
    "shortenin",
3081
    "shoulderin",
3082
    "shoutin",
3083
    "shovin",
3084
    "showerin",
3085
    "showin",
3086
    "shriekin",
3087
    "shrinkin",
3088
    "shruggin",
3089
    "shudderin",
3090
    "shufflin",
3091
    "shuntin",
3092
    "shuttin",
3093
    "siblin",
3094
    "sickenin",
3095
    "sidin",
3096
    "siftin",
3097
    "sighin",
3098
    "sightin",
3099
    "sightseein",
3100
    "signalin",
3101
    "signallin",
3102
    "signifyin",
3103
    "signin",
3104
    "silencin",
3105
    "simmerin",
3106
    "simplifyin",
3107
    "simulatin",
3108
    "singin",
3109
    "sinkin",
3110
    "sinnin",
3111
    "sippin",
3112
    "sitin",
3113
    "sittin",
3114
    "situatin",
3115
    "sizin",
3116
    "sizzlin",
3117
    "skatin",
3118
    "sketchin",
3119
    "skiin",
3120
    "skimmin",
3121
    "skinnin",
3122
    "skippin",
3123
    "skirmishin",
3124
    "skirtin",
3125
    "skulkin",
3126
    "slammin",
3127
    "slantin",
3128
    "slappin",
3129
    "slashin",
3130
    "slaughterin",
3131
    "slaveholdin",
3132
    "slayin",
3133
    "sleepin",
3134
    "slicin",
3135
    "slidin",
3136
    "slippin",
3137
    "slopin",
3138
    "slowin",
3139
    "slumberin",
3140
    "smackin",
3141
    "smartin",
3142
    "smashin",
3143
    "smatterin",
3144
    "smellin",
3145
    "smeltin",
3146
    "smilin",
3147
    "smokin",
3148
    "smolderin",
3149
    "smoothin",
3150
    "smotherin",
3151
    "smoulderin",
3152
    "smugglin",
3153
    "snappin",
3154
    "snarlin",
3155
    "snatchin",
3156
    "sneakin",
3157
    "sneerin",
3158
    "sneezin",
3159
    "sniffin",
3160
    "snoopin",
3161
    "snorin",
3162
    "snortin",
3163
    "snowin",
3164
    "soakin",
3165
    "soarin",
3166
    "sobbin",
3167
    "soberin",
3168
    "socializin",
3169
    "softenin",
3170
    "solderin",
3171
    "soldierin",
3172
    "solicitin",
3173
    "solvin",
3174
    "somethin",
3175
    "soothin",
3176
    "sorrowin",
3177
    "sortin",
3178
    "soundin",
3179
    "sourcin",
3180
    "sowin",
3181
    "spacin",
3182
    "spaldin",
3183
    "spankin",
3184
    "spannin",
3185
    "sparin",
3186
    "sparkin",
3187
    "sparklin",
3188
    "sparrin",
3189
    "spauldin",
3190
    "spawnin",
3191
    "speakin",
3192
    "specializin",
3193
    "specifyin",
3194
    "speculatin",
3195
    "speedin",
3196
    "spellin",
3197
    "spendin",
3198
    "spewin",
3199
    "spillin",
3200
    "spinnin",
3201
    "spiralin",
3202
    "spittin",
3203
    "splashin",
3204
    "splicin",
3205
    "splinterin",
3206
    "splittin",
3207
    "spoilin",
3208
    "sponsorin",
3209
    "sportin",
3210
    "spottin",
3211
    "spoutin",
3212
    "sprawlin",
3213
    "sprayin",
3214
    "spreadin",
3215
    "springin",
3216
    "sprinklin",
3217
    "sproutin",
3218
    "spurrin",
3219
    "sputterin",
3220
    "spyin",
3221
    "squabblin",
3222
    "squarin",
3223
    "squattin",
3224
    "squeakin",
3225
    "squealin",
3226
    "squeezin",
3227
    "squintin",
3228
    "squirmin",
3229
    "stabbin",
3230
    "stabilizin",
3231
    "stackin",
3232
    "staffin",
3233
    "staggerin",
3234
    "stagin",
3235
    "stainin",
3236
    "stakin",
3237
    "stalkin",
3238
    "stallin",
3239
    "stammerin",
3240
    "stampin",
3241
    "standin",
3242
    "starin",
3243
    "starrin",
3244
    "startin",
3245
    "startlin",
3246
    "starvin",
3247
    "statin",
3248
    "stayin",
3249
    "steadyin",
3250
    "stealin",
3251
    "steamin",
3252
    "steerin",
3253
    "stemmin",
3254
    "stentin",
3255
    "steppin",
3256
    "stereotypin",
3257
    "sterlin",
3258
    "stickin",
3259
    "stiffenin",
3260
    "stiflin",
3261
    "stimulatin",
3262
    "stingin",
3263
    "stinkin",
3264
    "stipulatin",
3265
    "stirlin",
3266
    "stirrin",
3267
    "stitchin",
3268
    "stockin",
3269
    "stompin",
3270
    "stoopin",
3271
    "stoppin",
3272
    "storin",
3273
    "stormin",
3274
    "storytellin",
3275
    "straddlin",
3276
    "stragglin",
3277
    "straightenin",
3278
    "strainin",
3279
    "stranglin",
3280
    "strappin",
3281
    "strayin",
3282
    "streamin",
3283
    "streamlinin",
3284
    "strengthenin",
3285
    "stressin",
3286
    "stretchin",
3287
    "stridin",
3288
    "strikin",
3289
    "stringin",
3290
    "strippin",
3291
    "strivin",
3292
    "strokin",
3293
    "strollin",
3294
    "structurin",
3295
    "strugglin",
3296
    "struttin",
3297
    "studyin",
3298
    "stuffin",
3299
    "stumblin",
3300
    "stunnin",
3301
    "stutterin",
3302
    "stylin",
3303
    "subduin",
3304
    "subjectin",
3305
    "submittin",
3306
    "subordinatin",
3307
    "subscribin",
3308
    "subsidin",
3309
    "subsistin",
3310
    "substitutin",
3311
    "subtractin",
3312
    "subvertin",
3313
    "succeedin",
3314
    "succumbin",
3315
    "suckin",
3316
    "sucklin",
3317
    "sufferin",
3318
    "suffocatin",
3319
    "suggestin",
3320
    "suin",
3321
    "summarizin",
3322
    "summin",
3323
    "summonin",
3324
    "superconductin",
3325
    "superintendin",
3326
    "supersedin",
3327
    "supervisin",
3328
    "supplementin",
3329
    "supplyin",
3330
    "supportin",
3331
    "supposin",
3332
    "suppressin",
3333
    "surfacin",
3334
    "surfin",
3335
    "surgin",
3336
    "surmountin",
3337
    "surpassin",
3338
    "surprisin",
3339
    "surrenderin",
3340
    "surroundin",
3341
    "surveyin",
3342
    "survivin",
3343
    "suspectin",
3344
    "suspendin",
3345
    "sustainin",
3346
    "swaggerin",
3347
    "swallowin",
3348
    "swappin",
3349
    "swarmin",
3350
    "swayin",
3351
    "swearin",
3352
    "sweatin",
3353
    "sweepin",
3354
    "swellin",
3355
    "swelterin",
3356
    "swimmin",
3357
    "swingin",
3358
    "swirlin",
3359
    "switchin",
3360
    "swoopin",
3361
    "symbolizin",
3362
    "sympathizin",
3363
    "synthesizin",
3364
    "tackin",
3365
    "tacklin",
3366
    "taggin",
3367
    "tailin",
3368
    "tailorin",
3369
    "takin",
3370
    "talkin",
3371
    "tamin",
3372
    "tamperin",
3373
    "tanglin",
3374
    "tantalisin",
3375
    "tantalizin",
3376
    "taperin",
3377
    "tapin",
3378
    "tappin",
3379
    "targetin",
3380
    "tarlin",
3381
    "tarryin",
3382
    "taskin",
3383
    "tastin",
3384
    "tattooin",
3385
    "tatterin",
3386
    "tauntin",
3387
    "taxin",
3388
    "teachin",
3389
    "teamin",
3390
    "tearin",
3391
    "teasin",
3392
    "teemin",
3393
    "teeterin",
3394
    "teethin",
3395
    "telecommutin",
3396
    "telegraphin",
3397
    "telemarketin",
3398
    "telephonin",
3399
    "tellin",
3400
    "temperin",
3401
    "temptin",
3402
    "tenderin",
3403
    "tendin",
3404
    "tensin",
3405
    "terminatin",
3406
    "terrifyin",
3407
    "terrorizin",
3408
    "testifyin",
3409
    "testin",
3410
    "tetherin",
3411
    "textin",
3412
    "thankin",
3413
    "thanksgivin",
3414
    "thawin",
3415
    "theorisin",
3416
    "theorizin",
3417
    "thickenin",
3418
    "thievin",
3419
    "thinkin",
3420
    "thinnin",
3421
    "thirstin",
3422
    "thoroughgoin",
3423
    "thrampin",
3424
    "thrashin",
3425
    "threadin",
3426
    "threatenin",
3427
    "threshin",
3428
    "thresholdin",
3429
    "thrillin",
3430
    "thrivin",
3431
    "throbbin",
3432
    "throngin",
3433
    "throttlin",
3434
    "throwin",
3435
    "thrustin",
3436
    "thuddin",
3437
    "thumbin",
3438
    "thumpin",
3439
    "thunderin",
3440
    "thwartin",
3441
    "tickin",
3442
    "ticklin",
3443
    "tidyin",
3444
    "tightenin",
3445
    "tilin",
3446
    "tillin",
3447
    "tiltin",
3448
    "timin",
3449
    "tinglin",
3450
    "tinkerin",
3451
    "tinklin",
3452
    "tintin",
3453
    "tippin",
3454
    "tirin",
3455
    "tithin",
3456
    "titillatin",
3457
    "toastin",
3458
    "toilin",
3459
    "toleratin",
3460
    "tollin",
3461
    "toolin",
3462
    "toppin",
3463
    "topplin",
3464
    "tormentin",
3465
    "torturin",
3466
    "tossin",
3467
    "tostrin",
3468
    "totalin",
3469
    "totalizin",
3470
    "totallin",
3471
    "totin",
3472
    "totterin",
3473
    "touchin",
3474
    "tourin",
3475
    "toutin",
3476
    "towerin",
3477
    "towin",
3478
    "toyin",
3479
    "tracin",
3480
    "trackin",
3481
    "tradin",
3482
    "traffickin",
3483
    "trailin",
3484
    "trainin",
3485
    "trampin",
3486
    "tramplin",
3487
    "transactin",
3488
    "transcendin",
3489
    "transcribin",
3490
    "transferrin",
3491
    "transformin",
3492
    "transgressin",
3493
    "transitionin",
3494
    "translatin",
3495
    "transmittin",
3496
    "transpirin",
3497
    "transplantin",
3498
    "transportin",
3499
    "transposin",
3500
    "trappin",
3501
    "travelin",
3502
    "travellin",
3503
    "traversin",
3504
    "trawlin",
3505
    "treadin",
3506
    "treatin",
3507
    "trekkin",
3508
    "tremblin",
3509
    "trenchin",
3510
    "trendin",
3511
    "trespassin",
3512
    "trickin",
3513
    "tricklin",
3514
    "triflin",
3515
    "triggerin",
3516
    "trillin",
3517
    "trimmin",
3518
    "trippin",
3519
    "triumphin",
3520
    "trollin",
3521
    "troopin",
3522
    "trottin",
3523
    "troubleshootin",
3524
    "troublin",
3525
    "truckin",
3526
    "trudgin",
3527
    "trumpetin",
3528
    "trustin",
3529
    "tryin",
3530
    "tubin",
3531
    "tuckin",
3532
    "tuggin",
3533
    "tulvin",
3534
    "tumblin",
3535
    "tunin",
3536
    "tunnelin",
3537
    "tunnellin",
3538
    "turnin",
3539
    "tutorin",
3540
    "tweakin",
3541
    "twinin",
3542
    "twinklin",
3543
    "twinnin",
3544
    "twirlin",
3545
    "twistin",
3546
    "twitchin",
3547
    "twitterin",
3548
    "tyin",
3549
    "typesettin",
3550
    "typewritin",
3551
    "typin",
3552
    "unappealin",
3553
    "unassumin",
3554
    "unavailin",
3555
    "unbecomin",
3556
    "unbelievin",
3557
    "unbendin",
3558
    "unblinkin",
3559
    "uncarin",
3560
    "unceasin",
3561
    "unchangin",
3562
    "uncomplainin",
3563
    "uncomprehendin",
3564
    "uncompromisin",
3565
    "unconvincin",
3566
    "uncoverin",
3567
    "undercuttin",
3568
    "underestimatin",
3569
    "undergoin",
3570
    "underlinin",
3571
    "underlyin",
3572
    "underminin",
3573
    "underpinnin",
3574
    "underscorin",
3575
    "understandin",
3576
    "undertakin",
3577
    "underwritin",
3578
    "undeservin",
3579
    "undeviatin",
3580
    "undoin",
3581
    "undressin",
3582
    "undulatin",
3583
    "undyin",
3584
    "unearthin",
3585
    "unendin",
3586
    "unerrin",
3587
    "unfailin",
3588
    "unfalterin",
3589
    "unfeelin",
3590
    "unflaggin",
3591
    "unflatterin",
3592
    "unflinchin",
3593
    "unfoldin",
3594
    "unforgivin",
3595
    "unheedin",
3596
    "unhesitatin",
3597
    "unifyin",
3598
    "uninterestin",
3599
    "uninvitin",
3600
    "unitin",
3601
    "universalizin",
3602
    "unknowin",
3603
    "unleashin",
3604
    "unloadin",
3605
    "unlockin",
3606
    "unlovin",
3607
    "unmaskin",
3608
    "unmeanin",
3609
    "unmovin",
3610
    "unnervin",
3611
    "unoffendin",
3612
    "unpackin",
3613
    "unpleasin",
3614
    "unpretendin",
3615
    "unpromisin",
3616
    "unquestionin",
3617
    "unravelin",
3618
    "unravellin",
3619
    "unreasonin",
3620
    "unrelentin",
3621
    "unremittin",
3622
    "unresistin",
3623
    "unrollin",
3624
    "unsatisfyin",
3625
    "unseein",
3626
    "unsettlin",
3627
    "unsmilin",
3628
    "unsparin",
3629
    "unsurprisin",
3630
    "unsuspectin",
3631
    "unswervin",
3632
    "unthinkin",
3633
    "untirin",
3634
    "untyin",
3635
    "unvaryin",
3636
    "unveilin",
3637
    "unwaverin",
3638
    "unwillin",
3639
    "unwindin",
3640
    "unwittin",
3641
    "unyieldin",
3642
    "upbraidin",
3643
    "upbringin",
3644
    "upbuildin",
3645
    "upcomin",
3646
    "updatin",
3647
    "upgradin",
3648
    "upholdin",
3649
    "upliftin",
3650
    "uploadin",
3651
    "uprisin",
3652
    "uprootin",
3653
    "upsettin",
3654
    "upstandin",
3655
    "upswin",
3656
    "upwellin",
3657
    "urgin",
3658
    "urinatin",
3659
    "usherin",
3660
    "usin",
3661
    "usurpin",
3662
    "utilisin",
3663
    "utilizin",
3664
    "utterin",
3665
    "vacatin",
3666
    "vacationin",
3667
    "vacillatin",
3668
    "vacuumin",
3669
    "validatin",
3670
    "valuin",
3671
    "vanishin",
3672
    "vanquishin",
3673
    "varyin",
3674
    "vaultin",
3675
    "vauntin",
3676
    "veerin",
3677
    "veilin",
3678
    "vendin",
3679
    "ventilatin",
3680
    "ventin",
3681
    "venturin",
3682
    "vergin",
3683
    "verifyin",
3684
    "versionin",
3685
    "vestin",
3686
    "vettin",
3687
    "vexin",
3688
    "vibratin",
3689
    "victuallin",
3690
    "viewin",
3691
    "vikin",
3692
    "vindicatin",
3693
    "vinin",
3694
    "violatin",
3695
    "visionin",
3696
    "visitin",
3697
    "visualizin",
3698
    "vitalizin",
3699
    "vivifyin",
3700
    "voicin",
3701
    "voidin",
3702
    "volunteerin",
3703
    "vomitin",
3704
    "votin",
3705
    "vowin",
3706
    "voyagin",
3707
    "vyin",
3708
    "wadin",
3709
    "waftin",
3710
    "waggin",
3711
    "wagin",
3712
    "wailin",
3713
    "waitin",
3714
    "waivin",
3715
    "wakin",
3716
    "walkin",
3717
    "wallowin",
3718
    "wanderin",
3719
    "wanin",
3720
    "wantin",
3721
    "warblin",
3722
    "wardin",
3723
    "warehousin",
3724
    "warin",
3725
    "warmin",
3726
    "warnin",
3727
    "warpin",
3728
    "warrin",
3729
    "washin",
3730
    "wastin",
3731
    "watchin",
3732
    "waterin",
3733
    "watermarkin",
3734
    "waverin",
3735
    "wavin",
3736
    "waxin",
3737
    "weakenin",
3738
    "weaklin",
3739
    "weanin",
3740
    "wearin",
3741
    "wearyin",
3742
    "weatherin",
3743
    "weavin",
3744
    "webbin",
3745
    "weddin",
3746
    "weedin",
3747
    "weepin",
3748
    "weighin",
3749
    "weightin",
3750
    "welcomin",
3751
    "weldin",
3752
    "wellbein",
3753
    "wellin",
3754
    "wettin",
3755
    "whackin",
3756
    "whalin",
3757
    "wheelin",
3758
    "wheezin",
3759
    "whimperin",
3760
    "whinin",
3761
    "whippin",
3762
    "whirlin",
3763
    "whirrin",
3764
    "whisperin",
3765
    "whistlin",
3766
    "whitenin",
3767
    "whitin",
3768
    "whizzin",
3769
    "whoopin",
3770
    "whoppin",
3771
    "widenin",
3772
    "wieldin",
3773
    "wildin",
3774
    "willin",
3775
    "wincin",
3776
    "windin",
3777
    "winkin",
3778
    "winnin",
3779
    "winterin",
3780
    "wipin",
3781
    "wirin",
3782
    "wishin",
3783
    "withdrawin",
3784
    "witherin",
3785
    "withholdin",
3786
    "withstandin",
3787
    "witnessin",
3788
    "wonderin",
3789
    "wooin",
3790
    "wordin",
3791
    "workin",
3792
    "worryin",
3793
    "worsenin",
3794
    "worshippin",
3795
    "woundin",
3796
    "wranglin",
3797
    "wrappin",
3798
    "wreckin",
3799
    "wrenchin",
3800
    "wrestlin",
3801
    "wrigglin",
3802
    "wringin",
3803
    "wrinklin",
3804
    "writhin",
3805
    "writin",
3806
    "wrongdoin",
3807
    "yachtin",
3808
    "yankin",
3809
    "yappin",
3810
    "yawnin",
3811
    "yearlin",
3812
    "yearnin",
3813
    "yellin",
3814
    "yellowin",
3815
    "yelpin",
3816
    "yieldin",
3817
    "zaggin",
3818
    "zeroin",
3819
    "zigzaggin",
3820
    "zippin",
3821
    "zonin",
3822
    "zoomin"
788 3823
  );
789 3824
}
M src/main/java/com/whitemagicsoftware/keenquotes/Lexeme.java
98 98
   * of the given {@link LexemeType}s.
99 99
   */
100
  public boolean anyType( final LexemeType... types ) {
100
  public boolean isType( final LexemeType... types ) {
101 101
    assert types != null;
102 102
...
128 128
  LexemeType getType() {
129 129
    return mType;
130
  }
131
132
  public boolean before( final Lexeme that ) {
133
    return compareTo( that ) < 0;
134
  }
135
136
  public boolean after( final Lexeme that ) {
137
    return compareTo( that ) > 0;
130 138
  }
131 139
M src/main/java/com/whitemagicsoftware/keenquotes/Parser.java
10 10
import static com.whitemagicsoftware.keenquotes.LexemeType.*;
11 11
import static com.whitemagicsoftware.keenquotes.TokenType.*;
12
13
/**
14
 * Converts straight double/single quotes and apostrophes to curly equivalents.
15
 */
16
public final class Parser {
17
  /**
18
   * Single quotes preceded by these {@link LexemeType}s may be opening quotes.
19
   */
20
  private static final LexemeType[] LEADING_QUOTE_OPENING_SINGLE =
21
    new LexemeType[]{SPACE, DASH, QUOTE_DOUBLE, OPENING_GROUP, EOL, EOP};
22
23
  /**
24
   * Single quotes succeeded by these {@link LexemeType}s may be opening quotes.
25
   */
26
  private static final LexemeType[] LAGGING_QUOTE_OPENING_SINGLE =
27
    new LexemeType[]{WORD, ELLIPSIS, QUOTE_SINGLE, QUOTE_DOUBLE};
28
29
  /**
30
   * Single quotes preceded by these {@link LexemeType}s may be closing quotes.
31
   */
32
  private static final LexemeType[] LEADING_QUOTE_CLOSING_SINGLE =
33
    new LexemeType[]{WORD, NUMBER, PERIOD, PUNCT, ELLIPSIS, QUOTE_DOUBLE};
34
35
  /**
36
   * Single quotes succeeded by these {@link LexemeType}s may be closing quotes.
37
   */
38
  private static final LexemeType[] LAGGING_QUOTE_CLOSING_SINGLE =
39
    new LexemeType[]{SPACE, HYPHEN, DASH,
40
      QUOTE_DOUBLE, CLOSING_GROUP, EOL, EOP};
41
42
  /**
43
   * Double quotes preceded by these {@link LexemeType}s may be opening quotes.
44
   */
45
  private static final LexemeType[] LEADING_QUOTE_OPENING_DOUBLE =
46
    new LexemeType[]{SPACE, DASH, EQUALS, QUOTE_SINGLE, OPENING_GROUP, EOL,
47
      EOP};
48
49
  /**
50
   * Double quotes succeeded by these {@link LexemeType}s may be opening quotes.
51
   */
52
  private static final LexemeType[] LAGGING_QUOTE_OPENING_DOUBLE =
53
    new LexemeType[]{WORD, NUMBER, ELLIPSIS, OPENING_GROUP,
54
      QUOTE_SINGLE, QUOTE_SINGLE_OPENING, QUOTE_SINGLE_CLOSING, QUOTE_DOUBLE};
55
56
  /**
57
   * Double quotes preceded by these {@link LexemeType}s may be closing quotes.
58
   */
59
  private static final LexemeType[] LEADING_QUOTE_CLOSING_DOUBLE =
60
    new LexemeType[]{WORD, NUMBER, PERIOD, PUNCT, DASH, ELLIPSIS, CLOSING_GROUP,
61
      QUOTE_SINGLE, QUOTE_SINGLE_CLOSING, QUOTE_SINGLE_OPENING};
62
63
  /**
64
   * Double quotes succeeded by these {@link LexemeType}s may be closing quotes.
65
   */
66
  private static final LexemeType[] LAGGING_QUOTE_CLOSING_DOUBLE =
67
    new LexemeType[]{SPACE, PUNCT, PERIOD, EQUALS, HYPHEN, DASH,
68
      QUOTE_SINGLE, CLOSING_GROUP, EOL, EOP};
69
70
  /**
71
   * The text to parse. A reference is required as a minor optimization in
72
   * memory and speed: the lexer records integer offsets, rather than new
73
   * {@link String} instances, to track parsed lexemes.
74
   */
75
  private final String mText;
76
77
  /**
78
   * Converts a string into an iterable list of {@link Lexeme} instances.
79
   */
80
  private final Lexer mLexer;
81
82
  /**
83
   * Sets of contractions that help disambiguate single quotes in the text.
84
   * These are effectively immutable while parsing.
85
   */
86
  private final Contractions sContractions;
87
88
  /**
89
   * Incremented for each opening single quote emitted. Used to help resolve
90
   * ambiguities when single quote marks are balanced.
91
   */
92
  private int mOpeningSingleQuote;
93
94
  /**
95
   * Incremented for each closing single quote emitted. Used to help resolve
96
   * ambiguities when single quote marks are balanced.
97
   */
98
  private int mClosingSingleQuote;
99
100
  /**
101
   * Constructs a new {@link Parser} using the default contraction sets
102
   * to help resolve some ambiguous scenarios.
103
   *
104
   * @param text         The prose to parse, containing zero or more quotation
105
   *                     characters.
106
   * @param contractions Custom sets of contractions to help resolve
107
   *                     ambiguities.
108
   */
109
  public Parser( final String text, final Contractions contractions ) {
110
    mText = text;
111
    mLexer = new Lexer( mText );
112
    sContractions = contractions;
113
  }
114
115
  /**
116
   * Iterates over the entire text provided at construction, emitting
117
   * {@link Token}s that can be used to convert straight quotes to curly
118
   * quotes.
119
   *
120
   * @param tokenConsumer Receives emitted {@link Token}s.
121
   */
122
  public void parse(
123
    final Consumer<Token> tokenConsumer,
124
    final Consumer<Lexeme> lexemeConsumer ) {
125
    final var lexemes = new CircularFifoQueue<Lexeme>( 3 );
126
127
    // Allow consuming the very first token without checking the queue size.
128
    flush( lexemes );
129
130
    final var unresolved = new ArrayList<Lexeme[]>();
131
    Lexeme lexeme;
132
133
    // Create and convert a list of all unambiguous quote characters.
134
    while( (lexeme = mLexer.next()) != EOT ) {
135
      if( tokenize( lexeme, lexemes, tokenConsumer, unresolved ) ) {
136
        // Attempt to resolve any remaining unambiguous quotes.
137
        resolve( unresolved, tokenConsumer );
138
139
        // Notify of any unambiguous quotes that could not be resolved.
140
        unresolved.forEach( ( lex ) -> lexemeConsumer.accept( lex[ 1 ] ) );
141
        unresolved.clear();
142
        mOpeningSingleQuote = 0;
143
        mClosingSingleQuote = 0;
144
      }
145
    }
146
147
    // By loop's end, the lexemes list contains tokens for all except the
148
    // final two elements (from tokenizing in triplets). Tokenize the remaining
149
    // unprocessed lexemes.
150
    tokenize( EOT, lexemes, tokenConsumer, unresolved );
151
    tokenize( EOT, lexemes, tokenConsumer, unresolved );
152
153
    // Attempt to resolve any remaining unambiguous quotes.
154
    resolve( unresolved, tokenConsumer );
155
156
    // Notify of any unambiguous quotes that could not be resolved.
157
    unresolved.forEach( ( lex ) -> lexemeConsumer.accept( lex[ 1 ] ) );
158
  }
159
160
  /**
161
   * Converts {@link Lexeme}s identified as straight quotes into {@link Token}s
162
   * that represent the curly equivalent. The {@link Token}s are passed to
163
   * the given {@link Consumer} for further processing (e.g., replaced in
164
   * the original text being parsed).
165
   *
166
   * @param lexeme     A part of the text being parsed.
167
   * @param lexemes    A 3-element queue of lexemes that provide sufficient
168
   *                   context to identify curly quotes.
169
   * @param consumer   Recipient of equivalent quotes.
170
   * @param unresolved Rolling list of potentially ambiguous {@link Lexeme}s
171
   *                   that could not be tokenized, yet.
172
   * @return {@code true} if an end-of-paragraph is detected.
173
   */
174
  private boolean tokenize( final Lexeme lexeme,
175
                            final CircularFifoQueue<Lexeme> lexemes,
176
                            final Consumer<Token> consumer,
177
                            final List<Lexeme[]> unresolved ) {
178
    // Add the next lexeme to tokenize into the queue for immediate processing.
179
    lexemes.add( lexeme );
180
181
    final var lex1 = lexemes.get( 0 );
182
    final var lex2 = lexemes.get( 1 );
183
    final var lex3 = lexemes.get( 2 );
184
185
    if( lex2.isType( QUOTE_SINGLE ) && lex3.isType( WORD ) &&
186
      lex1.anyType( WORD, PERIOD, NUMBER ) ) {
187
      // Examples: y'all, Ph.D.'ll, 20's, she's
188
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex2 ) );
189
    }
190
    else if( lex1.isType( QUOTE_SINGLE ) && lex3.isType( QUOTE_SINGLE ) &&
191
      "n".equalsIgnoreCase( lex2.toString( mText ) ) ) {
192
      // I.e., 'n'
193
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex1 ) );
194
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex3 ) );
195
      flush( lexemes );
196
      truncate( unresolved );
197
    }
198
    else if( lex2.isType( QUOTE_SINGLE ) && lex1.isType( NUMBER ) ) {
199
      if( lex3.isType( QUOTE_SINGLE ) ) {
200
        // E.g., 2''
201
        consumer.accept(
202
          new Token( QUOTE_PRIME_DOUBLE, lex2.began(), lex3.ended() ) );
203
        flush( lexemes );
204
      }
205
      else {
206
        // E.g., 2'
207
        consumer.accept( new Token( QUOTE_PRIME_SINGLE, lex2 ) );
208
      }
209
    }
210
    else if( lex2.isType( QUOTE_DOUBLE ) && lex1.isType( NUMBER ) ) {
211
      // E.g., 2"
212
      consumer.accept( new Token( QUOTE_PRIME_DOUBLE, lex2 ) );
213
    }
214
    else if( lex2.isType( WORD ) && lex3.isType( QUOTE_SINGLE ) &&
215
      sContractions.endedUnambiguously( lex2.toString( mText ) ) ) {
216
      // E.g., thinkin'
217
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex3 ) );
218
      flush( lexemes );
219
    }
220
    else if( lex2.isType( NUMBER ) && lex1.isType( QUOTE_SINGLE ) ) {
221
      if( lex3.anyType( SPACE, PUNCT ) || (lex3.isType( WORD ) &&
222
        lex3.toString( mText ).equalsIgnoreCase( "s" )) ) {
223
        // Sentences must re-written to avoid starting with numerals.
224
        // Examples: '20s, '02
225
        consumer.accept( new Token( QUOTE_APOSTROPHE, lex1 ) );
226
      }
227
      else {
228
        // E.g., '2''
229
        consumer.accept( new Token( QUOTE_OPENING_SINGLE, lex1 ) );
230
        mOpeningSingleQuote++;
231
      }
232
233
      truncate( unresolved );
234
    }
235
    else if( lex2.isType( QUOTE_SINGLE ) &&
236
      lex1.anyType( PUNCT, PERIOD, ELLIPSIS, DASH ) &&
237
      (lex3.anyType( EOL, EOP ) || lex3.isEot()) ) {
238
      consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
239
      mClosingSingleQuote++;
240
    }
241
    else if( lex1.isType( ESC_SINGLE ) ) {
242
      // E.g., \'
243
      consumer.accept( new Token( QUOTE_STRAIGHT_SINGLE, lex1 ) );
244
    }
245
    else if( lex1.isType( ESC_DOUBLE ) ) {
246
      // E.g., \"
247
      consumer.accept( new Token( QUOTE_STRAIGHT_DOUBLE, lex1 ) );
248
249
      if( lex2.isType( QUOTE_SINGLE ) &&
250
        (lex3.isEot() || lex3.anyType( SPACE, DASH, EOL, EOP )) ) {
251
        consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
252
        mClosingSingleQuote++;
253
      }
254
    }
255
    else if( lex2.isType( QUOTE_DOUBLE ) &&
256
      (lex1.isSot() || lex1.anyType( LEADING_QUOTE_OPENING_DOUBLE )) &&
257
      lex3.anyType( LAGGING_QUOTE_OPENING_DOUBLE ) ) {
258
      // Examples: "", "..., "word, ---"word
259
      consumer.accept( new Token( QUOTE_OPENING_DOUBLE, lex2 ) );
260
    }
261
    else if( lex2.isType( QUOTE_DOUBLE ) &&
262
      lex1.anyType( LEADING_QUOTE_CLOSING_DOUBLE ) &&
263
      (lex3.isEot() || lex3.anyType( LAGGING_QUOTE_CLOSING_DOUBLE )) ) {
264
      // Examples: ..."', word"', ?"', word"?
265
      consumer.accept( new Token( QUOTE_CLOSING_DOUBLE, lex2 ) );
266
    }
267
    else if( lex1.isType( QUOTE_SINGLE ) &&
268
      lex2.anyType( PUNCT, PERIOD, DASH ) && lex3.isType( QUOTE_DOUBLE ) ) {
269
      // E.g., '," (contraction ruled out from previous conditionals)
270
      consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex1 ) );
271
      truncate( unresolved );
272
      mClosingSingleQuote++;
273
    }
274
    else if( lex2.anyType( QUOTE_SINGLE, QUOTE_DOUBLE ) ) {
275
      // After tokenizing, the parser will attempt to resolve ambiguities.
276
      unresolved.add( new Lexeme[]{lex1, lex2, lex3} );
277
    }
278
279
    // Suggest to the caller that resolution should be performed. This allows
280
    // the algorithm to reset the opening/closing quote balance before the
281
    // next paragraph is parsed.
282
    return lex3.isType( EOP );
283
  }
284
285
  private void resolve(
286
    final List<Lexeme[]> unresolved, final Consumer<Token> consumer ) {
287
    // Some non-emitted tokenized lexemes may be ambiguous.
288
    final var ambiguousLeadingQuotes = new ArrayList<Lexeme[]>( 16 );
289
    final var ambiguousLaggingQuotes = new ArrayList<Lexeme[]>( 16 );
290
    var resolvedLeadingQuotes = 0;
291
    var resolvedLaggingQuotes = 0;
292
293
    // Count the number of ambiguous and non-ambiguous open single quotes.
294
    for( var i = unresolved.iterator(); i.hasNext(); ) {
295
      final var quotes = i.next();
296
      final var lex1 = quotes[ 0 ];
297
      final var lex2 = quotes[ 1 ];
298
      final var lex3 = quotes[ 2 ];
299
300
      if( lex2.isType( QUOTE_SINGLE ) ) {
301
        final var word1 = lex1 == SOT ? "" : lex1.toString( mText );
302
        final var word3 = lex3 == EOT ? "" : lex3.toString( mText );
303
304
        if( sContractions.beganAmbiguously( word3 ) ) {
305
          // E.g., 'Cause
306
          if( lex1.isType( QUOTE_SINGLE ) ) {
307
            // E.g., ''Cause
308
            consumer.accept( new Token( QUOTE_APOSTROPHE, lex2 ) );
309
            i.remove();
310
          }
311
          else {
312
            // The contraction is uncertain until a closing quote is found that
313
            // may balance this single quote.
314
            ambiguousLeadingQuotes.add( quotes );
315
          }
316
        }
317
        else if( sContractions.beganUnambiguously( word3 ) ) {
318
          // The quote mark forms a word that does not stand alone from its
319
          // contraction. For example, twas is not a word: it's 'twas.
320
          consumer.accept( new Token( QUOTE_APOSTROPHE, lex2 ) );
321
          i.remove();
322
        }
323
        else if( sContractions.endedAmbiguously( word1 ) ) {
324
          ambiguousLaggingQuotes.add( quotes );
325
        }
326
        else if( (lex1.isSot() || lex1.anyType( LEADING_QUOTE_OPENING_SINGLE ))
327
          && lex3.anyType( LAGGING_QUOTE_OPENING_SINGLE ) ) {
328
          consumer.accept( new Token( QUOTE_OPENING_SINGLE, lex2 ) );
329
          resolvedLeadingQuotes++;
330
          mOpeningSingleQuote++;
331
          i.remove();
332
        }
333
        else if( lex1.anyType( LEADING_QUOTE_CLOSING_SINGLE ) &&
334
          (lex3.isEot() || lex3.anyType( LAGGING_QUOTE_CLOSING_SINGLE )) ) {
335
          consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
336
          resolvedLaggingQuotes++;
337
          mClosingSingleQuote++;
338
          i.remove();
339
        }
340
        else if( lex3.isType( NUMBER ) ) {
341
          // E.g., '04
342
          ambiguousLeadingQuotes.add( quotes );
343
        }
344
      }
345
    }
346
347
    final var ambiguousLeadingCount = ambiguousLeadingQuotes.size();
348
    final var ambiguousLaggingCount = ambiguousLaggingQuotes.size();
349
350
    if( resolvedLeadingQuotes == 1 && resolvedLaggingQuotes == 0 ) {
351
      if( ambiguousLeadingCount == 0 && ambiguousLaggingCount == 1 ) {
352
        final var balanced = mClosingSingleQuote - mOpeningSingleQuote == 0;
353
        final var quote = balanced ? QUOTE_APOSTROPHE : QUOTE_CLOSING_SINGLE;
354
        final var lex = ambiguousLaggingQuotes.get( 0 );
355
        consumer.accept( new Token( quote, lex[ 1 ] ) );
356
        unresolved.remove( lex );
357
      }
358
      else if( ambiguousLeadingCount == 0 && unresolved.size() == 1 ) {
359
        // Must be a closing quote.
360
        final var closing = unresolved.get( 0 );
361
        consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing[ 1 ] ) );
362
        unresolved.remove( closing );
363
      }
364
    }
365
    else if( ambiguousLeadingCount == 0 && ambiguousLaggingCount > 0 ) {
366
      // If there are no ambiguous leading quotes then all ambiguous lagging
367
      // quotes must be contractions.
368
      ambiguousLaggingQuotes.forEach(
369
        lex -> {
370
          consumer.accept( new Token( QUOTE_APOSTROPHE, lex[ 1 ] ) );
371
          unresolved.remove( lex );
372
        }
373
      );
374
    }
375
    else if( ambiguousLeadingCount == 0 ) {
376
      if( resolvedLaggingQuotes < resolvedLeadingQuotes ) {
377
        for( final var i = unresolved.iterator(); i.hasNext(); ) {
378
          final var closing = i.next()[ 1 ];
379
          consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing ) );
380
          i.remove();
381
        }
382
      }
383
      else if( mOpeningSingleQuote - mClosingSingleQuote == unresolved.size() ) {
384
        for( final var i = unresolved.iterator(); i.hasNext(); ) {
385
          final var closing = i.next();
386
          consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing[ 1 ] ) );
387
          i.remove();
388
        }
389
      }
390
      else if( unresolved.size() == 2 ) {
391
        final var closing = unresolved.get( 0 );
392
        final var opening = unresolved.get( 1 );
393
        consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing[ 1 ] ) );
394
        consumer.accept( new Token( QUOTE_OPENING_SINGLE, opening[ 1 ] ) );
395
396
        // Doesn't affect the algorithm.
397
        unresolved.clear();
12
import static java.lang.Math.abs;
13
import static java.util.Collections.sort;
14
15
/**
16
 * Converts straight double/single quotes and apostrophes to curly equivalents.
17
 */
18
public final class Parser {
19
  /**
20
   * Single quotes preceded by these {@link LexemeType}s may be opening quotes.
21
   */
22
  private static final LexemeType[] LEADING_QUOTE_OPENING_SINGLE =
23
    new LexemeType[]{SPACE, DASH, QUOTE_DOUBLE, OPENING_GROUP, EOL, EOP};
24
25
  /**
26
   * Single quotes succeeded by these {@link LexemeType}s may be opening quotes.
27
   */
28
  private static final LexemeType[] LAGGING_QUOTE_OPENING_SINGLE =
29
    new LexemeType[]{WORD, ELLIPSIS, QUOTE_SINGLE, QUOTE_DOUBLE};
30
31
  /**
32
   * Single quotes preceded by these {@link LexemeType}s may be closing quotes.
33
   */
34
  private static final LexemeType[] LEADING_QUOTE_CLOSING_SINGLE =
35
    new LexemeType[]{WORD, NUMBER, PERIOD, PUNCT, ELLIPSIS, QUOTE_DOUBLE};
36
37
  /**
38
   * Single quotes succeeded by these {@link LexemeType}s may be closing quotes.
39
   */
40
  private static final LexemeType[] LAGGING_QUOTE_CLOSING_SINGLE =
41
    new LexemeType[]{SPACE, HYPHEN, DASH,
42
      QUOTE_DOUBLE, CLOSING_GROUP, EOL, EOP};
43
44
  /**
45
   * Double quotes preceded by these {@link LexemeType}s may be opening quotes.
46
   */
47
  private static final LexemeType[] LEADING_QUOTE_OPENING_DOUBLE =
48
    new LexemeType[]{SPACE, DASH, EQUALS, QUOTE_SINGLE, OPENING_GROUP, EOL,
49
      EOP};
50
51
  /**
52
   * Double quotes succeeded by these {@link LexemeType}s may be opening quotes.
53
   */
54
  private static final LexemeType[] LAGGING_QUOTE_OPENING_DOUBLE =
55
    new LexemeType[]{WORD, NUMBER, ELLIPSIS, OPENING_GROUP,
56
      QUOTE_SINGLE, QUOTE_SINGLE_OPENING, QUOTE_SINGLE_CLOSING, QUOTE_DOUBLE};
57
58
  /**
59
   * Double quotes preceded by these {@link LexemeType}s may be closing quotes.
60
   */
61
  private static final LexemeType[] LEADING_QUOTE_CLOSING_DOUBLE =
62
    new LexemeType[]{WORD, NUMBER, PERIOD, PUNCT, DASH, ELLIPSIS, CLOSING_GROUP,
63
      QUOTE_SINGLE, QUOTE_SINGLE_CLOSING, QUOTE_SINGLE_OPENING};
64
65
  /**
66
   * Double quotes succeeded by these {@link LexemeType}s may be closing quotes.
67
   */
68
  private static final LexemeType[] LAGGING_QUOTE_CLOSING_DOUBLE =
69
    new LexemeType[]{SPACE, PUNCT, PERIOD, EQUALS, HYPHEN, DASH,
70
      QUOTE_SINGLE, CLOSING_GROUP, EOL, EOP};
71
72
  /**
73
   * The text to parse. A reference is required as a minor optimization in
74
   * memory and speed: the lexer records integer offsets, rather than new
75
   * {@link String} instances, to track parsed lexemes.
76
   */
77
  private final String mText;
78
79
  /**
80
   * Converts a string into an iterable list of {@link Lexeme} instances.
81
   */
82
  private final Lexer mLexer;
83
84
  /**
85
   * Sets of contractions that help disambiguate single quotes in the text.
86
   * These are effectively immutable while parsing.
87
   */
88
  private final Contractions sContractions;
89
90
  /**
91
   * Contains each emitted opening single quote per paragraph.
92
   */
93
  private final List<Lexeme> mOpeningSingleQuotes = new ArrayList<>();
94
95
  /**
96
   * Contains each emitted closing single quote per paragraph.
97
   */
98
  private final List<Lexeme> mClosingSingleQuotes = new ArrayList<>();
99
100
  /**
101
   * Contains each emitted opening double quote per paragraph.
102
   */
103
  private final List<Lexeme> mOpeningDoubleQuotes = new ArrayList<>();
104
105
  /**
106
   * Contains each emitted closing double quote per paragraph.
107
   */
108
  private final List<Lexeme> mClosingDoubleQuotes = new ArrayList<>();
109
110
  /**
111
   * Constructs a new {@link Parser} using the default contraction sets
112
   * to help resolve some ambiguous scenarios.
113
   *
114
   * @param text         The prose to parse, containing zero or more quotation
115
   *                     characters.
116
   * @param contractions Custom sets of contractions to help resolve
117
   *                     ambiguities.
118
   */
119
  public Parser( final String text, final Contractions contractions ) {
120
    mText = text;
121
    mLexer = new Lexer( mText );
122
    sContractions = contractions;
123
  }
124
125
  /**
126
   * Iterates over the entire text provided at construction, emitting
127
   * {@link Token}s that can be used to convert straight quotes to curly
128
   * quotes.
129
   *
130
   * @param tokenConsumer Receives emitted {@link Token}s.
131
   */
132
  public void parse(
133
    final Consumer<Token> tokenConsumer,
134
    final Consumer<Lexeme> lexemeConsumer ) {
135
    final var lexemes = new CircularFifoQueue<Lexeme>( 3 );
136
137
    // Allow consuming the very first token without needing a queue size check.
138
    flush( lexemes );
139
140
    final var unresolved = new ArrayList<Lexeme[]>();
141
    Lexeme lexeme;
142
143
    // Create and convert a list of all unambiguous quote characters.
144
    while( (lexeme = mLexer.next()) != EOT ) {
145
      // Reset after tokenizing a paragraph.
146
      if( tokenize( lexeme, lexemes, tokenConsumer, unresolved ) ) {
147
        // Attempt to resolve any remaining unambiguous quotes.
148
        resolve( unresolved, tokenConsumer );
149
150
        // Notify of any unambiguous quotes that could not be resolved.
151
        unresolved.forEach( ( lex ) -> lexemeConsumer.accept( lex[ 1 ] ) );
152
        unresolved.clear();
153
        mOpeningSingleQuotes.clear();
154
        mClosingSingleQuotes.clear();
155
        mOpeningDoubleQuotes.clear();
156
        mClosingDoubleQuotes.clear();
157
      }
158
    }
159
160
    // By loop's end, the lexemes list contains tokens for all except the
161
    // final two elements (from tokenizing in triplets). Tokenize the remaining
162
    // unprocessed lexemes.
163
    tokenize( EOT, lexemes, tokenConsumer, unresolved );
164
    tokenize( EOT, lexemes, tokenConsumer, unresolved );
165
166
    // Attempt to resolve any remaining unambiguous quotes.
167
    resolve( unresolved, tokenConsumer );
168
169
    // Notify of any unambiguous quotes that could not be resolved.
170
    unresolved.forEach( ( lex ) -> lexemeConsumer.accept( lex[ 1 ] ) );
171
  }
172
173
  /**
174
   * Converts {@link Lexeme}s identified as straight quotes into {@link Token}s
175
   * that represent the curly equivalent. The {@link Token}s are passed to
176
   * the given {@link Consumer} for further processing (e.g., replaced in
177
   * the original text being parsed).
178
   *
179
   * @param lexeme     A part of the text being parsed.
180
   * @param lexemes    A 3-element queue of lexemes that provide sufficient
181
   *                   context to identify curly quotes.
182
   * @param consumer   Recipient of equivalent quotes.
183
   * @param unresolved Rolling list of potentially ambiguous {@link Lexeme}s
184
   *                   that could not be tokenized, yet.
185
   * @return {@code true} if an end-of-paragraph is detected.
186
   */
187
  private boolean tokenize( final Lexeme lexeme,
188
                            final CircularFifoQueue<Lexeme> lexemes,
189
                            final Consumer<Token> consumer,
190
                            final List<Lexeme[]> unresolved ) {
191
    // Add the next lexeme to tokenize into the queue for immediate processing.
192
    lexemes.add( lexeme );
193
194
    final var lex1 = lexemes.get( 0 );
195
    final var lex2 = lexemes.get( 1 );
196
    final var lex3 = lexemes.get( 2 );
197
198
    if( lex2.isType( QUOTE_SINGLE ) && lex3.isType( WORD ) &&
199
      lex1.isType( WORD, PERIOD, NUMBER ) ) {
200
      // Examples: y'all, Ph.D.'ll, 20's, she's
201
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex2 ) );
202
    }
203
    else if( lex1.isType( QUOTE_SINGLE ) && lex3.isType( QUOTE_SINGLE ) &&
204
      "n".equalsIgnoreCase( lex2.toString( mText ) ) ) {
205
      // I.e., 'n'
206
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex1 ) );
207
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex3 ) );
208
      flush( lexemes );
209
      truncate( unresolved );
210
    }
211
    else if( lex2.isType( QUOTE_SINGLE ) && lex1.isType( NUMBER ) ) {
212
      if( lex3.isType( QUOTE_SINGLE ) ) {
213
        // E.g., 2''
214
        consumer.accept(
215
          new Token( QUOTE_PRIME_DOUBLE, lex2.began(), lex3.ended() ) );
216
        flush( lexemes );
217
      }
218
      else {
219
        // E.g., 2'
220
        consumer.accept( new Token( QUOTE_PRIME_SINGLE, lex2 ) );
221
      }
222
    }
223
    else if( lex2.isType( QUOTE_DOUBLE ) && lex1.isType( NUMBER ) ) {
224
      // E.g., 2"
225
      consumer.accept( new Token( QUOTE_PRIME_DOUBLE, lex2 ) );
226
    }
227
    else if( lex2.isType( WORD ) && lex3.isType( QUOTE_SINGLE ) &&
228
      sContractions.endedUnambiguously( lex2.toString( mText ) ) ) {
229
      // E.g., thinkin'
230
      consumer.accept( new Token( QUOTE_APOSTROPHE, lex3 ) );
231
      flush( lexemes );
232
    }
233
    else if( lex2.isType( NUMBER ) && lex1.isType( QUOTE_SINGLE ) ) {
234
      // Sentences must re-written to avoid starting with numerals.
235
      if( lex3.isType( SPACE, PUNCT ) || (lex3.isType( WORD ) &&
236
        lex3.toString( mText ).equalsIgnoreCase( "s" )) ) {
237
        // Examples: '20s, '02
238
        consumer.accept( new Token( QUOTE_APOSTROPHE, lex1 ) );
239
      }
240
      else {
241
        // E.g., '2''
242
        consumer.accept( new Token( QUOTE_OPENING_SINGLE, lex1 ) );
243
        mOpeningSingleQuotes.add( lex1 );
244
      }
245
246
      truncate( unresolved );
247
    }
248
    else if( lex2.isType( QUOTE_SINGLE ) &&
249
      lex1.isType( PUNCT, PERIOD, ELLIPSIS, DASH ) &&
250
      (lex3.isType( EOL, EOP ) || lex3.isEot()) ) {
251
      consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
252
      mClosingSingleQuotes.add( lex2 );
253
    }
254
    else if( lex1.isType( ESC_SINGLE ) ) {
255
      // E.g., \'
256
      consumer.accept( new Token( QUOTE_STRAIGHT_SINGLE, lex1 ) );
257
    }
258
    else if( lex1.isType( ESC_DOUBLE ) ) {
259
      // E.g., \"
260
      consumer.accept( new Token( QUOTE_STRAIGHT_DOUBLE, lex1 ) );
261
262
      if( lex2.isType( QUOTE_SINGLE ) &&
263
        (lex3.isEot() || lex3.isType( SPACE, DASH, EOL, EOP )) ) {
264
        consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
265
        mClosingSingleQuotes.add( lex2 );
266
      }
267
    }
268
    else if( lex2.isType( QUOTE_DOUBLE ) &&
269
      (lex1.isSot() || lex1.isType( LEADING_QUOTE_OPENING_DOUBLE )) &&
270
      lex3.isType( LAGGING_QUOTE_OPENING_DOUBLE ) ) {
271
      // Examples: "", "..., "word, ---"word
272
      consumer.accept( new Token( QUOTE_OPENING_DOUBLE, lex2 ) );
273
      mOpeningDoubleQuotes.add( lex2 );
274
    }
275
    else if( lex2.isType( QUOTE_DOUBLE ) &&
276
      lex1.isType( LEADING_QUOTE_CLOSING_DOUBLE ) &&
277
      (lex3.isEot() || lex3.isType( LAGGING_QUOTE_CLOSING_DOUBLE )) ) {
278
      // Examples: ..."', word"', ?"', word"?
279
      consumer.accept( new Token( QUOTE_CLOSING_DOUBLE, lex2 ) );
280
      mClosingDoubleQuotes.add( lex2 );
281
    }
282
    else if( lex1.isType( WORD ) && lex2.isType( QUOTE_SINGLE ) &&
283
      lex3.isType( PUNCT, PERIOD ) ) {
284
      // E.g., word', (contraction ruled out by previous conditions)
285
      consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
286
      mClosingSingleQuotes.add( lex2 );
287
    }
288
    else if( lex2.isType( QUOTE_SINGLE, QUOTE_DOUBLE ) ) {
289
      // After tokenizing, the parser will attempt to resolve ambiguities.
290
      unresolved.add( new Lexeme[]{lex1, lex2, lex3} );
291
    }
292
293
    // Suggest to the caller that resolution should be performed. This allows
294
    // the algorithm to reset the opening/closing quote balance before the
295
    // next paragraph is parsed.
296
    return lex3.isType( EOP );
297
  }
298
299
  private void resolve(
300
    final List<Lexeme[]> unresolved, final Consumer<Token> consumer ) {
301
    // Some non-emitted tokenized lexemes may be ambiguous.
302
    final var ambiguousLeadingQuotes = new ArrayList<Lexeme[]>( 16 );
303
    final var ambiguousLaggingQuotes = new ArrayList<Lexeme[]>( 16 );
304
    var resolvedLeadingQuotes = 0;
305
    var resolvedLaggingQuotes = 0;
306
307
    // Count the number of ambiguous and non-ambiguous open single quotes.
308
    for( var i = unresolved.iterator(); i.hasNext(); ) {
309
      final var quotes = i.next();
310
      final var lex1 = quotes[ 0 ];
311
      final var lex2 = quotes[ 1 ];
312
      final var lex3 = quotes[ 2 ];
313
314
      if( lex2.isType( QUOTE_SINGLE ) ) {
315
        final var word1 = lex1 == SOT ? "" : lex1.toString( mText );
316
        final var word3 = lex3 == EOT ? "" : lex3.toString( mText );
317
318
        if( sContractions.beganAmbiguously( word3 ) ) {
319
          // E.g., 'Cause
320
          if( lex1.isType( QUOTE_SINGLE ) ) {
321
            // E.g., ''Cause
322
            consumer.accept( new Token( QUOTE_APOSTROPHE, lex2 ) );
323
            i.remove();
324
          }
325
          else {
326
            // The contraction is uncertain until a closing quote is found that
327
            // may balance this single quote.
328
            ambiguousLeadingQuotes.add( quotes );
329
          }
330
        }
331
        else if( sContractions.beganUnambiguously( word3 ) ) {
332
          // The quote mark forms a word that does not stand alone from its
333
          // contraction. For example, twas is not a word: it's 'twas.
334
          consumer.accept( new Token( QUOTE_APOSTROPHE, lex2 ) );
335
          i.remove();
336
        }
337
        else if( sContractions.endedAmbiguously( word1 ) ) {
338
          ambiguousLaggingQuotes.add( quotes );
339
        }
340
        else if( (lex1.isSot() || lex1.isType( LEADING_QUOTE_OPENING_SINGLE )) &&
341
          lex3.isType( LAGGING_QUOTE_OPENING_SINGLE ) ) {
342
          consumer.accept( new Token( QUOTE_OPENING_SINGLE, lex2 ) );
343
          resolvedLeadingQuotes++;
344
          mOpeningSingleQuotes.add( lex2 );
345
          i.remove();
346
        }
347
        else if( lex1.isType( LEADING_QUOTE_CLOSING_SINGLE ) &&
348
          (lex3.isEot() || lex3.isType( LAGGING_QUOTE_CLOSING_SINGLE )) ) {
349
          consumer.accept( new Token( QUOTE_CLOSING_SINGLE, lex2 ) );
350
          resolvedLaggingQuotes++;
351
          mClosingSingleQuotes.add( lex2 );
352
          i.remove();
353
        }
354
        else if( lex3.isType( NUMBER ) ) {
355
          // E.g., '04
356
          ambiguousLeadingQuotes.add( quotes );
357
        }
358
      }
359
    }
360
361
    sort( mOpeningSingleQuotes );
362
    sort( mClosingSingleQuotes );
363
    sort( mOpeningDoubleQuotes );
364
    sort( mClosingDoubleQuotes );
365
366
    final var singleQuoteEmpty =
367
      mOpeningSingleQuotes.isEmpty() || mClosingSingleQuotes.isEmpty();
368
    final var doubleQuoteEmpty =
369
      mOpeningDoubleQuotes.isEmpty() || mClosingDoubleQuotes.isEmpty();
370
371
    final var singleQuoteDelta = abs(
372
      mClosingSingleQuotes.size() - mOpeningSingleQuotes.size()
373
    );
374
375
    final var doubleQuoteDelta = abs(
376
      mClosingDoubleQuotes.size() - mOpeningDoubleQuotes.size()
377
    );
378
379
    final var ambiguousLeadingCount = ambiguousLeadingQuotes.size();
380
    final var ambiguousLaggingCount = ambiguousLaggingQuotes.size();
381
382
    if( resolvedLeadingQuotes == 1 && resolvedLaggingQuotes == 0 ) {
383
      if( ambiguousLeadingCount == 0 && ambiguousLaggingCount == 1 ) {
384
        final var balanced = singleQuoteDelta == 0;
385
        final var quote = balanced ? QUOTE_APOSTROPHE : QUOTE_CLOSING_SINGLE;
386
        final var lex = ambiguousLaggingQuotes.get( 0 );
387
        consumer.accept( new Token( quote, lex[ 1 ] ) );
388
        unresolved.remove( lex );
389
      }
390
      else if( ambiguousLeadingCount == 0 && unresolved.size() == 1 ) {
391
        // Must be a closing quote.
392
        final var closing = unresolved.get( 0 );
393
        consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing[ 1 ] ) );
394
        unresolved.remove( closing );
395
      }
396
    }
397
    else if( ambiguousLeadingCount == 0 && ambiguousLaggingCount > 0 ) {
398
      // If there are no ambiguous leading quotes then all ambiguous lagging
399
      // quotes must be contractions.
400
      ambiguousLaggingQuotes.forEach(
401
        lex -> {
402
          consumer.accept( new Token( QUOTE_APOSTROPHE, lex[ 1 ] ) );
403
          unresolved.remove( lex );
404
        }
405
      );
406
    }
407
    else if( mOpeningSingleQuotes.size() == 0 && mClosingSingleQuotes.size() == 1 ) {
408
      final var opening = unresolved.get( 0 );
409
      consumer.accept( new Token( QUOTE_OPENING_SINGLE, opening[ 1 ] ) );
410
      unresolved.remove( opening );
411
    }
412
    else if( ambiguousLeadingCount == 0 ) {
413
      if( resolvedLaggingQuotes < resolvedLeadingQuotes ) {
414
        for( final var i = unresolved.iterator(); i.hasNext(); ) {
415
          final var closing = i.next()[ 1 ];
416
          consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing ) );
417
          i.remove();
418
        }
419
      }
420
      else if( singleQuoteDelta == unresolved.size() ) {
421
        for( final var i = unresolved.iterator(); i.hasNext(); ) {
422
          final var closing = i.next();
423
          consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing[ 1 ] ) );
424
          i.remove();
425
        }
426
      }
427
      else if( unresolved.size() == 2 ) {
428
        final var closing = unresolved.get( 0 );
429
        final var opening = unresolved.get( 1 );
430
        consumer.accept( new Token( QUOTE_CLOSING_SINGLE, closing[ 1 ] ) );
431
        consumer.accept( new Token( QUOTE_OPENING_SINGLE, opening[ 1 ] ) );
432
433
        // Doesn't affect the algorithm.
434
        unresolved.clear();
435
      }
436
    }
437
    else if( (singleQuoteDelta == 0 && !singleQuoteEmpty) ||
438
      (doubleQuoteDelta == 0 && !doubleQuoteEmpty) ) {
439
      // An apostrophe stands betwixt opening/closing single quotes.
440
      for( final var lexemes = unresolved.iterator(); lexemes.hasNext(); ) {
441
        final var quote = lexemes.next()[ 1 ];
442
443
        for( int i = 0; i < mOpeningSingleQuotes.size(); i++ ) {
444
          // An apostrophe must fall between an open/close pair.
445
          final var openingQuote = mOpeningSingleQuotes.get( i );
446
          final var closingQuote = mClosingSingleQuotes.get( i );
447
448
          if( openingQuote.before( quote ) && closingQuote.after( quote ) ) {
449
            consumer.accept( new Token( QUOTE_APOSTROPHE, quote ) );
450
            lexemes.remove();
451
          }
452
        }
453
      }
454
455
      // An apostrophe stands betwixt opening/closing double quotes.
456
      for( final var lexemes = unresolved.iterator(); lexemes.hasNext(); ) {
457
        final var quote = lexemes.next()[ 1 ];
458
459
        for( int i = 0; i < mOpeningDoubleQuotes.size(); i++ ) {
460
          // An apostrophe must fall between an open/close pair.
461
          final var openingQuote = mOpeningDoubleQuotes.get( i );
462
          final var closingQuote = mClosingDoubleQuotes.get( i );
463
464
          if( openingQuote.before( quote ) && closingQuote.after( quote ) ) {
465
            consumer.accept( new Token( QUOTE_APOSTROPHE, quote ) );
466
            lexemes.remove();
467
          }
468
        }
398 469
      }
399 470
    }
M src/test/java/com/whitemagicsoftware/keenquotes/KeenQuotesTest.java
29 29
    final var converter = new Converter( out::println );
30 30
    out.println( converter.apply(
31
      "\"’Kearney lives on the banks of Killarney—’"
31
      "'A', 'B', and 'C' are letters."
32 32
    ) );
33 33
  }
M src/test/resources/com/whitemagicsoftware/keenquotes/smartypants.txt
167 167
&ldquo;&apos;Twas, t&apos;wasn&apos;t thy name, &apos;twas it?&rdquo; said Jim &ldquo;the Barber&rdquo; Brown.
168 168
169
"'I'm in danger. Help? Take me to--' an address on Van Ness Avenue.
170
&ldquo;&lsquo;I&apos;m in danger. Help? Take me to--&rsquo; an address on Van Ness Avenue.
169
"'I'm in danger. Help? Take me to'--an address on Van Ness Avenue.
170
&ldquo;&lsquo;I&apos;m in danger. Help? Take me to&rsquo;--an address on Van Ness Avenue.
171 171
172 172
"Ah," she said, "you knew! He told you--and you said 'my dear'! How could you?!"
...
185 185
&ldquo;She said, &lsquo;That&apos;s Sam&apos;s&rsquo;,&rdquo; said the Sams&apos; cat.
186 186
187
"'Jane said, ''E'll be spooky, Sam's son with the jack-o'-lantern!'" said the O'Mally twins'---y'know---ghosts in unison.
188
&ldquo;&lsquo;Jane said, &lsquo;&apos;E&apos;ll be spooky, Sam&apos;s son with the jack-o&apos;-lantern!&rsquo;&rdquo; said the O&apos;Mally twins&apos;---y&apos;know---ghosts in unison.
187
"Jane said, ''E'll be spooky, Sam's son with the jack-o'-lantern!'" said the O'Mally twins'---y'know---ghosts in unison.
188
&ldquo;Jane said, &lsquo;&apos;E&apos;ll be spooky, Sam&apos;s son with the jack-o&apos;-lantern!&rsquo;&rdquo; said the O&apos;Mally twins&apos;---y&apos;know---ghosts in unison.
189 189
190 190
'He's at Sam's'
...
250 250
''Sup, Doc?'
251 251
&lsquo;&apos;Sup, Doc?&rsquo;
252
253
'Wouldn't 'a brushed a fly off the top twig,' exclaimed Ashbrook,
254
&lsquo;Wouldn&apos;t &apos;a brushed a fly off the top twig,&rsquo; exclaimed Ashbrook,
255
256
"But ye've been 'nation quiet all the day though," said the lad...
257
&ldquo;But ye&apos;ve been &apos;nation quiet all the day though,&rdquo; said the lad...
252 258
253 259
# ########################################################################
...
262 268
'Bout that time I says, 'Boys! I been thinkin' 'bout th' Universe.'
263 269
'Bout that time I says, &lsquo;Boys! I been thinkin&apos; 'bout th&apos; Universe.&rsquo;
270
271
"Jarvis, sir? Why, him as 'listed some years ago, and fought under
272
&ldquo;Jarvis, sir? Why, him as 'listed some years ago, and fought under
264 273