migrate keymaps to external userspace
Some checks are pending
Build QMK firmware / QMK Userspace Build (push) Waiting to run
Build QMK firmware / QMK Userspace Publish (push) Blocked by required conditions

This commit is contained in:
♥ Minnie ♥ 2025-05-13 18:29:00 +08:00
parent 41ee8332d1
commit 1aae18be19
Signed by: jasmine
GPG key ID: 8563E358D4E8040E
15 changed files with 3692 additions and 52 deletions

808
features/autocorrect_data.h Normal file
View file

@ -0,0 +1,808 @@
// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
/*******************************************************************************
88888888888 888 d8b .d888 d8b 888 d8b
888 888 Y8P d88P" Y8P 888 Y8P
888 888 888 888
888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b
888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K
888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b.
888 888 888 888 X88 888 888 888 Y8b. 888 X88
888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P'
888 888
888 888
888 888
.d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888
d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888
888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888
Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888
"Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888
888
Y8b d88P
"Y88P"
*******************************************************************************/
#pragma once
// Autocorrection dictionary (400 entries):
// :htere -> there
// abbout -> about
// abotu -> about
// baout -> about
// :theri -> their
// :thier -> their
// :owudl -> would
// woudl -> would
// peaple -> people
// peolpe -> people
// peopel -> people
// poeple -> people
// poeople -> people
// :hwihc -> which
// whcih -> which
// whihc -> which
// whlch -> which
// wihch -> which
// coudl -> could
// :htikn -> think
// :htink -> think
// thikn -> think
// thiunk -> think
// tihkn -> think
// :olther -> other
// :otehr -> other
// baceause -> because
// beacuse -> because
// becasue -> because
// beccause -> because
// becouse -> because
// becuase -> because
// theese -> these
// :goign -> going
// :gonig -> going
// :yaers -> years
// :yeasr -> years
// :thsoe -> those
// shoudl -> should
// raelly -> really
// realy -> really
// relaly -> really
// bedore -> before
// befoer -> before
// littel -> little
// beeing -> being
// :hwile -> while
// aroud -> around
// arround -> around
// arund -> around
// thign -> thing
// thigsn -> things
// thnigs -> things
// anohter -> another
// beteen -> between
// beween -> between
// bewteen -> between
// :eveyr -> every
// :graet -> great
// :agian -> again
// :sicne -> since
// alwasy -> always
// alwyas -> always
// throught -> thought
// :acheiv -> achiev
// almsot -> almost
// alomst -> almost
// chnage -> change
// chekc -> check
// childen -> children
// claer -> clear
// comapny -> company
// contian -> contain
// elasped -> elapsed
// feild -> field
// fitler -> filter
// firts -> first
// follwo -> follow
// :foudn -> found
// frequecy -> frequency
// firend -> friend
// freind -> friend
// heigth -> height
// iamge -> image
// inital -> initial
// intput -> input
// laguage -> language
// lenght -> length
// levle -> level
// libary -> library
// :moeny -> money
// mysefl -> myself
// ouptut -> output
// ouput -> output
// probaly -> probably
// probelm -> problem
// recrod -> record
// reponse -> response
// reprot -> report
// singel -> single
// stregth -> strength
// strengh -> strength
// tkaes -> takes
// therfore -> therefore
// todya -> today
// toghether -> together
// unkown -> unknown
// unqiue -> unique
// widht -> width
// aberation -> aberration
// accross -> across
// adviced -> advised
// aledge -> allege
// alledge -> allege
// amature -> amateur
// anomolous -> anomalous
// anomoly -> anomaly
// aparent -> apparent
// aparrent -> apparent
// apparant -> apparent
// apparrent -> apparent
// asthetic -> aesthetic
// auxilary -> auxiliary
// auxillary -> auxiliary
// auxilliary -> auxiliary
// bankrupcy -> bankruptcy
// busness -> business
// bussiness -> business
// calander -> calendar
// commitee -> committee
// comittee -> committee
// competance -> competence
// competant -> competent
// concensus -> consensus
// cognizent -> cognizant
// copywrite: -> copyright
// choosen -> chosen
// collegue -> colleague
// excercise -> exercise
// :grammer -> grammar
// :guage -> gauge
// govement -> government
// govenment -> government
// goverment -> government
// governmnet -> government
// govorment -> government
// govornment -> government
// guaratee -> guarantee
// garantee -> guarantee
// gaurantee -> guarantee
// heirarchy -> hierarchy
// hygeine -> hygiene
// hypocracy -> hypocrisy
// hypocrasy -> hypocrisy
// hypocricy -> hypocrisy
// hypocrit: -> hypocrite
// looses: -> loses
// maintence -> maintenance
// morgage -> mortgage
// neccesary -> necessary
// necesary -> necessary
// pallete -> palette
// paralel -> parallel
// parralel -> parallel
// parrallel -> parallel
// priviledge -> privilege
// probablly -> probably
// prominant -> prominent
// propogate -> propagate
// proove -> prove
// psuedo -> pseudo
// reciept -> receipt
// receiev -> receiv
// reciev -> receiv
// recepient -> recipient
// recipiant -> recipient
// relevent -> relevant
// repitition -> repetition
// safty -> safety
// saftey -> safety
// seperat -> separat
// spectogram -> spectrogram
// symetric -> symmetric
// tolerence -> tolerance
// cacheing -> caching
// complier -> compiler
// doulbe -> double
// dyanmic -> dynamic
// excecut -> execut
// failse -> false
// fales -> false
// fasle -> false
// flase -> false
// indeces -> indices
// indecies -> indices
// indicies -> indices
// interator -> iterator
// looup -> lookup
// namesapce -> namespace
// namespcae -> namespace
// nulltpr -> nullptr
// operaotr -> operator
// overide -> override
// ovveride -> override
// poitner -> pointer
// :rference -> reference
// referece -> reference
// singed -> signed
// stirng -> string
// strign -> string
// swithc -> switch
// swtich -> switch
// teamplate -> template
// tempalte -> template
// :ture -> true
// retrun -> return
// retun -> return
// reutrn -> return
// cosnt -> const
// virutal -> virtual
// vitual -> virtual
// yeild -> yield
// :alot: -> a lot
// :andteh -> and the
// :andthe -> and the
// :asthe -> as the
// :atthe -> at the
// abouta -> about a
// aboutit -> about it
// aboutthe -> about the
// :tothe -> to the
// didnot -> did not
// fromthe -> from the
// :agred -> agreed
// :ajust -> adjust
// :anual -> annual
// :asign -> assign
// :aslo: -> also
// :casue -> cause
// :choses -> chooses
// :gaurd -> guard
// :haev -> have
// :hapen -> happen
// :idaes -> ideas
// :jsut: -> just
// :jstu: -> just
// :knwo -> know
// :konw -> know
// :kwno -> know
// :ocuntry -> country
// :ocur -> occur
// :socre -> score
// :szie -> size
// :the:the: -> the
// :turth -> truth
// :uesd: -> used
// :usally -> usually
// abilties -> abilities
// abilty -> ability
// abvove -> above
// accesories -> accessories
// accomodate -> accommodate
// acommodate -> accommodate
// acomplish -> accomplish
// actualy -> actually
// acurate -> accurate
// acutally -> actually
// addtion -> addition
// againnst -> against
// aganist -> against
// aggreed -> agreed
// agianst -> against
// ahppn -> happen
// allign -> align
// anytying -> anything
// aquire -> acquire
// availabe -> available
// availaible -> available
// availalbe -> available
// availble -> available
// availiable -> available
// avalable -> available
// avaliable -> available
// avilable -> available
// bandwith -> bandwidth
// begginer -> beginner
// beleif -> belief
// beleive -> believe
// belive -> believe
// breif -> brief
// burried -> buried
// caluclate -> calculate
// caluculate -> calculate
// calulate -> calculate
// catagory -> category
// cauhgt -> caught
// ceratin -> certain
// certian -> certain
// cheif -> chief
// cieling -> ceiling
// circut -> circuit
// clasic -> classic
// cmoputer -> computer
// coform -> conform
// comming: -> coming
// considerd -> considered
// dervied -> derived
// desicion -> decision
// diferent -> different
// diferrent -> different
// differnt -> different
// diffrent -> different
// divison -> division
// effecient -> efficient
// eligable -> eligible
// elpased -> elapsed
// embarass -> embarrass
// embeded -> embedded
// encypt -> encrypt
// finaly -> finally
// foriegn -> foreign
// foward -> forward
// fraciton -> fraction
// fucntion -> function
// fufill -> fulfill
// fullfill -> fulfill
// futher -> further
// ganerate -> generate
// generaly -> generally
// greatful -> grateful
// heigher -> higher
// higest -> highest
// howver -> however
// hydogen -> hydrogen
// importamt -> important
// inclued -> include
// insted -> instead
// intrest -> interest
// invliad -> invalid
// largst -> largest
// learnign -> learning
// liasion -> liaison
// likly -> likely
// lisense -> license
// listner -> listener
// macthing -> matching
// manefist -> manifest
// mesage -> message
// naturual -> natural
// occassion -> occasion
// occured -> occurred
// particualr -> particular
// paticular -> particular
// peice -> piece
// perhasp -> perhaps
// perheaps -> perhaps
// perhpas -> perhaps
// perphas -> perhaps
// persue -> pursue
// posess -> possess
// postion -> position
// preiod -> period
// primarly -> primarily
// privte -> private
// proccess -> process
// proeprty -> property
// propery -> property
// realtion -> relation
// reasearch -> research
// recuring -> recurring
// refered -> referred
// regluar -> regular
// releated -> related
// resutl -> result
// reuslt -> result
// reveiw -> review
// satisifed -> satisfied
// scheduel -> schedule
// sequnce -> sequence
// similiar -> similar
// simmilar -> similar
// slighly -> slightly
// somehwat -> somewhat
// statment -> statement
// sucess -> success
// succsess -> success
// sugest -> suggest
// sumary -> summary
// supress -> suppress
// surpress -> suppress
// thresold -> threshold
// tongiht -> tonight
// tranpose -> transpose
// typcial -> typical
// udpate -> update
// ususally -> usually
// verticies -> vertices
// whereever -> wherever
// wherre -> where
// wierd -> weird
#define AUTOCORRECT_MIN_LENGTH 5 // "abotu"
#define AUTOCORRECT_MAX_LENGTH 10 // "auxilliary"
#define DICTIONARY_SIZE 5967
static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = {
0x6C, 0x43, 0x00, 0x04, 0xD4, 0x00, 0x06, 0xEC, 0x00, 0x07, 0x64, 0x01, 0x08, 0x0F, 0x03, 0x09,
0xA9, 0x08, 0x0A, 0xCC, 0x08, 0x0B, 0x44, 0x09, 0x0C, 0xF6, 0x09, 0x0E, 0x00, 0x0A, 0x0F, 0x1C,
0x0A, 0x10, 0x4F, 0x0B, 0x11, 0x81, 0x0B, 0x12, 0xAF, 0x0D, 0x13, 0xE3, 0x0D, 0x15, 0xFD, 0x0D,
0x16, 0xC2, 0x0F, 0x17, 0x79, 0x11, 0x18, 0xC9, 0x14, 0x19, 0xD2, 0x14, 0x1A, 0x08, 0x15, 0x1C,
0x22, 0x15, 0x00, 0x47, 0x59, 0x00, 0x08, 0x63, 0x00, 0x0A, 0x82, 0x00, 0x12, 0x8E, 0x00, 0x16,
0x98, 0x00, 0x17, 0xA3, 0x00, 0x18, 0xCA, 0x00, 0x00, 0x16, 0x08, 0x18, 0x2C, 0x00, 0x83, 0x73,
0x65, 0x64, 0x00, 0x4B, 0x6A, 0x00, 0x17, 0x73, 0x00, 0x00, 0x17, 0x2C, 0x08, 0x0B, 0x17, 0x2C,
0x00, 0x84, 0x00, 0x0C, 0x15, 0x1A, 0x1C, 0x13, 0x12, 0x06, 0x00, 0x85, 0x72, 0x69, 0x67, 0x68,
0x74, 0x00, 0x11, 0x0C, 0x10, 0x10, 0x12, 0x06, 0x00, 0x84, 0x69, 0x6E, 0x67, 0x00, 0x0F, 0x16,
0x04, 0x2C, 0x00, 0x83, 0x6C, 0x73, 0x6F, 0x00, 0x08, 0x16, 0x12, 0x12, 0x0F, 0x00, 0x84, 0x73,
0x65, 0x73, 0x00, 0x4C, 0xAD, 0x00, 0x12, 0xB7, 0x00, 0x18, 0xC1, 0x00, 0x00, 0x15, 0x06, 0x12,
0x13, 0x1C, 0x0B, 0x00, 0x80, 0x65, 0x00, 0x0F, 0x04, 0x2C, 0x00, 0x83, 0x20, 0x6C, 0x6F, 0x74,
0x00, 0x16, 0x0D, 0x2C, 0x00, 0x83, 0x75, 0x73, 0x74, 0x00, 0x17, 0x16, 0x0D, 0x2C, 0x00, 0x83,
0x75, 0x73, 0x74, 0x00, 0x57, 0xDB, 0x00, 0x1C, 0xE4, 0x00, 0x00, 0x18, 0x12, 0x05, 0x04, 0x00,
0x80, 0x20, 0x61, 0x00, 0x07, 0x12, 0x17, 0x00, 0x81, 0x61, 0x79, 0x00, 0x4B, 0xF6, 0x00, 0x0C,
0x1C, 0x01, 0x0E, 0x5C, 0x01, 0x00, 0x4C, 0xFD, 0x00, 0x17, 0x14, 0x01, 0x00, 0x4B, 0x04, 0x01,
0x1A, 0x0A, 0x01, 0x00, 0x1A, 0x00, 0x81, 0x63, 0x68, 0x00, 0x0B, 0x2C, 0x00, 0x84, 0x77, 0x68,
0x69, 0x63, 0x68, 0x00, 0x0C, 0x1A, 0x16, 0x00, 0x81, 0x63, 0x68, 0x00, 0x50, 0x29, 0x01, 0x15,
0x35, 0x01, 0x16, 0x43, 0x01, 0x17, 0x4C, 0x01, 0x00, 0x11, 0x04, 0x1C, 0x07, 0x00, 0x84, 0x6E,
0x61, 0x6D, 0x69, 0x63, 0x00, 0x17, 0x08, 0x10, 0x1C, 0x16, 0x00, 0x84, 0x6D, 0x65, 0x74, 0x72,
0x69, 0x63, 0x00, 0x04, 0x0F, 0x06, 0x00, 0x81, 0x73, 0x69, 0x63, 0x00, 0x08, 0x0B, 0x17, 0x16,
0x04, 0x00, 0x86, 0x65, 0x73, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x00, 0x08, 0x0B, 0x06, 0x00,
0x81, 0x63, 0x6B, 0x00, 0x44, 0x7A, 0x01, 0x08, 0x86, 0x01, 0x0F, 0x54, 0x02, 0x11, 0x7C, 0x02,
0x12, 0xB4, 0x02, 0x15, 0xCF, 0x02, 0x18, 0x07, 0x03, 0x00, 0x0C, 0x0F, 0x19, 0x11, 0x0C, 0x00,
0x83, 0x61, 0x6C, 0x69, 0x64, 0x00, 0x46, 0xA8, 0x01, 0x07, 0xB2, 0x01, 0x08, 0xBC, 0x01, 0x09,
0xC7, 0x01, 0x0A, 0xD4, 0x01, 0x0C, 0xDE, 0x01, 0x13, 0xF8, 0x01, 0x15, 0x03, 0x02, 0x16, 0x26,
0x02, 0x17, 0x32, 0x02, 0x18, 0x4B, 0x02, 0x00, 0x0C, 0x19, 0x07, 0x04, 0x00, 0x82, 0x73, 0x65,
0x64, 0x00, 0x08, 0x05, 0x10, 0x08, 0x00, 0x81, 0x64, 0x65, 0x64, 0x00, 0x15, 0x0A, 0x0A, 0x04,
0x00, 0x84, 0x72, 0x65, 0x65, 0x64, 0x00, 0x0C, 0x16, 0x0C, 0x17, 0x04, 0x16, 0x00, 0x83, 0x66,
0x69, 0x65, 0x64, 0x00, 0x11, 0x0C, 0x16, 0x00, 0x83, 0x67, 0x6E, 0x65, 0x64, 0x00, 0x55, 0xE5,
0x01, 0x19, 0xEE, 0x01, 0x00, 0x15, 0x18, 0x05, 0x00, 0x83, 0x69, 0x65, 0x64, 0x00, 0x15, 0x08,
0x07, 0x00, 0x83, 0x69, 0x76, 0x65, 0x64, 0x00, 0x16, 0x04, 0x0F, 0x08, 0x00, 0x83, 0x70, 0x73,
0x65, 0x64, 0x00, 0x48, 0x0D, 0x02, 0x0A, 0x16, 0x02, 0x18, 0x1D, 0x02, 0x00, 0x09, 0x08, 0x15,
0x00, 0x81, 0x72, 0x65, 0x64, 0x00, 0x04, 0x2C, 0x00, 0x80, 0x65, 0x64, 0x00, 0x06, 0x06, 0x12,
0x00, 0x81, 0x72, 0x65, 0x64, 0x00, 0x04, 0x13, 0x0F, 0x08, 0x00, 0x84, 0x61, 0x70, 0x73, 0x65,
0x64, 0x00, 0x44, 0x39, 0x02, 0x16, 0x44, 0x02, 0x00, 0x08, 0x0F, 0x08, 0x15, 0x00, 0x84, 0x61,
0x74, 0x65, 0x64, 0x00, 0x11, 0x0C, 0x00, 0x80, 0x61, 0x64, 0x00, 0x0F, 0x06, 0x11, 0x0C, 0x00,
0x81, 0x64, 0x65, 0x00, 0x4C, 0x5B, 0x02, 0x12, 0x70, 0x02, 0x00, 0x08, 0x00, 0x49, 0x64, 0x02,
0x1C, 0x6A, 0x02, 0x00, 0x83, 0x69, 0x65, 0x6C, 0x64, 0x00, 0x83, 0x69, 0x65, 0x6C, 0x64, 0x00,
0x16, 0x08, 0x15, 0x0B, 0x17, 0x00, 0x82, 0x68, 0x6F, 0x6C, 0x64, 0x00, 0x48, 0x86, 0x02, 0x0C,
0x91, 0x02, 0x18, 0x9B, 0x02, 0x00, 0x15, 0x0C, 0x09, 0x00, 0x84, 0x72, 0x69, 0x65, 0x6E, 0x64,
0x00, 0x08, 0x15, 0x09, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x64, 0x00, 0x52, 0xA2, 0x02, 0x15, 0xAC,
0x02, 0x00, 0x15, 0x15, 0x04, 0x00, 0x84, 0x6F, 0x75, 0x6E, 0x64, 0x00, 0x04, 0x00, 0x82, 0x6F,
0x75, 0x6E, 0x64, 0x00, 0x4C, 0xBB, 0x02, 0x15, 0xC6, 0x02, 0x00, 0x08, 0x15, 0x13, 0x00, 0x84,
0x65, 0x72, 0x69, 0x6F, 0x64, 0x00, 0x06, 0x08, 0x15, 0x00, 0x82, 0x6F, 0x72, 0x64, 0x00, 0x44,
0xD9, 0x02, 0x08, 0xE4, 0x02, 0x18, 0xFD, 0x02, 0x00, 0x1A, 0x12, 0x09, 0x00, 0x83, 0x72, 0x77,
0x61, 0x72, 0x64, 0x00, 0x47, 0xEB, 0x02, 0x0C, 0xF5, 0x02, 0x00, 0x0C, 0x16, 0x11, 0x12, 0x06,
0x00, 0x80, 0x65, 0x64, 0x00, 0x1A, 0x00, 0x83, 0x65, 0x69, 0x72, 0x64, 0x00, 0x04, 0x0A, 0x2C,
0x00, 0x83, 0x75, 0x61, 0x72, 0x64, 0x00, 0x12, 0x15, 0x04, 0x00, 0x80, 0x6E, 0x64, 0x00, 0x44,
0x43, 0x03, 0x05, 0x50, 0x03, 0x06, 0x7B, 0x03, 0x07, 0xFB, 0x03, 0x08, 0x17, 0x04, 0x0A, 0x6B,
0x04, 0x0B, 0xE3, 0x04, 0x0C, 0x34, 0x05, 0x0F, 0x3D, 0x05, 0x11, 0x00, 0x06, 0x12, 0x1B, 0x06,
0x13, 0x25, 0x06, 0x15, 0x2F, 0x06, 0x16, 0x9C, 0x06, 0x17, 0x52, 0x07, 0x18, 0x2D, 0x08, 0x19,
0x73, 0x08, 0x00, 0x06, 0x13, 0x16, 0x08, 0x10, 0x04, 0x11, 0x00, 0x82, 0x61, 0x63, 0x65, 0x00,
0x44, 0x57, 0x03, 0x0F, 0x61, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x80, 0x6C, 0x65,
0x00, 0x44, 0x68, 0x03, 0x18, 0x73, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x82, 0x62,
0x6C, 0x65, 0x00, 0x12, 0x07, 0x00, 0x82, 0x62, 0x6C, 0x65, 0x00, 0x48, 0x88, 0x03, 0x0C, 0x93,
0x03, 0x11, 0x9C, 0x03, 0x13, 0xEE, 0x03, 0x00, 0x15, 0x08, 0x09, 0x08, 0x15, 0x00, 0x81, 0x6E,
0x63, 0x65, 0x00, 0x08, 0x13, 0x00, 0x83, 0x69, 0x65, 0x63, 0x65, 0x00, 0x44, 0xA6, 0x03, 0x08,
0xB3, 0x03, 0x18, 0xE4, 0x03, 0x00, 0x17, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x65, 0x6E,
0x63, 0x65, 0x00, 0x55, 0xBA, 0x03, 0x17, 0xD9, 0x03, 0x00, 0x08, 0x00, 0x49, 0xC3, 0x03, 0x0F,
0xD0, 0x03, 0x00, 0x15, 0x2C, 0x00, 0x86, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x00,
0x12, 0x17, 0x00, 0x83, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x11, 0x0C, 0x04, 0x10, 0x00, 0x81, 0x61,
0x6E, 0x63, 0x65, 0x00, 0x14, 0x08, 0x16, 0x00, 0x82, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x04, 0x16,
0x08, 0x10, 0x04, 0x11, 0x00, 0x83, 0x70, 0x61, 0x63, 0x65, 0x00, 0x0C, 0x15, 0x08, 0x19, 0x00,
0x52, 0x07, 0x04, 0x19, 0x0D, 0x04, 0x00, 0x82, 0x72, 0x69, 0x64, 0x65, 0x00, 0x12, 0x00, 0x85,
0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x00, 0x17, 0x00, 0x44, 0x26, 0x04, 0x0C, 0x31, 0x04, 0x11,
0x3B, 0x04, 0x17, 0x5E, 0x04, 0x00, 0x15, 0x04, 0x18, 0x0A, 0x00, 0x82, 0x6E, 0x74, 0x65, 0x65,
0x00, 0x10, 0x10, 0x12, 0x06, 0x00, 0x81, 0x74, 0x65, 0x65, 0x00, 0x04, 0x15, 0x00, 0x44, 0x45,
0x04, 0x18, 0x51, 0x04, 0x00, 0x0A, 0x00, 0x86, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, 0x65, 0x65,
0x00, 0x04, 0x0A, 0x00, 0x87, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, 0x65, 0x65, 0x00, 0x0C, 0x10,
0x12, 0x06, 0x00, 0x84, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x65, 0x00, 0x44, 0x75, 0x04, 0x07, 0xB8,
0x04, 0x10, 0xDA, 0x04, 0x00, 0x4A, 0x82, 0x04, 0x11, 0x8D, 0x04, 0x16, 0x96, 0x04, 0x18, 0x9F,
0x04, 0x00, 0x15, 0x12, 0x10, 0x00, 0x83, 0x74, 0x67, 0x61, 0x67, 0x65, 0x00, 0x0B, 0x06, 0x00,
0x83, 0x61, 0x6E, 0x67, 0x65, 0x00, 0x08, 0x10, 0x00, 0x82, 0x73, 0x61, 0x67, 0x65, 0x00, 0x0A,
0x00, 0x6C, 0xA8, 0x04, 0x04, 0xAE, 0x04, 0x00, 0x83, 0x61, 0x75, 0x67, 0x65, 0x00, 0x0F, 0x00,
0x84, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x44, 0xC5, 0x04, 0x0C, 0xCB,
0x04, 0x0F, 0xD4, 0x04, 0x00, 0x83, 0x6C, 0x65, 0x67, 0x65, 0x00, 0x19, 0x0C, 0x15, 0x13, 0x00,
0x82, 0x67, 0x65, 0x00, 0x04, 0x00, 0x82, 0x67, 0x65, 0x00, 0x04, 0x0C, 0x00, 0x83, 0x6D, 0x61,
0x67, 0x65, 0x00, 0x17, 0x00, 0x47, 0xF5, 0x04, 0x10, 0xFF, 0x04, 0x12, 0x09, 0x05, 0x16, 0x12,
0x05, 0x17, 0x1B, 0x05, 0x00, 0x11, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12,
0x15, 0x09, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68,
0x65, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x44, 0x22, 0x05, 0x18, 0x2A,
0x05, 0x00, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12, 0x05, 0x04, 0x00, 0x82, 0x20,
0x74, 0x68, 0x65, 0x00, 0x1D, 0x16, 0x2C, 0x00, 0x82, 0x69, 0x7A, 0x65, 0x00, 0x45, 0x4D, 0x05,
0x0C, 0xBE, 0x05, 0x13, 0xC9, 0x05, 0x16, 0xF1, 0x05, 0x19, 0xF9, 0x05, 0x00, 0x44, 0x57, 0x05,
0x0C, 0xA7, 0x05, 0x0F, 0xB3, 0x05, 0x00, 0x4A, 0x61, 0x05, 0x0C, 0x6B, 0x05, 0x0F, 0x89, 0x05,
0x00, 0x0C, 0x0F, 0x08, 0x00, 0x83, 0x69, 0x62, 0x6C, 0x65, 0x00, 0x0F, 0x00, 0x44, 0x74, 0x05,
0x0C, 0x7F, 0x05, 0x00, 0x19, 0x04, 0x00, 0x85, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04,
0x19, 0x04, 0x00, 0x84, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x44, 0x90, 0x05, 0x0C, 0x9B, 0x05, 0x00,
0x19, 0x04, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x19, 0x04, 0x00, 0x85, 0x61,
0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x83, 0x62,
0x6C, 0x65, 0x00, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x82, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x1A, 0x0B,
0x2C, 0x00, 0x84, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x00, 0x44, 0xD3, 0x05, 0x08, 0xDC, 0x05, 0x12,
0xE6, 0x05, 0x00, 0x08, 0x13, 0x00, 0x83, 0x6F, 0x70, 0x6C, 0x65, 0x00, 0x12, 0x13, 0x00, 0x84,
0x65, 0x6F, 0x70, 0x6C, 0x65, 0x00, 0x08, 0x12, 0x13, 0x00, 0x85, 0x65, 0x6F, 0x70, 0x6C, 0x65,
0x00, 0x04, 0x09, 0x00, 0x82, 0x6C, 0x73, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x00,
0x46, 0x07, 0x06, 0x0C, 0x10, 0x06, 0x00, 0x0C, 0x16, 0x2C, 0x00, 0x82, 0x6E, 0x63, 0x65, 0x00,
0x08, 0x0A, 0x1C, 0x0B, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x65, 0x00, 0x16, 0x0B, 0x17, 0x2C, 0x00,
0x82, 0x6F, 0x73, 0x65, 0x00, 0x0F, 0x12, 0x08, 0x13, 0x00, 0x82, 0x70, 0x6C, 0x65, 0x00, 0x46,
0x42, 0x06, 0x08, 0x4C, 0x06, 0x0C, 0x57, 0x06, 0x12, 0x63, 0x06, 0x15, 0x7F, 0x06, 0x18, 0x86,
0x06, 0x00, 0x12, 0x16, 0x2C, 0x00, 0x83, 0x63, 0x6F, 0x72, 0x65, 0x00, 0x17, 0x0B, 0x2C, 0x00,
0x84, 0x74, 0x68, 0x65, 0x72, 0x65, 0x00, 0x18, 0x14, 0x04, 0x00, 0x84, 0x63, 0x71, 0x75, 0x69,
0x72, 0x65, 0x00, 0x47, 0x6A, 0x06, 0x09, 0x73, 0x06, 0x00, 0x08, 0x05, 0x00, 0x83, 0x66, 0x6F,
0x72, 0x65, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x00, 0x83, 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x08,
0x0B, 0x1A, 0x00, 0x81, 0x65, 0x00, 0x17, 0x00, 0x6C, 0x8F, 0x06, 0x04, 0x94, 0x06, 0x00, 0x82,
0x72, 0x75, 0x65, 0x00, 0x10, 0x04, 0x00, 0x82, 0x65, 0x75, 0x72, 0x00, 0x44, 0xB2, 0x06, 0x08,
0xCB, 0x06, 0x0C, 0xD3, 0x06, 0x0F, 0xE2, 0x06, 0x11, 0xEB, 0x06, 0x12, 0x09, 0x07, 0x18, 0x16,
0x07, 0x00, 0x4F, 0xB9, 0x06, 0x18, 0xC1, 0x06, 0x00, 0x09, 0x00, 0x83, 0x61, 0x6C, 0x73, 0x65,
0x00, 0x06, 0x08, 0x05, 0x00, 0x83, 0x61, 0x75, 0x73, 0x65, 0x00, 0x08, 0x0B, 0x17, 0x00, 0x82,
0x73, 0x65, 0x00, 0x06, 0x15, 0x08, 0x06, 0x1B, 0x08, 0x00, 0x86, 0x65, 0x72, 0x63, 0x69, 0x73,
0x65, 0x00, 0x0C, 0x04, 0x09, 0x00, 0x83, 0x6C, 0x73, 0x65, 0x00, 0x48, 0xF2, 0x06, 0x12, 0xFD,
0x06, 0x00, 0x16, 0x0C, 0x0F, 0x00, 0x84, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x00, 0x13, 0x08, 0x15,
0x00, 0x84, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x00, 0x13, 0x11, 0x04, 0x15, 0x17, 0x00, 0x83,
0x73, 0x70, 0x6F, 0x73, 0x65, 0x00, 0x44, 0x20, 0x07, 0x06, 0x3D, 0x07, 0x12, 0x48, 0x07, 0x00,
0x46, 0x27, 0x07, 0x08, 0x31, 0x07, 0x00, 0x06, 0x08, 0x05, 0x00, 0x84, 0x61, 0x75, 0x73, 0x65,
0x00, 0x06, 0x04, 0x05, 0x00, 0x86, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, 0x04, 0x08, 0x05,
0x00, 0x84, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, 0x06, 0x08, 0x05, 0x00, 0x83, 0x61, 0x75, 0x73,
0x65, 0x00, 0x44, 0x5F, 0x07, 0x08, 0x0D, 0x08, 0x0F, 0x18, 0x08, 0x19, 0x24, 0x08, 0x00, 0x47,
0x6F, 0x07, 0x0A, 0x94, 0x07, 0x0F, 0xA1, 0x07, 0x13, 0xE4, 0x07, 0x15, 0xEE, 0x07, 0x00, 0x12,
0x10, 0x00, 0x50, 0x79, 0x07, 0x12, 0x88, 0x07, 0x00, 0x12, 0x06, 0x04, 0x00, 0x87, 0x63, 0x6F,
0x6D, 0x6D, 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x06, 0x06, 0x04, 0x00, 0x84, 0x6D, 0x6F, 0x64,
0x61, 0x74, 0x65, 0x00, 0x12, 0x13, 0x12, 0x15, 0x13, 0x00, 0x84, 0x61, 0x67, 0x61, 0x74, 0x65,
0x00, 0x46, 0xAB, 0x07, 0x13, 0xB8, 0x07, 0x18, 0xC5, 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00,
0x85, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x10, 0x04, 0x08, 0x17, 0x00, 0x86, 0x6D, 0x70,
0x6C, 0x61, 0x74, 0x65, 0x00, 0x46, 0xCC, 0x07, 0x0F, 0xD9, 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06,
0x00, 0x86, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x04, 0x06, 0x00, 0x84, 0x63, 0x75, 0x6C,
0x61, 0x74, 0x65, 0x00, 0x07, 0x18, 0x00, 0x84, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, 0x48, 0xF5,
0x07, 0x18, 0x02, 0x08, 0x00, 0x11, 0x04, 0x0A, 0x00, 0x86, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74,
0x65, 0x00, 0x06, 0x04, 0x00, 0x84, 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0F, 0x0F, 0x04,
0x13, 0x00, 0x83, 0x65, 0x74, 0x74, 0x65, 0x00, 0x04, 0x13, 0x10, 0x08, 0x17, 0x00, 0x83, 0x6C,
0x61, 0x74, 0x65, 0x00, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x61, 0x74, 0x65, 0x00, 0x4A, 0x37, 0x08,
0x0C, 0x43, 0x08, 0x16, 0x4D, 0x08, 0x00, 0x08, 0x0F, 0x0F, 0x12, 0x06, 0x00, 0x82, 0x61, 0x67,
0x75, 0x65, 0x00, 0x14, 0x11, 0x18, 0x00, 0x83, 0x69, 0x71, 0x75, 0x65, 0x00, 0x44, 0x54, 0x08,
0x15, 0x69, 0x08, 0x00, 0x06, 0x00, 0x6C, 0x5D, 0x08, 0x08, 0x62, 0x08, 0x00, 0x82, 0x75, 0x73,
0x65, 0x00, 0x05, 0x00, 0x82, 0x75, 0x73, 0x65, 0x00, 0x08, 0x13, 0x00, 0x84, 0x75, 0x72, 0x73,
0x75, 0x65, 0x00, 0x4C, 0x7A, 0x08, 0x12, 0x93, 0x08, 0x00, 0x48, 0x81, 0x08, 0x0F, 0x8B, 0x08,
0x00, 0x0F, 0x08, 0x05, 0x00, 0x83, 0x69, 0x65, 0x76, 0x65, 0x00, 0x08, 0x05, 0x00, 0x81, 0x65,
0x76, 0x65, 0x00, 0x52, 0x9A, 0x08, 0x19, 0xA1, 0x08, 0x00, 0x15, 0x13, 0x00, 0x82, 0x76, 0x65,
0x00, 0x05, 0x04, 0x00, 0x83, 0x6F, 0x76, 0x65, 0x00, 0x0C, 0x08, 0x00, 0x4B, 0xB6, 0x08, 0x0F,
0xBD, 0x08, 0x15, 0xC5, 0x08, 0x00, 0x06, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x08, 0x05, 0x00,
0x82, 0x69, 0x65, 0x66, 0x00, 0x05, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x4C, 0xD3, 0x08, 0x11,
0xDD, 0x08, 0x00, 0x11, 0x12, 0x0A, 0x2C, 0x00, 0x82, 0x69, 0x6E, 0x67, 0x00, 0x4C, 0xE4, 0x08,
0x15, 0x3A, 0x09, 0x00, 0x48, 0xF4, 0x08, 0x0B, 0x0B, 0x09, 0x0F, 0x18, 0x09, 0x15, 0x24, 0x09,
0x1C, 0x2F, 0x09, 0x00, 0x48, 0xFB, 0x08, 0x0B, 0x02, 0x09, 0x00, 0x05, 0x00, 0x83, 0x69, 0x6E,
0x67, 0x00, 0x06, 0x04, 0x06, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x06, 0x04, 0x10, 0x00,
0x85, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x08, 0x0C, 0x06, 0x00, 0x85, 0x65, 0x69, 0x6C,
0x69, 0x6E, 0x67, 0x00, 0x18, 0x06, 0x08, 0x15, 0x00, 0x82, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x17,
0x1C, 0x11, 0x04, 0x00, 0x83, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x0C, 0x17, 0x16, 0x00, 0x83, 0x72,
0x69, 0x6E, 0x67, 0x00, 0x46, 0x57, 0x09, 0x08, 0x8E, 0x09, 0x0A, 0x9A, 0x09, 0x0C, 0xA4, 0x09,
0x16, 0xAD, 0x09, 0x17, 0xBF, 0x09, 0x00, 0x4B, 0x64, 0x09, 0x0C, 0x6D, 0x09, 0x0F, 0x77, 0x09,
0x15, 0x7F, 0x09, 0x00, 0x0C, 0x1A, 0x00, 0x83, 0x68, 0x69, 0x63, 0x68, 0x00, 0x17, 0x1A, 0x16,
0x00, 0x83, 0x69, 0x74, 0x63, 0x68, 0x00, 0x0B, 0x1A, 0x00, 0x82, 0x69, 0x63, 0x68, 0x00, 0x04,
0x08, 0x16, 0x04, 0x08, 0x15, 0x00, 0x86, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x00, 0x17, 0x07,
0x11, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x11, 0x08, 0x15, 0x17, 0x16, 0x00,
0x80, 0x74, 0x68, 0x00, 0x06, 0x0B, 0x1A, 0x00, 0x82, 0x69, 0x63, 0x68, 0x00, 0x0C, 0x0F, 0x13,
0x10, 0x12, 0x06, 0x04, 0x00, 0x86, 0x63, 0x6F, 0x6D, 0x70, 0x6C, 0x69, 0x73, 0x68, 0x00, 0x4A,
0xC9, 0x09, 0x0C, 0xE1, 0x09, 0x15, 0xEC, 0x09, 0x00, 0x48, 0xD0, 0x09, 0x0C, 0xDA, 0x09, 0x00,
0x15, 0x17, 0x16, 0x00, 0x82, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x08, 0x0B, 0x00, 0x81, 0x68, 0x74,
0x00, 0x1A, 0x07, 0x11, 0x04, 0x05, 0x00, 0x81, 0x64, 0x74, 0x68, 0x00, 0x18, 0x17, 0x2C, 0x00,
0x83, 0x72, 0x75, 0x74, 0x68, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x2C, 0x00, 0x81, 0x69, 0x72, 0x00,
0x11, 0x00, 0x4C, 0x09, 0x0A, 0x18, 0x14, 0x0A, 0x00, 0x17, 0x0B, 0x2C, 0x00, 0x84, 0x74, 0x68,
0x69, 0x6E, 0x6B, 0x00, 0x0C, 0x0B, 0x17, 0x00, 0x82, 0x6E, 0x6B, 0x00, 0x44, 0x32, 0x0A, 0x07,
0x86, 0x0A, 0x08, 0xB1, 0x0A, 0x09, 0x11, 0x0B, 0x0F, 0x1A, 0x0B, 0x17, 0x37, 0x0B, 0x18, 0x40,
0x0B, 0x00, 0x4C, 0x3C, 0x0A, 0x17, 0x47, 0x0A, 0x18, 0x60, 0x0A, 0x00, 0x06, 0x13, 0x1C, 0x17,
0x00, 0x83, 0x69, 0x63, 0x61, 0x6C, 0x00, 0x4C, 0x4E, 0x0A, 0x18, 0x56, 0x0A, 0x00, 0x11, 0x0C,
0x00, 0x81, 0x69, 0x61, 0x6C, 0x00, 0x15, 0x0C, 0x19, 0x00, 0x83, 0x74, 0x75, 0x61, 0x6C, 0x00,
0x51, 0x6A, 0x0A, 0x15, 0x73, 0x0A, 0x17, 0x7C, 0x0A, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x6E, 0x75,
0x61, 0x6C, 0x00, 0x18, 0x17, 0x04, 0x11, 0x00, 0x82, 0x61, 0x6C, 0x00, 0x0C, 0x19, 0x00, 0x83,
0x72, 0x74, 0x75, 0x61, 0x6C, 0x00, 0x18, 0x00, 0x52, 0x8F, 0x0A, 0x1A, 0xA7, 0x0A, 0x00, 0x46,
0x99, 0x0A, 0x0B, 0x9D, 0x0A, 0x1A, 0xA3, 0x0A, 0x00, 0x81, 0x6C, 0x64, 0x00, 0x16, 0x00, 0x81,
0x6C, 0x64, 0x00, 0x81, 0x6C, 0x64, 0x00, 0x12, 0x2C, 0x00, 0x84, 0x77, 0x6F, 0x75, 0x6C, 0x64,
0x00, 0x4A, 0xC1, 0x0A, 0x0F, 0xC9, 0x0A, 0x13, 0xF7, 0x0A, 0x17, 0xFF, 0x0A, 0x18, 0x07, 0x0B,
0x00, 0x11, 0x0C, 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x44, 0xD0, 0x0A, 0x0F, 0xEA, 0x0A, 0x00,
0x15, 0x00, 0x44, 0xD9, 0x0A, 0x15, 0xE0, 0x0A, 0x00, 0x13, 0x00, 0x81, 0x6C, 0x65, 0x6C, 0x00,
0x04, 0x13, 0x00, 0x84, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x15, 0x15, 0x04, 0x13, 0x00,
0x85, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x12, 0x08, 0x13, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x17,
0x0C, 0x0F, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x07, 0x08, 0x0B, 0x06, 0x16, 0x00, 0x81, 0x6C, 0x65,
0x00, 0x08, 0x16, 0x1C, 0x10, 0x00, 0x81, 0x6C, 0x66, 0x00, 0x0C, 0x09, 0x00, 0x4F, 0x24, 0x0B,
0x18, 0x2E, 0x0B, 0x00, 0x0F, 0x18, 0x09, 0x00, 0x84, 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x09, 0x00,
0x83, 0x6C, 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x18, 0x16, 0x08, 0x15, 0x00, 0x81, 0x6C, 0x74, 0x00,
0x09, 0x17, 0x04, 0x08, 0x15, 0x0A, 0x00, 0x85, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6C, 0x00, 0x44,
0x59, 0x0B, 0x0F, 0x6A, 0x0B, 0x15, 0x75, 0x0B, 0x00, 0x15, 0x0A, 0x12, 0x17, 0x06, 0x08, 0x13,
0x16, 0x00, 0x84, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0x08, 0x05, 0x12, 0x15, 0x13, 0x00,
0x82, 0x6C, 0x65, 0x6D, 0x00, 0x12, 0x09, 0x12, 0x06, 0x00, 0x83, 0x6E, 0x66, 0x6F, 0x72, 0x6D,
0x00, 0x44, 0xA6, 0x0B, 0x07, 0xCE, 0x0B, 0x08, 0xD7, 0x0B, 0x0A, 0x3A, 0x0C, 0x0C, 0x8D, 0x0C,
0x0E, 0x99, 0x0C, 0x12, 0xC0, 0x0C, 0x13, 0x6C, 0x0D, 0x15, 0x78, 0x0D, 0x16, 0x83, 0x0D, 0x18,
0x8D, 0x0D, 0x1A, 0xA4, 0x0D, 0x00, 0x0C, 0x00, 0x4A, 0xAF, 0x0B, 0x17, 0xB7, 0x0B, 0x00, 0x04,
0x2C, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x51, 0xBE, 0x0B, 0x15, 0xC6, 0x0B, 0x00, 0x12, 0x06,
0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x08, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x18, 0x12,
0x09, 0x2C, 0x00, 0x81, 0x6E, 0x64, 0x00, 0x47, 0xE7, 0x0B, 0x08, 0xF1, 0x0B, 0x0A, 0x1B, 0x0C,
0x13, 0x27, 0x0C, 0x16, 0x30, 0x0C, 0x00, 0x0F, 0x0C, 0x0B, 0x06, 0x00, 0x81, 0x72, 0x65, 0x6E,
0x00, 0x57, 0xF8, 0x0B, 0x1A, 0x11, 0x0C, 0x00, 0x48, 0xFF, 0x0B, 0x1A, 0x07, 0x0C, 0x00, 0x05,
0x00, 0x82, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, 0x00, 0x84, 0x74, 0x77, 0x65, 0x65, 0x6E,
0x00, 0x08, 0x05, 0x00, 0x83, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x12, 0x07, 0x1C, 0x0B, 0x00,
0x83, 0x72, 0x6F, 0x67, 0x65, 0x6E, 0x00, 0x04, 0x0B, 0x2C, 0x00, 0x81, 0x70, 0x65, 0x6E, 0x00,
0x12, 0x12, 0x0B, 0x06, 0x00, 0x83, 0x73, 0x65, 0x6E, 0x00, 0x48, 0x41, 0x0C, 0x0C, 0x4C, 0x0C,
0x00, 0x0C, 0x15, 0x12, 0x09, 0x00, 0x83, 0x65, 0x69, 0x67, 0x6E, 0x00, 0x4B, 0x5F, 0x0C, 0x0F,
0x65, 0x0C, 0x11, 0x6D, 0x0C, 0x12, 0x76, 0x0C, 0x15, 0x7D, 0x0C, 0x16, 0x84, 0x0C, 0x00, 0x17,
0x00, 0x81, 0x6E, 0x67, 0x00, 0x0F, 0x04, 0x00, 0x83, 0x69, 0x67, 0x6E, 0x00, 0x15, 0x04, 0x08,
0x0F, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x0A, 0x2C, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x17, 0x16, 0x00,
0x81, 0x6E, 0x67, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x73, 0x69, 0x67, 0x6E, 0x00, 0x17, 0x04, 0x15,
0x08, 0x06, 0x00, 0x83, 0x74, 0x61, 0x69, 0x6E, 0x00, 0x4B, 0xA0, 0x0C, 0x0C, 0xA9, 0x0C, 0x00,
0x0C, 0x17, 0x00, 0x83, 0x68, 0x69, 0x6E, 0x6B, 0x00, 0x4B, 0xB0, 0x0C, 0x17, 0xB6, 0x0C, 0x00,
0x17, 0x00, 0x81, 0x6E, 0x6B, 0x00, 0x0B, 0x2C, 0x00, 0x84, 0x74, 0x68, 0x69, 0x6E, 0x6B, 0x00,
0x4C, 0xCA, 0x0C, 0x16, 0x56, 0x0D, 0x17, 0x60, 0x0D, 0x00, 0x46, 0xD4, 0x0C, 0x16, 0xE1, 0x0C,
0x17, 0xFB, 0x0C, 0x00, 0x0C, 0x16, 0x08, 0x07, 0x00, 0x85, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E,
0x00, 0x44, 0xE8, 0x0C, 0x16, 0xF1, 0x0C, 0x00, 0x0C, 0x0F, 0x00, 0x83, 0x69, 0x73, 0x6F, 0x6E,
0x00, 0x04, 0x06, 0x06, 0x12, 0x00, 0x83, 0x69, 0x6F, 0x6E, 0x00, 0x44, 0x0E, 0x0D, 0x07, 0x1B,
0x0D, 0x0C, 0x25, 0x0D, 0x0F, 0x34, 0x0D, 0x11, 0x40, 0x0D, 0x16, 0x4C, 0x0D, 0x00, 0x15, 0x08,
0x05, 0x04, 0x00, 0x84, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x07, 0x04, 0x00, 0x83, 0x69,
0x74, 0x69, 0x6F, 0x6E, 0x00, 0x17, 0x0C, 0x13, 0x08, 0x15, 0x00, 0x86, 0x65, 0x74, 0x69, 0x74,
0x69, 0x6F, 0x6E, 0x00, 0x04, 0x08, 0x15, 0x00, 0x85, 0x6C, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x00,
0x06, 0x18, 0x09, 0x00, 0x85, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x12, 0x13, 0x00, 0x83,
0x69, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x0C, 0x19, 0x0C, 0x07, 0x00, 0x81, 0x69, 0x6F, 0x6E, 0x00,
0x0C, 0x06, 0x04, 0x15, 0x09, 0x00, 0x83, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x13, 0x0B, 0x04, 0x00,
0x84, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6E, 0x00, 0x17, 0x18, 0x08, 0x15, 0x00, 0x83, 0x74, 0x75,
0x72, 0x6E, 0x00, 0x0A, 0x0C, 0x0B, 0x17, 0x00, 0x82, 0x6E, 0x67, 0x73, 0x00, 0x55, 0x94, 0x0D,
0x17, 0x9D, 0x0D, 0x00, 0x17, 0x08, 0x15, 0x00, 0x82, 0x75, 0x72, 0x6E, 0x00, 0x08, 0x15, 0x00,
0x80, 0x72, 0x6E, 0x00, 0x12, 0x0E, 0x11, 0x18, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x6E, 0x00, 0x47,
0xB9, 0x0D, 0x11, 0xC4, 0x0D, 0x1A, 0xCD, 0x0D, 0x00, 0x08, 0x18, 0x16, 0x13, 0x00, 0x83, 0x65,
0x75, 0x64, 0x6F, 0x00, 0x1A, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x00, 0x4F, 0xD4, 0x0D,
0x11, 0xDC, 0x0D, 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6F, 0x77, 0x00, 0x0E, 0x2C, 0x00, 0x81,
0x6F, 0x77, 0x00, 0x56, 0xEA, 0x0D, 0x18, 0xF4, 0x0D, 0x00, 0x04, 0x0B, 0x15, 0x08, 0x13, 0x00,
0x81, 0x70, 0x73, 0x00, 0x12, 0x12, 0x0F, 0x00, 0x81, 0x6B, 0x75, 0x70, 0x00, 0x44, 0x1C, 0x0E,
0x08, 0x5D, 0x0E, 0x0B, 0x67, 0x0F, 0x0F, 0x71, 0x0F, 0x12, 0x7F, 0x0F, 0x13, 0x90, 0x0F, 0x16,
0x9B, 0x0F, 0x17, 0xA4, 0x0F, 0x18, 0xB0, 0x0F, 0x1C, 0xB9, 0x0F, 0x00, 0x4C, 0x26, 0x0E, 0x0F,
0x30, 0x0E, 0x18, 0x52, 0x0E, 0x00, 0x0F, 0x0C, 0x10, 0x0C, 0x16, 0x00, 0x82, 0x61, 0x72, 0x00,
0x4C, 0x37, 0x0E, 0x18, 0x42, 0x0E, 0x00, 0x10, 0x10, 0x0C, 0x16, 0x00, 0x84, 0x69, 0x6C, 0x61,
0x72, 0x00, 0x06, 0x0C, 0x17, 0x04, 0x13, 0x00, 0x86, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6C, 0x61,
0x72, 0x00, 0x0F, 0x0A, 0x08, 0x15, 0x00, 0x83, 0x75, 0x6C, 0x61, 0x72, 0x00, 0x44, 0x7C, 0x0E,
0x07, 0x84, 0x0E, 0x0B, 0x91, 0x0E, 0x0C, 0xCB, 0x0E, 0x0F, 0xE5, 0x0E, 0x10, 0xEF, 0x0E, 0x11,
0xF9, 0x0E, 0x12, 0x25, 0x0F, 0x17, 0x2D, 0x0F, 0x19, 0x4C, 0x0F, 0x00, 0x0F, 0x06, 0x00, 0x82,
0x65, 0x61, 0x72, 0x00, 0x11, 0x04, 0x0F, 0x04, 0x06, 0x00, 0x84, 0x65, 0x6E, 0x64, 0x61, 0x72,
0x00, 0x4A, 0x98, 0x0E, 0x17, 0xA3, 0x0E, 0x00, 0x0C, 0x08, 0x0B, 0x00, 0x85, 0x69, 0x67, 0x68,
0x65, 0x72, 0x00, 0x48, 0xAD, 0x0E, 0x0F, 0xB9, 0x0E, 0x18, 0xC2, 0x0E, 0x00, 0x0B, 0x0A, 0x12,
0x17, 0x00, 0x85, 0x65, 0x74, 0x68, 0x65, 0x72, 0x00, 0x12, 0x2C, 0x00, 0x84, 0x74, 0x68, 0x65,
0x72, 0x00, 0x09, 0x00, 0x83, 0x72, 0x74, 0x68, 0x65, 0x72, 0x00, 0x4B, 0xD2, 0x0E, 0x0F, 0xDA,
0x0E, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x65, 0x69, 0x72, 0x00, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83,
0x69, 0x6C, 0x65, 0x72, 0x00, 0x17, 0x0C, 0x09, 0x00, 0x83, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x10,
0x04, 0x15, 0x0A, 0x2C, 0x00, 0x81, 0x61, 0x72, 0x00, 0x4C, 0x00, 0x0F, 0x17, 0x0C, 0x0F, 0x00,
0x0A, 0x0A, 0x08, 0x05, 0x00, 0x84, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x00, 0x4C, 0x13, 0x0F, 0x16,
0x1C, 0x0F, 0x00, 0x12, 0x13, 0x00, 0x83, 0x6E, 0x74, 0x65, 0x72, 0x00, 0x0C, 0x0F, 0x00, 0x82,
0x65, 0x6E, 0x65, 0x72, 0x00, 0x09, 0x08, 0x05, 0x00, 0x81, 0x72, 0x65, 0x00, 0x4B, 0x34, 0x0F,
0x18, 0x3E, 0x0F, 0x00, 0x12, 0x11, 0x04, 0x00, 0x83, 0x74, 0x68, 0x65, 0x72, 0x00, 0x13, 0x12,
0x10, 0x06, 0x00, 0x86, 0x6F, 0x6D, 0x70, 0x75, 0x74, 0x65, 0x72, 0x00, 0x48, 0x53, 0x0F, 0x1A,
0x5E, 0x0F, 0x00, 0x08, 0x15, 0x08, 0x0B, 0x1A, 0x00, 0x83, 0x76, 0x65, 0x72, 0x00, 0x12, 0x0B,
0x00, 0x82, 0x65, 0x76, 0x65, 0x72, 0x00, 0x08, 0x17, 0x12, 0x2C, 0x00, 0x82, 0x68, 0x65, 0x72,
0x00, 0x04, 0x18, 0x06, 0x0C, 0x17, 0x15, 0x04, 0x13, 0x00, 0x82, 0x6C, 0x61, 0x72, 0x00, 0x17,
0x04, 0x15, 0x08, 0x17, 0x11, 0x0C, 0x00, 0x87, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x00,
0x17, 0x0F, 0x0F, 0x18, 0x11, 0x00, 0x82, 0x70, 0x74, 0x72, 0x00, 0x04, 0x08, 0x1C, 0x2C, 0x00,
0x81, 0x72, 0x73, 0x00, 0x12, 0x04, 0x15, 0x08, 0x13, 0x12, 0x00, 0x82, 0x74, 0x6F, 0x72, 0x00,
0x06, 0x12, 0x2C, 0x00, 0x81, 0x63, 0x75, 0x72, 0x00, 0x08, 0x19, 0x08, 0x2C, 0x00, 0x81, 0x72,
0x79, 0x00, 0x44, 0xDB, 0x0F, 0x08, 0x03, 0x10, 0x0A, 0x93, 0x10, 0x13, 0x9E, 0x10, 0x15, 0xAA,
0x10, 0x16, 0xB5, 0x10, 0x17, 0x4D, 0x11, 0x18, 0x55, 0x11, 0x00, 0x4B, 0xE5, 0x0F, 0x13, 0xF0,
0x0F, 0x1C, 0xFA, 0x0F, 0x00, 0x13, 0x15, 0x08, 0x13, 0x00, 0x83, 0x68, 0x61, 0x70, 0x73, 0x00,
0x0B, 0x15, 0x08, 0x13, 0x00, 0x82, 0x61, 0x70, 0x73, 0x00, 0x1A, 0x0F, 0x04, 0x00, 0x82, 0x61,
0x79, 0x73, 0x00, 0x44, 0x13, 0x10, 0x06, 0x2A, 0x10, 0x0C, 0x35, 0x10, 0x0F, 0x81, 0x10, 0x16,
0x88, 0x10, 0x00, 0x47, 0x1A, 0x10, 0x0E, 0x22, 0x10, 0x00, 0x0C, 0x2C, 0x00, 0x82, 0x65, 0x61,
0x73, 0x00, 0x17, 0x00, 0x83, 0x61, 0x6B, 0x65, 0x73, 0x00, 0x08, 0x07, 0x11, 0x0C, 0x00, 0x83,
0x69, 0x63, 0x65, 0x73, 0x00, 0x46, 0x3F, 0x10, 0x15, 0x66, 0x10, 0x17, 0x75, 0x10, 0x00, 0x48,
0x46, 0x10, 0x0C, 0x50, 0x10, 0x00, 0x07, 0x11, 0x0C, 0x00, 0x84, 0x69, 0x63, 0x65, 0x73, 0x00,
0x47, 0x57, 0x10, 0x17, 0x5E, 0x10, 0x00, 0x11, 0x0C, 0x00, 0x82, 0x65, 0x73, 0x00, 0x15, 0x08,
0x19, 0x00, 0x82, 0x65, 0x73, 0x00, 0x12, 0x16, 0x08, 0x06, 0x06, 0x04, 0x00, 0x84, 0x73, 0x6F,
0x72, 0x69, 0x65, 0x73, 0x00, 0x0F, 0x0C, 0x05, 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x65, 0x73,
0x00, 0x04, 0x09, 0x00, 0x81, 0x73, 0x65, 0x00, 0x12, 0x0B, 0x06, 0x2C, 0x00, 0x82, 0x6F, 0x73,
0x65, 0x73, 0x00, 0x0C, 0x11, 0x0B, 0x17, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x73, 0x00, 0x04, 0x08,
0x0B, 0x15, 0x08, 0x13, 0x00, 0x83, 0x61, 0x70, 0x73, 0x00, 0x08, 0x04, 0x1C, 0x2C, 0x00, 0x83,
0x65, 0x61, 0x72, 0x73, 0x00, 0x44, 0xBF, 0x10, 0x08, 0xCB, 0x10, 0x12, 0x42, 0x11, 0x00, 0x15,
0x04, 0x05, 0x10, 0x08, 0x00, 0x82, 0x72, 0x61, 0x73, 0x73, 0x00, 0x46, 0xD8, 0x10, 0x11, 0xF0,
0x10, 0x15, 0x0D, 0x11, 0x16, 0x2A, 0x11, 0x00, 0x46, 0xDF, 0x10, 0x18, 0xE8, 0x10, 0x00, 0x12,
0x15, 0x13, 0x00, 0x83, 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x82, 0x63, 0x65, 0x73, 0x73, 0x00,
0x4C, 0xF7, 0x10, 0x16, 0x03, 0x11, 0x00, 0x16, 0x16, 0x18, 0x05, 0x00, 0x85, 0x69, 0x6E, 0x65,
0x73, 0x73, 0x00, 0x18, 0x05, 0x00, 0x83, 0x69, 0x6E, 0x65, 0x73, 0x73, 0x00, 0x13, 0x00, 0x55,
0x16, 0x11, 0x18, 0x21, 0x11, 0x00, 0x18, 0x16, 0x00, 0x85, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73,
0x00, 0x16, 0x00, 0x83, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0x31, 0x11, 0x12, 0x3A, 0x11,
0x00, 0x06, 0x18, 0x16, 0x00, 0x83, 0x65, 0x73, 0x73, 0x00, 0x13, 0x00, 0x82, 0x73, 0x65, 0x73,
0x73, 0x00, 0x15, 0x06, 0x06, 0x04, 0x00, 0x84, 0x72, 0x6F, 0x73, 0x73, 0x00, 0x15, 0x0C, 0x09,
0x00, 0x81, 0x73, 0x74, 0x00, 0x52, 0x5C, 0x11, 0x16, 0x6A, 0x11, 0x00, 0x0F, 0x12, 0x10, 0x12,
0x11, 0x04, 0x00, 0x84, 0x61, 0x6C, 0x6F, 0x75, 0x73, 0x00, 0x11, 0x08, 0x06, 0x11, 0x12, 0x06,
0x00, 0x85, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x00, 0x44, 0x9E, 0x11, 0x08, 0xBC, 0x11, 0x0A,
0xD9, 0x11, 0x0B, 0xE3, 0x11, 0x0C, 0x19, 0x12, 0x0F, 0x24, 0x12, 0x10, 0x2F, 0x12, 0x11, 0x3B,
0x12, 0x12, 0x97, 0x13, 0x13, 0xBD, 0x13, 0x16, 0xD9, 0x13, 0x18, 0x6B, 0x14, 0x00, 0x55, 0xA5,
0x11, 0x1A, 0xB0, 0x11, 0x00, 0x08, 0x13, 0x08, 0x16, 0x00, 0x83, 0x61, 0x72, 0x61, 0x74, 0x00,
0x0B, 0x08, 0x10, 0x12, 0x16, 0x00, 0x83, 0x77, 0x68, 0x61, 0x74, 0x00, 0x44, 0xC3, 0x11, 0x11,
0xCC, 0x11, 0x00, 0x15, 0x0A, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x74, 0x00, 0x10, 0x11, 0x15, 0x08,
0x19, 0x12, 0x0A, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0B, 0x18, 0x04, 0x06, 0x00, 0x82, 0x67,
0x68, 0x74, 0x00, 0x47, 0xED, 0x11, 0x0A, 0xF4, 0x11, 0x0C, 0x0E, 0x12, 0x00, 0x0C, 0x1A, 0x00,
0x81, 0x74, 0x68, 0x00, 0x51, 0xFB, 0x11, 0x18, 0x02, 0x12, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x74,
0x68, 0x00, 0x12, 0x15, 0x0B, 0x17, 0x00, 0x85, 0x6F, 0x75, 0x67, 0x68, 0x74, 0x00, 0x0A, 0x11,
0x12, 0x17, 0x00, 0x83, 0x69, 0x67, 0x68, 0x74, 0x00, 0x17, 0x18, 0x12, 0x05, 0x04, 0x00, 0x81,
0x20, 0x69, 0x74, 0x00, 0x16, 0x18, 0x08, 0x15, 0x00, 0x83, 0x73, 0x75, 0x6C, 0x74, 0x00, 0x04,
0x17, 0x15, 0x12, 0x13, 0x10, 0x0C, 0x00, 0x81, 0x6E, 0x74, 0x00, 0x44, 0x48, 0x12, 0x08, 0x80,
0x12, 0x15, 0x84, 0x13, 0x16, 0x8F, 0x13, 0x00, 0x4C, 0x55, 0x12, 0x11, 0x60, 0x12, 0x15, 0x6B,
0x12, 0x17, 0x75, 0x12, 0x00, 0x13, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00,
0x0C, 0x10, 0x12, 0x15, 0x13, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x13, 0x13, 0x04, 0x00,
0x82, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00,
0x4C, 0x90, 0x12, 0x10, 0xB1, 0x12, 0x15, 0x15, 0x13, 0x19, 0x6F, 0x13, 0x1D, 0x79, 0x13, 0x00,
0x46, 0x97, 0x12, 0x13, 0xA4, 0x12, 0x00, 0x08, 0x09, 0x09, 0x08, 0x00, 0x85, 0x69, 0x63, 0x69,
0x65, 0x6E, 0x74, 0x00, 0x08, 0x06, 0x08, 0x15, 0x00, 0x85, 0x69, 0x70, 0x69, 0x65, 0x6E, 0x74,
0x00, 0x48, 0xBE, 0x12, 0x11, 0xCA, 0x12, 0x15, 0xEB, 0x12, 0x17, 0x0A, 0x13, 0x00, 0x19, 0x12,
0x0A, 0x00, 0x83, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0xD1, 0x12, 0x15, 0xDD, 0x12,
0x00, 0x19, 0x12, 0x0A, 0x00, 0x84, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x12, 0x19, 0x12,
0x0A, 0x00, 0x86, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0xF2, 0x12, 0x12, 0xFD,
0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x19, 0x12, 0x0A,
0x00, 0x85, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x17, 0x16, 0x00, 0x83, 0x65,
0x6D, 0x65, 0x6E, 0x74, 0x00, 0x44, 0x22, 0x13, 0x08, 0x2D, 0x13, 0x09, 0x39, 0x13, 0x15, 0x44,
0x13, 0x00, 0x13, 0x04, 0x00, 0x84, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07,
0x00, 0x84, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x83, 0x65, 0x72,
0x65, 0x6E, 0x74, 0x00, 0x44, 0x4B, 0x13, 0x08, 0x63, 0x13, 0x00, 0x13, 0x00, 0x44, 0x54, 0x13,
0x13, 0x5C, 0x13, 0x00, 0x85, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x00, 0x83, 0x65,
0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x85, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x08,
0x0F, 0x08, 0x15, 0x00, 0x82, 0x61, 0x6E, 0x74, 0x00, 0x0C, 0x11, 0x0A, 0x12, 0x06, 0x00, 0x82,
0x61, 0x6E, 0x74, 0x00, 0x08, 0x09, 0x09, 0x0C, 0x07, 0x00, 0x81, 0x65, 0x6E, 0x74, 0x00, 0x12,
0x06, 0x00, 0x82, 0x6E, 0x73, 0x74, 0x00, 0x51, 0xA1, 0x13, 0x15, 0xAB, 0x13, 0x16, 0xB4, 0x13,
0x00, 0x07, 0x0C, 0x07, 0x00, 0x82, 0x20, 0x6E, 0x6F, 0x74, 0x00, 0x13, 0x08, 0x15, 0x00, 0x82,
0x6F, 0x72, 0x74, 0x00, 0x10, 0x0F, 0x04, 0x00, 0x82, 0x6F, 0x73, 0x74, 0x00, 0x48, 0xC4, 0x13,
0x1C, 0xCF, 0x13, 0x00, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x83, 0x65, 0x69, 0x70, 0x74, 0x00, 0x06,
0x11, 0x08, 0x00, 0x82, 0x72, 0x79, 0x70, 0x74, 0x00, 0x48, 0xEC, 0x13, 0x0A, 0x15, 0x14, 0x0C,
0x1E, 0x14, 0x10, 0x3B, 0x14, 0x11, 0x45, 0x14, 0x18, 0x60, 0x14, 0x00, 0x4A, 0xF3, 0x13, 0x15,
0x0A, 0x14, 0x00, 0x4C, 0xFA, 0x13, 0x18, 0x02, 0x14, 0x00, 0x0B, 0x00, 0x82, 0x68, 0x65, 0x73,
0x74, 0x00, 0x16, 0x00, 0x82, 0x67, 0x65, 0x73, 0x74, 0x00, 0x17, 0x11, 0x0C, 0x00, 0x83, 0x65,
0x72, 0x65, 0x73, 0x74, 0x00, 0x15, 0x04, 0x0F, 0x00, 0x81, 0x65, 0x73, 0x74, 0x00, 0x49, 0x25,
0x14, 0x11, 0x31, 0x14, 0x00, 0x08, 0x11, 0x04, 0x10, 0x00, 0x84, 0x69, 0x66, 0x65, 0x73, 0x74,
0x00, 0x04, 0x0A, 0x04, 0x00, 0x83, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x12, 0x0F, 0x04, 0x00, 0x83,
0x6D, 0x6F, 0x73, 0x74, 0x00, 0x44, 0x4C, 0x14, 0x11, 0x57, 0x14, 0x00, 0x0C, 0x0A, 0x04, 0x00,
0x84, 0x61, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x0C, 0x04, 0x0A, 0x04, 0x00, 0x82, 0x73, 0x74, 0x00,
0x0D, 0x04, 0x2C, 0x00, 0x83, 0x64, 0x6A, 0x75, 0x73, 0x74, 0x00, 0x46, 0x78, 0x14, 0x12, 0x90,
0x14, 0x13, 0xA8, 0x14, 0x17, 0xBF, 0x14, 0x00, 0x48, 0x7F, 0x14, 0x15, 0x89, 0x14, 0x00, 0x06,
0x1B, 0x08, 0x00, 0x84, 0x65, 0x63, 0x75, 0x74, 0x00, 0x0C, 0x06, 0x00, 0x80, 0x69, 0x74, 0x00,
0x44, 0x97, 0x14, 0x05, 0xA0, 0x14, 0x00, 0x05, 0x00, 0x84, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x00,
0x05, 0x04, 0x00, 0x83, 0x6F, 0x75, 0x74, 0x00, 0x57, 0xAF, 0x14, 0x18, 0xB7, 0x14, 0x00, 0x11,
0x0C, 0x00, 0x83, 0x70, 0x75, 0x74, 0x00, 0x12, 0x00, 0x82, 0x74, 0x70, 0x75, 0x74, 0x00, 0x13,
0x18, 0x12, 0x00, 0x83, 0x74, 0x70, 0x75, 0x74, 0x00, 0x17, 0x12, 0x05, 0x04, 0x00, 0x81, 0x75,
0x74, 0x00, 0x48, 0xD9, 0x14, 0x0C, 0xFD, 0x14, 0x00, 0x44, 0xE0, 0x14, 0x0C, 0xE7, 0x14, 0x00,
0x0B, 0x2C, 0x00, 0x81, 0x76, 0x65, 0x00, 0x46, 0xEE, 0x14, 0x08, 0xF6, 0x14, 0x00, 0x08, 0x15,
0x00, 0x82, 0x65, 0x69, 0x76, 0x00, 0x06, 0x08, 0x15, 0x00, 0x81, 0x76, 0x00, 0x08, 0x0B, 0x06,
0x04, 0x2C, 0x00, 0x82, 0x69, 0x65, 0x76, 0x00, 0x4C, 0x0F, 0x15, 0x11, 0x19, 0x15, 0x00, 0x08,
0x19, 0x08, 0x15, 0x00, 0x82, 0x69, 0x65, 0x77, 0x00, 0x12, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F,
0x77, 0x00, 0x46, 0x3B, 0x15, 0x08, 0x76, 0x15, 0x0B, 0x80, 0x15, 0x0F, 0x92, 0x15, 0x11, 0x57,
0x16, 0x15, 0x72, 0x16, 0x16, 0x0C, 0x17, 0x17, 0x27, 0x17, 0x00, 0x44, 0x48, 0x15, 0x08, 0x54,
0x15, 0x0C, 0x5F, 0x15, 0x13, 0x6A, 0x15, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82,
0x69, 0x73, 0x79, 0x00, 0x18, 0x14, 0x08, 0x15, 0x09, 0x00, 0x81, 0x6E, 0x63, 0x79, 0x00, 0x15,
0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x81, 0x73, 0x79, 0x00, 0x18, 0x15, 0x0E, 0x11, 0x04, 0x05,
0x00, 0x81, 0x74, 0x63, 0x79, 0x00, 0x17, 0x09, 0x04, 0x16, 0x00, 0x82, 0x65, 0x74, 0x79, 0x00,
0x06, 0x15, 0x04, 0x15, 0x0C, 0x08, 0x0B, 0x00, 0x87, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68,
0x79, 0x00, 0x44, 0xA5, 0x15, 0x0B, 0xE8, 0x15, 0x0E, 0xF2, 0x15, 0x0F, 0xFA, 0x15, 0x12, 0x42,
0x16, 0x15, 0x4C, 0x16, 0x00, 0x45, 0xB8, 0x15, 0x08, 0xC1, 0x15, 0x0F, 0xC7, 0x15, 0x11, 0xD0,
0x15, 0x15, 0xD7, 0x15, 0x18, 0xE0, 0x15, 0x00, 0x12, 0x15, 0x13, 0x00, 0x81, 0x62, 0x6C, 0x79,
0x00, 0x15, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x15, 0x00, 0x83, 0x61, 0x6C, 0x6C, 0x79, 0x00,
0x0C, 0x09, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x11, 0x08, 0x0A, 0x00, 0x80, 0x6C, 0x79, 0x00,
0x17, 0x06, 0x04, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x0A, 0x0C, 0x0F, 0x16, 0x00, 0x81, 0x74, 0x6C,
0x79, 0x00, 0x0C, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x79, 0x00, 0x44, 0x04, 0x16, 0x05, 0x2F, 0x16,
0x08, 0x38, 0x16, 0x00, 0x56, 0x0B, 0x16, 0x17, 0x23, 0x16, 0x00, 0x18, 0x00, 0x6C, 0x14, 0x16,
0x16, 0x1B, 0x16, 0x00, 0x83, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x00, 0x84, 0x61, 0x6C,
0x6C, 0x79, 0x00, 0x18, 0x06, 0x04, 0x00, 0x85, 0x74, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x04,
0x05, 0x12, 0x15, 0x13, 0x00, 0x81, 0x79, 0x00, 0x04, 0x15, 0x00, 0x84, 0x65, 0x61, 0x6C, 0x6C,
0x79, 0x00, 0x10, 0x12, 0x11, 0x04, 0x00, 0x82, 0x61, 0x6C, 0x79, 0x00, 0x04, 0x10, 0x0C, 0x15,
0x13, 0x00, 0x81, 0x69, 0x6C, 0x79, 0x00, 0x48, 0x5E, 0x16, 0x13, 0x67, 0x16, 0x00, 0x12, 0x10,
0x2C, 0x00, 0x82, 0x6E, 0x65, 0x79, 0x00, 0x04, 0x10, 0x12, 0x06, 0x00, 0x83, 0x70, 0x61, 0x6E,
0x79, 0x00, 0x44, 0x7F, 0x16, 0x08, 0xE7, 0x16, 0x12, 0xF0, 0x16, 0x17, 0xFD, 0x16, 0x00, 0x45,
0x8F, 0x16, 0x0C, 0x98, 0x16, 0x0F, 0xA5, 0x16, 0x10, 0xC1, 0x16, 0x16, 0xCA, 0x16, 0x00, 0x0C,
0x0F, 0x00, 0x82, 0x72, 0x61, 0x72, 0x79, 0x00, 0x0F, 0x0F, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x84,
0x69, 0x61, 0x72, 0x79, 0x00, 0x4C, 0xAC, 0x16, 0x0F, 0xB6, 0x16, 0x00, 0x1B, 0x18, 0x04, 0x00,
0x82, 0x69, 0x61, 0x72, 0x79, 0x00, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x83, 0x69, 0x61, 0x72, 0x79,
0x00, 0x18, 0x16, 0x00, 0x82, 0x6D, 0x61, 0x72, 0x79, 0x00, 0x08, 0x06, 0x00, 0x46, 0xD4, 0x16,
0x08, 0xDF, 0x16, 0x00, 0x08, 0x11, 0x00, 0x85, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x00, 0x11,
0x00, 0x82, 0x73, 0x61, 0x72, 0x79, 0x00, 0x13, 0x12, 0x15, 0x13, 0x00, 0x80, 0x74, 0x79, 0x00,
0x0A, 0x04, 0x17, 0x04, 0x06, 0x00, 0x84, 0x65, 0x67, 0x6F, 0x72, 0x79, 0x00, 0x11, 0x18, 0x06,
0x12, 0x2C, 0x00, 0x86, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x72, 0x79, 0x00, 0x04, 0x00, 0x55, 0x15,
0x17, 0x1A, 0x20, 0x17, 0x00, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, 0x79, 0x00,
0x0F, 0x04, 0x00, 0x81, 0x79, 0x73, 0x00, 0x49, 0x31, 0x17, 0x0F, 0x39, 0x17, 0x15, 0x42, 0x17,
0x00, 0x04, 0x16, 0x00, 0x81, 0x65, 0x74, 0x79, 0x00, 0x0C, 0x05, 0x04, 0x00, 0x81, 0x69, 0x74,
0x79, 0x00, 0x13, 0x08, 0x12, 0x15, 0x13, 0x00, 0x84, 0x70, 0x65, 0x72, 0x74, 0x79, 0x00
};

View file

@ -0,0 +1,474 @@
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# This is a larger example typo dictionary containing 400 entries. It builds to
# a table of about 6000 bytes, so you'll need a keyboard with a generous
# amount of free firmware space to use the full dictionary. Alternatively, pick
# out a subset of entries to a separate file, then build a table from that.
#
# Dictionary syntax:
# Each line of this file defines one typo correction entry with the syntax
# "typo -> correction". Typos and corrections are case insensitive, and any
# whitespace before or after the typo and correction is ignored. The typo must be
# only the letters a-z, or the special character : representing a word break.
#
# For documentation about how to use this dictionary, see
# https://getreuer.info/posts/keyboards/autocorrection
#
# Further resources:
# * Wikipedia has a large list of common typos at
# https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
#
# * EmacsWiki has another list of typos at
# https://www.emacswiki.org/emacs/autocorrection_abbrev_defs
#
# * You can find data on English word frequencies at
# https://www.wordfrequency.info/samples.asp
## 10 most common words.
# The words "there", "about", "their", "would", "people", "which", "could",
# "think", "other", and "because" are among the most common words in English
# that are 5 letters or longer. (We don't include entries for words shorter than
# that to avoid false triggering.)
:htere -> there
abbout -> about
abotu -> about
baout -> about
:theri -> their
:thier -> their
:owudl -> would
woudl -> would
peaple -> people
peolpe -> people
peopel -> people
poeple -> people
poeople -> people
:hwihc -> which
whcih -> which
whihc -> which
whlch -> which
wihch -> which
coudl -> could
:htikn -> think
:htink -> think
thikn -> think
thiunk -> think
tihkn -> think
:olther -> other
:otehr -> other
baceause -> because
beacuse -> because
becasue -> because
beccause -> because
becouse -> because
becuase -> because
## Common words, 11-20.
theese -> these
:goign -> going
:gonig -> going
:yaers -> years
:yeasr -> years
:thsoe -> those
shoudl -> should
raelly -> really
realy -> really
relaly -> really
bedore -> before
befoer -> before
littel -> little
beeing -> being
:hwile -> while
## Common words, 21-30.
aroud -> around
arround -> around
arund -> around
thign -> thing
thigsn -> things
thnigs -> things
anohter -> another
beteen -> between
beween -> between
bewteen -> between
:eveyr -> every
:graet -> great
:agian -> again
:sicne -> since
alwasy -> always
alwyas -> always
throught -> thought
## Words especially susceptible to skipping or transposing a letter.
# These entries are for words that are easy enough to spell, but not necessarily
# easy to press the keys in the right order.
# Catch misspellings of "achieves", "achieving", etc.
:acheiv -> achiev
almsot -> almost
alomst -> almost
chnage -> change
chekc -> check
childen -> children
claer -> clear
comapny -> company
contian -> contain
elasped -> elapsed
feild -> field
fitler -> filter
firts -> first
follwo -> follow
:foudn -> found
frequecy -> frequency
firend -> friend
freind -> friend
heigth -> height
iamge -> image
inital -> initial
intput -> input
laguage -> language
lenght -> length
levle -> level
libary -> library
:moeny -> money
mysefl -> myself
ouptut -> output
ouput -> output
probaly -> probably
probelm -> problem
recrod -> record
reponse -> response
reprot -> report
singel -> single
stregth -> strength
strengh -> strength
tkaes -> takes
therfore -> therefore
todya -> today
toghether -> together
unkown -> unknown
unqiue -> unique
widht -> width
## Words with tricky spelling.
# If you are a good speller, you could drop this section.
aberation -> aberration
accross -> across
adviced -> advised
aledge -> allege
alledge -> allege
amature -> amateur
anomolous -> anomalous
anomoly -> anomaly
aparent -> apparent
aparrent -> apparent
apparant -> apparent
apparrent -> apparent
asthetic -> aesthetic
auxilary -> auxiliary
auxillary -> auxiliary
auxilliary -> auxiliary
bankrupcy -> bankruptcy
busness -> business
bussiness -> business
calander -> calendar
commitee -> committee
comittee -> committee
competance -> competence
competant -> competent
concensus -> consensus
cognizent -> cognizant
copywrite: -> copyright
choosen -> chosen
collegue -> colleague
excercise -> exercise
:grammer -> grammar
:guage -> gauge
govement -> government
govenment -> government
goverment -> government
governmnet -> government
govorment -> government
govornment -> government
guaratee -> guarantee
garantee -> guarantee
gaurantee -> guarantee
heirarchy -> hierarchy
hygeine -> hygiene
hypocracy -> hypocrisy
hypocrasy -> hypocrisy
hypocricy -> hypocrisy
hypocrit: -> hypocrite
looses: -> loses
maintence -> maintenance
morgage -> mortgage
neccesary -> necessary
necesary -> necessary
pallete -> palette
paralel -> parallel
parralel -> parallel
parrallel -> parallel
priviledge -> privilege
probablly -> probably
prominant -> prominent
propogate -> propagate
proove -> prove
psuedo -> pseudo
reciept -> receipt
# Catch misspellings of "receives", "receiving", etc.
receiev -> receiv
reciev -> receiv
recepient -> recipient
recipiant -> recipient
relevent -> relevant
repitition -> repetition
safty -> safety
saftey -> safety
# Catch misspellings of "separate", "separating", etc.
seperat -> separat
spectogram -> spectrogram
symetric -> symmetric
tolerence -> tolerance
## Words particularly for coding.
# Entries for common code keywords ("const") and terminology ("lookup").
cacheing -> caching
complier -> compiler
doulbe -> double
dyanmic -> dynamic
# As in "execute", "executable", "executing", ...
excecut -> execut
failse -> false
fales -> false
fasle -> false
flase -> false
indeces -> indices
indecies -> indices
indicies -> indices
interator -> iterator
looup -> lookup
namesapce -> namespace
namespcae -> namespace
nulltpr -> nullptr
operaotr -> operator
overide -> override
ovveride -> override
poitner -> pointer
:rference -> reference
referece -> reference
singed -> signed
stirng -> string
strign -> string
swithc -> switch
swtich -> switch
teamplate -> template
tempalte -> template
:ture -> true
retrun -> return
retun -> return
reutrn -> return
cosnt -> const
virutal -> virtual
vitual -> virtual
yeild -> yield
## Catch skipped spaces between common words.
:alot: -> a lot
:andteh -> and the
:andthe -> and the
:asthe -> as the
:atthe -> at the
abouta -> about a
aboutit -> about it
aboutthe -> about the
:tothe -> to the
didnot -> did not
fromthe -> from the
## Various additional entries.
:agred -> agreed
:ajust -> adjust
:anual -> annual
:asign -> assign
:aslo: -> also
:casue -> cause
:choses -> chooses
:gaurd -> guard
:haev -> have
:hapen -> happen
:idaes -> ideas
:jsut: -> just
:jstu: -> just
:knwo -> know
:konw -> know
:kwno -> know
:ocuntry -> country
:ocur -> occur
:socre -> score
:szie -> size
:the:the: -> the
:turth -> truth
:uesd: -> used
:usally -> usually
abilties -> abilities
abilty -> ability
abvove -> above
accesories -> accessories
accomodate -> accommodate
acommodate -> accommodate
acomplish -> accomplish
actualy -> actually
acurate -> accurate
acutally -> actually
addtion -> addition
againnst -> against
aganist -> against
aggreed -> agreed
agianst -> against
ahppn -> happen
allign -> align
anytying -> anything
aquire -> acquire
availabe -> available
availaible -> available
availalbe -> available
availble -> available
availiable -> available
avalable -> available
avaliable -> available
avilable -> available
bandwith -> bandwidth
begginer -> beginner
beleif -> belief
beleive -> believe
belive -> believe
breif -> brief
burried -> buried
caluclate -> calculate
caluculate -> calculate
calulate -> calculate
catagory -> category
cauhgt -> caught
ceratin -> certain
certian -> certain
cheif -> chief
cieling -> ceiling
circut -> circuit
clasic -> classic
cmoputer -> computer
coform -> conform
comming: -> coming
considerd -> considered
dervied -> derived
desicion -> decision
diferent -> different
diferrent -> different
differnt -> different
diffrent -> different
divison -> division
effecient -> efficient
eligable -> eligible
elpased -> elapsed
embarass -> embarrass
embeded -> embedded
encypt -> encrypt
finaly -> finally
foriegn -> foreign
foward -> forward
fraciton -> fraction
fucntion -> function
fufill -> fulfill
fullfill -> fulfill
futher -> further
ganerate -> generate
generaly -> generally
greatful -> grateful
heigher -> higher
higest -> highest
howver -> however
hydogen -> hydrogen
importamt -> important
inclued -> include
insted -> instead
intrest -> interest
invliad -> invalid
largst -> largest
learnign -> learning
liasion -> liaison
likly -> likely
lisense -> license
listner -> listener
macthing -> matching
manefist -> manifest
mesage -> message
naturual -> natural
occassion -> occasion
occured -> occurred
particualr -> particular
paticular -> particular
peice -> piece
perhasp -> perhaps
perheaps -> perhaps
perhpas -> perhaps
perphas -> perhaps
persue -> pursue
posess -> possess
postion -> position
preiod -> period
primarly -> primarily
privte -> private
proccess -> process
proeprty -> property
propery -> property
realtion -> relation
reasearch -> research
recuring -> recurring
refered -> referred
regluar -> regular
releated -> related
resutl -> result
reuslt -> result
reveiw -> review
satisifed -> satisfied
scheduel -> schedule
sequnce -> sequence
similiar -> similar
simmilar -> similar
slighly -> slightly
somehwat -> somewhat
statment -> statement
sucess -> success
succsess -> success
sugest -> suggest
sumary -> summary
supress -> suppress
surpress -> suppress
thresold -> threshold
tongiht -> tonight
tranpose -> transpose
typcial -> typical
udpate -> update
ususally -> usually
verticies -> vertices
whereever -> wherever
wherre -> where
wierd -> weird

264
features/casemodes.c Normal file
View file

@ -0,0 +1,264 @@
/* Copyright 2021 Andrew Rae ajrae.nv@gmail.com @andrewjrae
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "casemodes.h"
/* The caps word concept started with me @iaap on splitkb.com discord.
* However it has been implemented and extended by many splitkb.com users:
* - @theol0403 made many improvements to initial implementation
* - @precondition used caps lock rather than shifting
* - @dnaq his own implementation which also used caps lock
* - @sevanteri added underscores on spaces
* - @metheon extended on @sevanteri's work and added specific modes for
* snake_case and SCREAMING_SNAKE_CASE
* - @baffalop came up with the idea for xcase, which he implements in his own
* repo, however this is implemented by @iaap with support also for one-shot-shift.
* - @sevanteri
* - fixed xcase waiting mode to allow more modified keys and keys from other layers.
* - Added @baffalop's separator defaulting on first keypress, with a
* configurable default separator and overrideable function to determine
* if the default should be used.
*/
#ifndef DEFAULT_XCASE_SEPARATOR
#define DEFAULT_XCASE_SEPARATOR KC_UNDS
#endif
#define IS_OSM(keycode) (keycode >= QK_ONE_SHOT_MOD && keycode <= QK_ONE_SHOT_MOD_MAX)
// bool to keep track of the caps word state
static bool caps_word_on = false;
// enum to keep track of the xcase state
static enum xcase_state xcase_state = XCASE_OFF;
// the keycode of the xcase delimiter
static uint16_t xcase_delimiter;
// the number of keys to the last delimiter
static int8_t distance_to_last_delim = -1;
// Check whether caps word is on
bool caps_word_enabled(void) {
return caps_word_on;
}
// Enable caps word
void enable_caps_word(void) {
caps_word_on = true;
#ifndef CAPSWORD_USE_SHIFT
if (!host_keyboard_led_state().caps_lock) {
tap_code(KC_CAPS);
}
#endif
}
// Disable caps word
void disable_caps_word(void) {
caps_word_on = false;
#ifndef CAPSWORD_USE_SHIFT
if (host_keyboard_led_state().caps_lock) {
tap_code(KC_CAPS);
}
#else
unregister_mods(MOD_LSFT);
#endif
}
// Toggle caps word
void toggle_caps_word(void) {
if (caps_word_on) {
disable_caps_word();
}
else {
enable_caps_word();
}
}
// Get xcase state
enum xcase_state get_xcase_state(void) {
return xcase_state;
}
// Enable xcase and pickup the next keystroke as the delimiter
void enable_xcase(void) {
xcase_state = XCASE_WAIT;
}
// Enable xcase with the specified delimiter
void enable_xcase_with(uint16_t delimiter) {
xcase_state = XCASE_ON;
xcase_delimiter = delimiter;
distance_to_last_delim = -1;
}
// Disable xcase
void disable_xcase(void) {
xcase_state = XCASE_OFF;
}
// Place the current xcase delimiter
static void place_delimiter(void) {
if (IS_OSM(xcase_delimiter)) {
// apparently set_oneshot_mods() is dumb and doesn't deal with handedness for you
uint8_t mods = xcase_delimiter & 0x10 ? (xcase_delimiter & 0x0F) << 4 : xcase_delimiter & 0xFF;
set_oneshot_mods(mods);
} else {
tap_code16(xcase_delimiter);
}
}
// Removes a delimiter, used for double tap space exit
static void remove_delimiter(void) {
if (IS_OSM(xcase_delimiter)) {
clear_oneshot_mods();
} else {
tap_code(KC_BSPC);
}
}
// overrideable function to determine whether the case mode should stop
__attribute__ ((weak))
bool terminate_case_modes(uint16_t keycode, const keyrecord_t *record) {
switch (keycode) {
// Keycodes to ignore (don't disable caps word)
case KC_A ... KC_Z:
case KC_1 ... KC_0:
case KC_MINS:
case KC_UNDS:
case KC_BSPC:
// If mod chording disable the mods
if (record->event.pressed && (get_mods() != 0)) {
return true;
}
break;
default:
if (record->event.pressed) {
return true;
}
break;
}
return false;
}
/* overrideable function to determine whether to use the default separator on
* first keypress when waiting for the separator. */
__attribute__ ((weak))
bool use_default_xcase_separator(uint16_t keycode, const keyrecord_t *record) {
// for example:
/* switch (keycode) { */
/* case KC_A ... KC_Z: */
/* case KC_1 ... KC_0: */
/* return true; */
/* } */
return false;
}
bool process_case_modes(uint16_t keycode, const keyrecord_t *record) {
if (caps_word_on || xcase_state) {
if ((QK_MOD_TAP <= keycode && keycode <= QK_MOD_TAP_MAX)
|| (QK_LAYER_TAP <= keycode && keycode <= QK_LAYER_TAP_MAX)) {
// Earlier return if this has not been considered tapped yet
if (record->tap.count == 0)
return true;
keycode = keycode & 0xFF;
}
if (keycode >= QK_LAYER_TAP && keycode <= QK_ONE_SHOT_LAYER_MAX) {
// let special keys and normal modifiers go through
return true;
}
if (xcase_state == XCASE_WAIT) {
// grab the next input to be the delimiter
if (use_default_xcase_separator(keycode, record)) {
enable_xcase_with(DEFAULT_XCASE_SEPARATOR);
}
else if (record->event.pressed) {
// factor in mods
if (get_mods() & MOD_MASK_SHIFT) {
keycode = LSFT(keycode);
}
else if (get_mods() & MOD_BIT(KC_RALT)) {
keycode = RALT(keycode);
}
enable_xcase_with(keycode);
return false;
}
else {
if (IS_OSM(keycode)) {
// this catches the OSM release if no other key was pressed
set_oneshot_mods(0);
enable_xcase_with(keycode);
return false;
}
// let other special keys go through
return true;
}
}
if (record->event.pressed) {
// handle xcase mode
if (xcase_state == XCASE_ON) {
// place the delimiter if space is tapped
if (keycode == KC_SPACE) {
if (distance_to_last_delim != 0) {
place_delimiter();
distance_to_last_delim = 0;
return false;
}
// remove the delimiter and disable modes
else {
remove_delimiter();
disable_xcase();
disable_caps_word();
return true;
}
}
// decrement distance to delimiter on back space
else if (keycode == KC_BSPC) {
--distance_to_last_delim;
}
// don't increment distance to last delim if negative
else if (distance_to_last_delim >= 0) {
// puts back a one shot delimiter if you we're back to the delimiter pos
if (distance_to_last_delim == 0 && (IS_OSM(xcase_delimiter))) {
place_delimiter();
}
++distance_to_last_delim;
}
} // end XCASE_ON
// check if the case modes have been terminated
if (terminate_case_modes(keycode, record)) {
disable_caps_word();
disable_xcase();
}
#ifdef CAPSWORD_USE_SHIFT
else if (caps_word_on && keycode >= KC_A && keycode <= KC_Z){
tap_code16(LSFT(keycode));
return false;
}
#endif
} // end if event.pressed
return true;
}
return true;
}

47
features/casemodes.h Normal file
View file

@ -0,0 +1,47 @@
/* Copyright 2021 Andrew Rae ajrae.nv@gmail.com @andrewjrae
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include QMK_KEYBOARD_H
// Check whether caps word is on
bool caps_word_enabled(void);
// Enable caps word
void enable_caps_word(void);
// Disable caps word
void disable_caps_word(void);
// Toggle caps word
void toggle_caps_word(void);
// enum for the xcase states
enum xcase_state {
XCASE_OFF = 0, // xcase is off
XCASE_ON, // xcase is actively on
XCASE_WAIT, // xcase is waiting for the delimiter input
};
// Get xcase state
enum xcase_state get_xcase_state(void);
// Enable xcase and pickup the next keystroke as the delimiter
void enable_xcase(void);
// Enable xcase with the specified delimiter
void enable_xcase_with(uint16_t delimiter);
// Disable xcase
void disable_xcase(void);
// Function to be put in process user
bool process_case_modes(uint16_t keycode, const keyrecord_t *record);